#include <Arduino.h>
#include <stdlib.h>
#define Max7219_pinCLK 18
#define Max7219_pinCS 5
#define Max7219_pinDIN 4
#define Max7219B_pinCLK 19
#define Max7219B_pinCS 12
#define Max7219B_pinDIN 13
unsigned char rock_disp[8] = {0x00,0x3C,0x7E,0xFF,0xFF,0x7E,0x3C,0x00};
unsigned char paper_disp[8] = {0xF8,0x8C,0x8E,0x8F,0x81,0x81,0x81,0xFF};
unsigned char scissors_disp[8] = {0x30,0x18,0x88,0xCF,0x7D,0x1F,0x14,0x1C,};
unsigned char winner_disp[8] = {0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xFF,0xFF,};
unsigned char loser_disp[8] = {0x06,0x06,0x06,0x06,0x06,0x06,0x7E,0x7E,};
unsigned char smile_disp[8] = {0x7E,0xFF,0xDB,0xFF,0xFF,0xBD,0xC3,0x7E,};
unsigned char sad_disp[8] = {0x7E,0xFF,0xDB,0xFF,0xFF,0xE7,0xDB,0x7E,};
unsigned char g_disp[8] = {0x1c,0x22,0x42,0x40,0x5e,0x42,0x42,0x3c};
unsigned char o_disp[8] = {0x18,0x24,0x42,0x42,0x42,0x42,0x24,0x18};
const int choices[3] = {35, 34, 2};
const String names[3] = {"Rock", "Paper", "Scissors"};
int cpu_pts = 0;
int player_pts = 0;
int debounceDelay = 20;
unsigned long lastDebounceTime = 0;
int buttonState[3] = {LOW, LOW, LOW};
int buttonReading[3];
int playerChoice;
int digit_pins[] = {22, 21};
int led_pins[] = {14, 27, 26, 25, 33, 32, 23};
static unsigned long timer = millis();
long delay_no = 500;
int count = 0;
int digits[][7] = {
{0, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 1, 1, 1, 1},
{0, 0, 1, 0, 0, 1, 0},
{0, 0, 0, 0, 1, 1, 0},
{1, 0, 0, 1, 1, 0, 0},
{0, 1, 0, 0, 1, 0, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0}
};
void Write_Max7219_byte(unsigned char DATA)
{
unsigned char i;
digitalWrite(Max7219_pinCS, LOW);
for (i = 8; i >= 1; i--)
{
digitalWrite(Max7219_pinCLK, LOW);
digitalWrite(Max7219_pinDIN, DATA & 0x80);
DATA = DATA << 1;
digitalWrite(Max7219_pinCLK, HIGH);
}
}
void Write_Max7219(unsigned char address, unsigned char dat)
{
digitalWrite(Max7219_pinCS, LOW);
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
digitalWrite(Max7219_pinCS, HIGH);
}
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0x00);
Write_Max7219(0x0a, 0x03);
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x00);
}
void display_shape(unsigned char *shape)
{
for (unsigned char i = 1; i <= 8; i++)
{
Write_Max7219(i, shape[i - 1]);
}
}
void Write_Max7219B_byte(unsigned char DATA)
{
unsigned char i;
digitalWrite(Max7219B_pinCS,LOW);
for(i=8;i>=1;i--)
{
digitalWrite(Max7219B_pinCLK,LOW);
digitalWrite(Max7219B_pinDIN,DATA&0x80);
DATA = DATA<<1;
digitalWrite(Max7219B_pinCLK,HIGH);
}
}
void Write_Max7219B(unsigned char address,unsigned char dat)
{
digitalWrite(Max7219B_pinCS,LOW);
Write_Max7219B_byte(address);
Write_Max7219B_byte(dat);
digitalWrite(Max7219B_pinCS,HIGH);
}
void Init_MAX7219B(void)
{
Write_Max7219B(0x09, 0x00);
Write_Max7219B(0x0a, 0x03);
Write_Max7219B(0x0b, 0x07);
Write_Max7219B(0x0c, 0x01);
Write_Max7219B(0x0f, 0x00);
}
void display_shapeB(unsigned char *shape)
{
for (unsigned char i = 1; i <= 8; i++)
{
Write_Max7219B(i, shape[i - 1]);
}
}
void setup()
{
for (int i = 0; i < 3; i++) {
pinMode(choices[i], INPUT);
}
for (int i = 0; i < 7; i++) {
pinMode(led_pins[i], OUTPUT);
}
for (int i = 0; i < 4; i++) {
pinMode(digit_pins[i], OUTPUT);
}
for (int i = 0; i < 7; i++) {
digitalWrite(led_pins[i], 1);
}
pinMode(Max7219_pinCLK, OUTPUT);
pinMode(Max7219_pinCS, OUTPUT);
pinMode(Max7219_pinDIN, OUTPUT);
Init_MAX7219();
pinMode(Max7219B_pinCLK, OUTPUT);
pinMode(Max7219B_pinCS, OUTPUT);
pinMode(Max7219B_pinDIN, OUTPUT);
Init_MAX7219B();
Serial.begin(9600);
Serial.println(" Choose Rock, Paper, or Scissors ");
}
void loop()
{
int cpuChoose = random(0, 3);
int cpu = choices[cpuChoose];
for (int i = 0; i < 3; i++) {
int reading = digitalRead(choices[i]);
if (reading != buttonReading[i]) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState[i]) {
buttonState[i] = reading;
if (buttonState[i] == HIGH) {
playerChoice = choices[i];
Serial.println("You Chose " + names[i]);
switch (cpuChoose)
{
case 0:
display_shape(rock_disp);
break;
case 1:
display_shape(paper_disp);
break;
case 2:
display_shape(scissors_disp);
break;
}
switch (i)
{
case 0:
display_shapeB(rock_disp);
break;
case 1:
display_shapeB(paper_disp);
break;
case 2:
display_shapeB(scissors_disp);
break;
}
// determine winner
if (playerChoice == cpu) {
Serial.println(" Cpu Chose " + names[cpuChoose]);
Serial.println(" It's a Tie");
display_score(count);
} else if ((playerChoice == 35 && cpu == 2) || (playerChoice == 34 && cpu == 35) || (playerChoice == 2 && cpu == 34)) {
Serial.println(" Cpu Chose " + names[cpuChoose]);
Serial.println(" You Win");
player_pts++;
count = count + 10;
display_score(count);
delay(500);
display_shape(sad_disp);
display_shapeB(smile_disp);
} else {
Serial.println(" Cpu Chose " + names[cpuChoose]);
Serial.println(" You Lose");
cpu_pts++;
count = count + 1;
display_score(count);
delay(500);
display_shape(smile_disp);
display_shapeB(sad_disp);
}
Serial.println(" Computer Pts: " + String(cpu_pts));
Serial.println(" Your Pts: " + String(player_pts));
Serial.println("----------------------------------");
}
if (cpu_pts >= 5 ){
Serial.println("Game Finished! Loser");
cpu_pts = 0;
player_pts = 0;
count = 0;
display_shape(winner_disp);
display_shapeB(loser_disp);
}
else if (player_pts >=5){
Serial.println("Game Finished! Winner");
cpu_pts = 0;
player_pts = 0;
count = 0;
display_shape(loser_disp);
display_shapeB(winner_disp);
}
}
}
buttonReading[i] = reading;
}
display_score(count);
}
void display_digit(int number, int digitPin) {
digitalWrite(digit_pins[digitPin], 1);
for (int i = 0; i < 7; i++) {
digitalWrite(led_pins[i], digits[number][i]);
}
digitalWrite(digit_pins[digitPin], 0);
for (int i = 0; i < 7; i++) {
digitalWrite(led_pins[i], 1);
}
}
void display_score(int no) {
int two_digit = (no / 10) % 10;
int one_digit = no % 10;
display_digit(two_digit, 0);
display_digit(one_digit, 1);
}