#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <stdlib.h>
int gameMode;
bool game= true;
int p1;
int p2;
int win;
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define but1 2
#define but2 4
#define but3 7
#define buzzer 10
#define ROCK 1
#define PAPER 2
#define SCISSOR 3
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const unsigned char myBitmap[] = { /* bmp */ };
static const unsigned char PROGMEM rps[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x70, 0x00, 0x00,
0x00, 0x00, 0x06, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x30, 0x00, 0x00,
0x00, 0x00, 0x0E, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00,
0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x40, 0x00, 0x30, 0x00, 0x00,
0x00, 0x00, 0x0E, 0xE0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0x00, 0x30, 0x00, 0x00,
0x00, 0x00, 0x07, 0xE0, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x23, 0xB0, 0x00, 0x00,
0x00, 0x00, 0x01, 0xE0, 0x73, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x77, 0xE0, 0x00, 0x00,
0x00, 0x00, 0x00, 0xC7, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0x3E, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xCF, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCF, 0x38, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xCF, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9F, 0x98, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x9D, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x99, 0x9C, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x99, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x39, 0xCC, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xB9, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0xFC, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0xE0, 0x78, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00,
0x00, 0x03, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x07, 0xE7, 0x18, 0x00,
0x00, 0x0F, 0xFC, 0x00, 0x0F, 0xE3, 0xFE, 0x00, 0x00, 0x1C, 0x7E, 0x00, 0x0E, 0x71, 0xFF, 0x00,
0x00, 0x38, 0xF7, 0xC0, 0x0E, 0x38, 0xE3, 0x80, 0x00, 0x70, 0xE7, 0xE0, 0x1F, 0x1C, 0x71, 0xC0,
0x00, 0xE0, 0x07, 0x70, 0x3F, 0x8E, 0x38, 0xE0, 0x01, 0xC0, 0x06, 0x70, 0x3B, 0xC7, 0x1C, 0x70,
0x01, 0xC0, 0x00, 0x78, 0x39, 0xE7, 0x8E, 0x38, 0x03, 0x80, 0x00, 0xFC, 0x1C, 0xF3, 0xC7, 0x1C,
0x03, 0x80, 0x00, 0x5C, 0x1E, 0x79, 0xC2, 0x0C, 0x03, 0x00, 0x00, 0x0C, 0x3F, 0x3C, 0x00, 0x00,
0x03, 0x00, 0x00, 0x1C, 0x77, 0x9E, 0x00, 0x00, 0x03, 0x00, 0x00, 0x38, 0x73, 0xCE, 0x00, 0x00,
0x03, 0x00, 0x00, 0x78, 0x71, 0xC0, 0x00, 0x00, 0x07, 0x00, 0x00, 0xFC, 0x38, 0xE0, 0x00, 0x00,
0x0E, 0x00, 0x01, 0xCC, 0x1C, 0x70, 0x00, 0x00, 0x1C, 0x00, 0x01, 0x8C, 0x0E, 0x00, 0x00, 0x00,
0x38, 0x00, 0x00, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x70, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x00,
0x00, 0x00, 0x01, 0xC0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x38, 0x00, 0x00,
0x00, 0x01, 0xFF, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x0F, 0xF0, 0x00,
0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup() {
Serial.begin(115200);
pinMode(but1, INPUT);
pinMode(but2, INPUT);
pinMode(but3, INPUT);
pinMode(buzzer, OUTPUT);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
}
display.clearDisplay();
delay(500);
drawCircles();
display.clearDisplay();
display.invertDisplay(true);
displayOLED(1,27,20,"IoT Project");
displayOLED(1,12,30,"Rock Paper Scissor");
display.drawRect(1,1,126,62,WHITE);
display.display();
int temp = readButt();
delay(500); //Wait 5 Sec
display.clearDisplay();
display.invertDisplay(false);
display.drawBitmap(31 , 0, rps, 64, 64,1);
display.display();
delay(2500);
}
void loop() {
display.clearDisplay();
displayOLED(1,14,22,"1. Single Player");
displayOLED(1,14,32,"2. Two Players");
gameMode = readButt(); //Check which mode is selected
if(gameMode==1) {
displayOLED(1,8,22,">");
delay(1000);
display.clearDisplay();
displayOLED(2,0,20,"Single \nPlayer");
}else if(gameMode==2){
displayOLED(1,8,32,">");
delay(1000);
display.clearDisplay();
displayOLED(2,0,20,"Two \nPlayer");
} else {
display.clearDisplay();
display.setCursor(0, 0);
display.display();
delay(2000);
}
delay(2000);
for(int i=1000;i>=0;i-=100) {
tone(buzzer,i);
delay(100);
noTone(10);
}
game = true;
do{
display.clearDisplay();
displayOLED(2,10,20,"Player 1");
displayOLED(1,10,37,"Rock Paper Scissor");
p1 = readButt();
delay(1000);
display.clearDisplay();
displayOLED(2,10,20,"Player 2");
displayOLED(1,10,35,"Rock Paper Scissor");
if(gameMode==1) {
p2 = askAI();
delay(300);
} else p2 = readButt();
delay(1000);
game = checkWin(p1,p2); //checking for winner
delay(3000);
}while(game == false);
display.clearDisplay();
}
void displayOLED(int textSize,int setX, int setY, char str[20]) {
display.setFont();
display.setTextColor(WHITE);
display.setTextSize(textSize);
display.setTextColor(WHITE);
display.setCursor(setX, setY);
display.print(str);
display.display();
}
void drawCircles(void) {
display.clearDisplay();
for(int16_t i=5; i<90; i+=5) {
display.drawCircle(63,31, i, WHITE);
display.display();
delay(10);
display.clearDisplay();
}
display.display();
}
int readButt() {
int val=0;
while(1) {
if(digitalRead(but1)==HIGH) {
Serial.println("returning 1 ");
val = 1;
break;
}
if(digitalRead(but2)==HIGH) {
Serial.println("returning 2");
val = 2;
break;
}
if(digitalRead(but3)==HIGH) {
Serial.println("returning 3 ");
val = 3;
break;
}
}
return val;
}
int askAI() {
int srand = (rand()%3) + 1;
Serial.print("returning ");
Serial.println(srand);
return srand;
}
bool checkWin(int p1, int p2) {
display.clearDisplay();
if(p1==p2) {
displayOLED(2,20,20,"Draw");
displayOLED(1,20,35,"Restart");
return false;
}
if(p1==ROCK && p2==PAPER) {
displayOLED(1,0,20,"Rock lost to Paper");
// displayOLED(1,0,20,"\n\nPlayer 2 win");
win =2;
return true;
} else if(p1==ROCK && p2==SCISSOR) {
displayOLED(1,0,20,"Rock beats Scissor");
// displayOLED(1,0,20,"\n\nPlayer 2 win");
win =1;
return true;
} else if(p1==PAPER && p2==ROCK) {
displayOLED(1,0,20,"Paper beats \nRock");
// displayOLED(1,0,20,"\n\nPlayer 1 win");
win =1;
return true;
} else if(p1==PAPER && p2==SCISSOR) {
displayOLED(1,0,20,"Paper lost to Scissor");
// displayOLED(1,0,20,"\n\nPlayer 2 win");
win =2;
return true;
} else if(p1==SCISSOR && p2==ROCK) {
displayOLED(1,0,20,"Scissor lost to \nRock");
// displayOLED(1,0,20,"\n\nPlayer 2 win");
win =2;
return true;
} else if(p1==SCISSOR && p2==PAPER) {
displayOLED(1,0,20,"Scissor beats \nPaper");
// displayOLED(1,0,20,"\n\nPlayer 1 win");
win =1;
return true;
}
}