#include "LiquidCrystal.h"
#include <EEPROM.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
String text;
int cursor =0;
int point_bot =0;
int point_user=0;
String Text[] = {
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",
"M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
"Y", "Z"
};
int limit[]={40,12,2026};
int date[]={05,02,2024, 18, 30};
String output[16];
int length = sizeof(output) / sizeof(output[0]);
int length_text = sizeof(Text) / sizeof(Text[0]);
String pattern = "The text is too long";
String menu[] = {"Enter text with srial print", "Enter text by youself", "Playing in a game" ,"History of the game"};
int length_menu = sizeof(menu)/sizeof(menu[0]);
bool flag=false;
bool flag_ = true;
String new_text;
String choice[]= {"Yes","Menu"};
int distance_choice[] ={1,9};
int distance[] = {1,7,14};
String player[] = {"R", "P", "S"};
int lasstatus = HIGH;
int laststate = HIGH;
String instruction[] = {
"Welcome to RPS!",
"You vs. the Bot",
"Choose Rock,",
"Paper or Scissors",
"Rock beats Scissors",
"Scissors beats Paper",
"Paper beats Rock",
"First to 3 wins!",
"Good luck!",
"Press on the switch to ",
"begine the game"
};
int length_guide= sizeof(instruction)/sizeof(instruction[0]);
int select=0;
void Changing( int cursor, int cursor_ =0, int start = 0){
lcd.clear();
delay(1000);
while(true){
int button = digitalRead(9);
int click = digitalRead(A2);
if(button != lasstatus){
lasstatus = button;
if (digitalRead(8) == LOW && button == HIGH) {
cursor_--;
lcd.clear();
}
if (digitalRead(8) == LOW && button == LOW) {
cursor_++;
lcd.clear();
}
}
if(cursor_ <0 || cursor_ >= length_text){
cursor_=0;
}
if(cursor_ >= 15){
start=(cursor_-15);
}
else{
start=0;
}
Serial.println(start);
for(int i=start; i<length_text; i++){
lcd.setCursor(i-start, 0);
lcd.print(Text[i]);
if(start != 0){
lcd.setCursor(15, 1);
lcd.print("|");
}
else{
lcd.setCursor(cursor_, 1);
lcd.print("|");
}
}
if(!click){
output[cursor] = Text[cursor_];
lcd.clear();
delay(1000);
break;
}
}
}
int Scrow(int clk, int dt, int cursor, int length){
if (dt == LOW && clk == HIGH) {
cursor--;
Serial.println("the first direction");
}
if(dt == LOW && clk == LOW){
cursor++;
Serial.println("the second direction");
}
if(cursor <0 || cursor >=length){
cursor=0;
}
return cursor;
}
void Manual(void){
while(true){
int click = digitalRead(A2);
int clk = digitalRead(8);
int dt = digitalRead(9);
if(!click){Changing(cursor); cursor++;}
if(dt != lasstatus){
cursor = Scrow(clk,dt,cursor, length);
lasstatus = dt;
lcd.clear();
}
for(int i=0; i<length;i++){
lcd.setCursor(i, 0);
lcd.print(output[i]);
lcd.setCursor(cursor, 1);
lcd.print("|");
}
}
}
void Entering(){
while(true){
if(Serial.available()>0){
text = Serial.readString();
if(text.length()>=32){
text=pattern;
}
if(text.length() >= 16 && text.length() <32){
new_text=text;
new_text.remove(0,16);
}
else{
new_text=" ";
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print(text);
lcd.setCursor(0,1);
lcd.print(new_text);
}
}
}
void EnterText(String text, String new_text=""){
if(text.length() >= 16){
new_text=text;
new_text.remove(0,16);
}
else{
new_text=" ";
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print(text);
lcd.setCursor(0,1);
lcd.print(new_text);
Serial.println("called");
}
void Guide(String show[],int length_show,int cursor_menu=0, int status_ =1){
while(true){
int dt = digitalRead(9);
int click = digitalRead(A2);
int clk = digitalRead(8);
if(!click){ delay(1000); break;
}
//Serial.println(dt);
if(clk != status_){
Serial.println(length_show);
cursor_menu=Scrow(clk,dt,cursor_menu,length_show-1);
status_=clk;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(show[cursor_menu]);
lcd.setCursor(0,1);
lcd.print(show[cursor_menu+1]);
}
}
}
void User(int address = 0, byte value =0){
while(true){
value = EEPROM.read(address);
if(value == 255){
break;
}
address++;
}
EnterText("player win");
EEPROM.write(address, 0);
}
void Bot(int address = 0, byte value =0){
while(true){
value = EEPROM.read(address);
if(value == 255){
break;
}
address++;
}
EnterText("bot win");
//Serial.println(address);
EEPROM.write(address, 1);
}
void Winner(int bot , int user,int number, int cursor_game=0, int lastvalue =1){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bot's:"+ player[bot]);
lcd.setCursor(0,1);
lcd.print("yours is:"+player[user]);
delay(5000);
if(bot == 0 && user == 1){
EnterText("you win");
point_user++;
}
else if(user == 0 && bot == 1){
EnterText("bot win");
point_bot++;
}
else if(user == 2 && bot == 0){
EnterText("bot win");
point_bot++;
}
else if(user == 0 && bot == 2){
EnterText("you win");
point_user++;
}
else if(user == 2 && bot == 1){
EnterText("you win");
point_user++;
}
else if(user == 1 && bot == 2){
EnterText("bot win");
point_bot++;
}
else{
EnterText("You and bot have the same choice");
}
delay(1000);
lcd.clear();
if(number >=3){
EnterText("Game over!");
delay(3000);
if(point_bot > point_user){
Bot();
}
else if(point_bot < point_user){
User();
}
else{
EnterText("nobody win");
}
delay(5000);
lcd.clear();
}
else{
return;
}
while(true){
int dt =digitalRead(9);
int clk =digitalRead(8);
int click = digitalRead(A2);
if(!click){
if(cursor_game == 0){
delay(1000);
point_user=0;
point_bot=0;
break;
}
else{
delay(1000);
flag_=false;
break;
}
}
// Serial.println(cursor_game);
if(clk != lastvalue){
cursor_game=Scrow(clk,dt,cursor_game, 2);
lastvalue=clk;
lcd.clear();
}
lcd.setCursor(0,0);
lcd.print("Restart?");
for(int i=0;i<2;i++){
if(cursor_game==i){
lcd.setCursor(distance_choice[i],1);
lcd.print(choice[i]+"<");
}
else{
lcd.setCursor(distance_choice[i],1);
lcd.print(choice[i]);
}
}
}
}
void Game(bool guide = true){
EnterText("Welcome to the RPS");
delay(5000);
for(int i=5;i>0;i--){
unsigned long previous = millis()+1000;
while(1){
unsigned long currentMillis = millis();
if(currentMillis >= previous){
String enter = String(i);
String answer = "Press key to skip the guide: "+enter;
EnterText(answer);
break;
}
int button = digitalRead(A2);
if(!button){
guide=false;
delay(1000);
break;
}
}
}
if(guide)Guide(instruction, length_guide);
lcd.clear();
int lastvalue = 1;
int cursor_game = 0;
int level =0;
while(flag_){
int dt =digitalRead(9);
int clk =digitalRead(8);
int click = digitalRead(A2);
int bot = random(30);
if(bot > 0 && bot <10)bot=0;
else if(bot>10 && bot < 20)bot=1;
else bot=2;
if(!click){Winner(bot, cursor_game, level); level++; lcd.clear();}
if(level > 3){
level =0;
}
//Serial.println(cursor_game);
if(clk != lastvalue){
cursor_game=Scrow(clk,dt,cursor_game, 3);
lastvalue=clk;
lcd.clear();
}
lcd.setCursor(0,0);
lcd.print("Choose one of:");
for(int i=0;i<3;i++){
if(cursor_game==i){
lcd.setCursor(distance[i],1);
lcd.print(player[i]+"<");
}
else{
lcd.setCursor(distance[i],1);
lcd.print(player[i]);
}
}
}
lcd.clear();
}
void History(){
int address =0;
byte value;
String list[6];
while(true){
value = EEPROM.read(address);
Serial.println(value);
if(value == 255){
if(address == 0){
EnterText("the history is empty");
break;
}
else {
Guide(list, sizeof(list)/sizeof(list[0]));
}
}
if(value == 1)list[address]="Winner is bot";
else if(value ==0)list[address]="Winner is player";
address++;
}
}
void Adapt(int cursor =0,int laststate =1, int mode =-1, unsigned long previous = millis()+100,unsigned long privious_ = millis()+100, int times =0){
int disatnce[] = {0,4,8,3,7};
int index_start =0;
while(true){
unsigned long current = millis();
int dt = digitalRead(9);
int clk = digitalRead(8);
int click = digitalRead(A2);
lcd.setCursor(0,0);
lcd.print("Setting date");
Serial.println(cursor);
if(!click){
times++;
if(times >=500){
if(current>previous){mode =-1; index_start=3;}
else previous = current+50;
times=0;
}
if(times >=100 && current > privious_){
privious_=current+100;
if(mode == -1)mode = cursor;
else if(mode != -1)mode =-1;
}
}
if(date[2]<2024)date[2]=2024;
if(dt != laststate){
laststate = dt;
if(mode == -1){
if(index_start == 3){
cursor = Scrow(clk,dt, cursor, 5)-2;
if(cursor<3)cursor=3;
}
else{
cursor = Scrow(clk,dt, cursor, 3);
}
}
else{
date[mode]=Scrow(clk,dt,date[mode], limit[mode]);
}
lcd.clear();
for(int i=index_start;i<index_start+3;i++){
if(cursor==i){
lcd.setCursor(disatnce[i],1);
lcd.print(String(date[i])+"<");
}
else{
lcd.setCursor(disatnce[i],1);
lcd.print(date[i]);
}
}
}
}
}
void setup() {
lcd.begin(16, 2);
pinMode(9, INPUT);
pinMode(A2, INPUT);
pinMode(8,INPUT);
Serial.begin(9600);
Serial.println("Start!");
Adapt();
}
void loop() {
int clk = digitalRead(8);
int dt = digitalRead(9);
int press = digitalRead(A2);
//Serial.println(laststate);
//Serial.println(select);
if(clk != laststate){
select=Scrow(clk, dt, select, 4);
EnterText(menu[select]);
laststate = clk;
}
if(!press){
switch(select){
case 0 :
lcd.clear();
delay(500);
Entering();
break;
case 1:
lcd.clear();
delay(500);
Manual();
break;
case 2:
lcd.clear();
delay(500);
Game();
break;
case 3:
History();
break;
}
}
}