//docum
//descriere componente, conexiue, cod, template pe site
#import <Keypad.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
//definim cate un caracter specific fiecarie taste pentru a putea identifica care a fost apasta
//daca i se ataseaza '0', acea tasta nnu este folosita
//tasta 'R' se foloseste ca reset
char hexaKeys[4][4] = {
{'1','2','3','0'},
{'4','5','6','0'},
{'7','8','9','0'},
{'0','0','0','R'}
};
byte rowPins[4] = {22, 24, 26, 28}; //connect to the row pinouts of the keypad
byte colPins[4] = {23, 25, 27, 29}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad keypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, 4, 4);
//pentru X vom salva 1, iar pentru O vom salva -1
int volatile leduri[3][3] = {{0, 0, 0},
{0, 0, 0},
{0, 0, 0}};
int red[3][3] = {{0, 0, 0},
{0, 0, 0},
{0, 0, 0}};
int green[3][3] = {{0, 0, 0},
{0, 0, 0},
{0, 0, 0}};
int pin_red[3][3] = {{30, 32, 34},
{36, 38, 40},
{42, 44, 46}};
int pin_green[3][3] = {{31, 33, 35},
{37, 39, 41},
{43, 45, 47}};
int crt = 1;
int scorX = 0;
int scorO = 0;
void setup() {
//declare lcd
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Score X ");
lcd.print(scorX);
lcd.setCursor(0, 1);
lcd.print("Score O ");
lcd.print(scorO);
//connect leds and buttons
pinMode(pin_red[0][0], OUTPUT);
pinMode(pin_green[0][0], OUTPUT);
pinMode(pin_red[0][1], OUTPUT);
pinMode(pin_green[0][1], OUTPUT);
pinMode(pin_red[0][2], OUTPUT);
pinMode(pin_green[0][2], OUTPUT);
pinMode(pin_red[1][0], OUTPUT);
pinMode(pin_green[1][0], OUTPUT);
pinMode(pin_red[1][1], OUTPUT);
pinMode(pin_green[1][1], OUTPUT);
pinMode(pin_red[1][2], OUTPUT);
pinMode(pin_green[1][2], OUTPUT);
pinMode(pin_red[2][0], OUTPUT);
pinMode(pin_green[2][0], OUTPUT);
pinMode(pin_red[2][1], OUTPUT);
pinMode(pin_green[2][1], OUTPUT);
pinMode(pin_red[2][2], OUTPUT);
pinMode(pin_green[2][2], OUTPUT);
//add an event listener for this keypad
keypad.addEventListener(keypadEvent);
Serial.begin(9600);
}
void loop() {
char key = keypad.getKey();
}
void keypadEvent(KeypadEvent key) {
switch (keypad.getState()){
case PRESSED:
switch(key) {
case '1':
if(leduri[0][0] == 0){
leduri[0][0] = crt;
control();
}
break;
case '2':
if(leduri[0][1] == 0){
leduri[0][1] = crt;
control();
}
break;
case '3':
if(leduri[0][2] == 0){
leduri[0][2] = crt;
control();
}
break;
case '4':
if(leduri[1][0] == 0){
leduri[1][0] = crt;
control();
}
break;
case '5':
if(leduri[1][1] == 0){
leduri[1][1] = crt;
control();
}
break;
case '6':
if(leduri[1][2] == 0){
leduri[1][2] = crt;
control();
}
break;
case '7':
if(leduri[2][0] == 0){
leduri[2][0] = crt;
control();
}
break;
case '8':
if(leduri[2][1] == 0){
leduri[2][1] = crt;
control();
}
break;
case '9':
if(leduri[2][2] == 0){
leduri[2][2] = crt;
control();
}
break;
case 'R':
resetGame();
break;
case '0':
break;
}
break;
}
}
void control(){
colorLeds();
if(verifyFinish() != 0){
delay(500);
//Serial.println("Game finished!");
//reprint score
lcd.setCursor(8, 0);
lcd.print(scorX);
lcd.setCursor(8, 1);
lcd.print(scorO);
newGame();
}
}
void resetGame(){
for(int i = 0; i < 3 ;i++)
for(int j = 0; j < 3; j++)
leduri[i][j] = 0;
scorX = 0;
scorO = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Score X ");
lcd.print(scorX);
lcd.setCursor(0, 1);
lcd.print("Score O ");
lcd.print(scorO);
colorLeds();
crt = 1;
}
void newGame(){
for(int i = 0; i < 3 ;i++)
for(int j = 0; j < 3; j++)
leduri[i][j] = 0;
colorLeds();
crt = 1;
}
int verifyFinish(){
crt = -crt;
for(int i = 0; i < 3 ; i++){
if(leduri[i][0] == leduri[i][1] && leduri[i][0] == leduri[i][2] && leduri[i][0] == 1){
scorX +=1;
return 1;
}
if(leduri[i][0] == leduri[i][1] && leduri[i][0] == leduri[i][2] && leduri[i][0] == -1){
scorO +=1;
return -1;
}
}
for(int i = 0; i < 3 ; i++){
if(leduri[0][i] == leduri[1][i] && leduri[0][i] == leduri[2][i] && leduri[0][i] == 1){
scorX +=1;
return 1;
}
if(leduri[0][i] == leduri[1][i] && leduri[0][i] == leduri[2][i] && leduri[0][i] == -1){
scorO +=1;
return -1;
}
}
if(leduri[0][0] == leduri[1][1] && leduri[0][0] == leduri[2][2] && leduri[0][0] == 1){
scorX +=1;
return 1;
}
if(leduri[0][0] == leduri[1][1] && leduri[0][0] == leduri[2][2] && leduri[0][0] == -1){
scorO +=1;
return -1;
}
if(leduri[0][2] == leduri[1][1] && leduri[0][2] == leduri[2][0] && leduri[0][2] == 1){
scorX +=1;
return 1;
}
if(leduri[0][2] == leduri[1][1] && leduri[0][2] == leduri[2][0] && leduri[0][2] == -1){
scorO +=1;
return -1;
}
for(int i = 0; i < 3 ;i++)
for(int j = 0; j < 3; j++)
if(leduri[i][j] == 0)
return 0;
return 2;
}
void colorLeds(){
for(int i=0; i<3; i++)
for(int j=0; j<3; j++){
if(leduri[i][j]==1){
red[i][j] = 255;
green[i][j] = 0;
}
else if(leduri[i][j]==-1){
red[i][j] = 0;
green[i][j] = 255;
}
else if(leduri[i][j]==0){
red[i][j] = 0;
green[i][j] = 0;
}
}
setColors();
}
void setColors(){
digitalWrite(pin_red[0][0], red[0][0]);
digitalWrite(pin_green[0][0], green[0][0]);
digitalWrite(pin_red[0][1], red[0][1]);
digitalWrite(pin_green[0][1], green[0][1]);
digitalWrite(pin_red[0][2], red[0][2]);
digitalWrite(pin_green[0][2], green[0][2]);
digitalWrite(pin_red[1][0], red[1][0]);
digitalWrite(pin_green[1][0], green[1][0]);
digitalWrite(pin_red[1][1], red[1][1]);
digitalWrite(pin_green[1][1], green[1][1]);
digitalWrite(pin_red[1][2], red[1][2]);
digitalWrite(pin_green[1][2], green[1][2]);
digitalWrite(pin_red[2][0], red[2][0]);
digitalWrite(pin_green[2][0], green[2][0]);
digitalWrite(pin_red[2][1], red[2][1]);
digitalWrite(pin_green[2][1], green[2][1]);
digitalWrite(pin_red[2][2], red[2][2]);
digitalWrite(pin_green[2][2], green[2][2]);
}