#include <IRremote.h>
#include <Servo.h>
IRrecv reciever(12);
int board[9]={0,0,0,0,0,0,0,0,0};
int pos[8];
int PossibleWins(int pos[]){ //returns avilable pos number
for(int i=0;i<8;i++){
if(pos[i]==2)
return i;
}
return -1;
}
int PossibleLoses(int pos[]){
for(int i=0;i<8;i++){
if(pos[i]==-2)
return i;
}
return -1;
}
int GetInput(){
if(reciever.decode()){
int input = IRdecode(reciever.decodedIRData.command);
for (int i=1;i<10;i++){
if (input==i){
board[i-1]=-1;
}
}return 1;
}else{return 0;}
}
int DecryptPack(int pack){
switch(pack){
case 0 :
if(board[0]==0){
return 0;
}else if(board[1]==0){
return 1;
}else if(board[2]==0){
return 2;
}
case 1 :
if(board[3]==0){
return 3;
}else if(board[4]==0){
return 4;
}else if(board[5]==0){
return 5;
}
case 2 :
if(board[6]==0){
return 6;
}else if(board[7]==0){
return 7;
}else if(board[8]==0){
return 8;
}
case 3 :
if(board[0]==0){
return 0;
}else if(board[3]==0){
return 3;
}else if(board[6]==0){
return 6;
}
case 4 :
if(board[1]==0){
return 1;
}else if(board[4]==0){
return 4;
}else if(board[7]==0){
return 7;
}
case 5 :
if(board[2]==0){
return 2;
}else if(board[5]==0){
return 5;
}else if(board[8]==0){
return 8;
}
case 6 :
if(board[0]==0){
return 0;
}else if(board[4]==0){
return 4;
}else if(board[8]==0){
return 8;
}
case 7 :
if(board[2]==0){
return 2;
}else if(board[4]==0){
return 4;
}else if(board[6]==0){
return 6;
}
}
}
int IRdecode(int val){
switch(val){
case 48:
return 1;
break;
case 24:
return 2;
break;
case 122:
return 3;
break;
case 16:
return 4;
break;
case 56:
return 5;
break;
case 90:
return 6;
break;
case 66:
return 2;
break;
case 74:
return 2;
break;
case 82:
return 9;
break;
default:
return 0;
}
}
int RandomMove(){
if(board[4]==0){
return 4;
}else{
// something here
}
}
void setup() {
// put your setup code here, to run once:
reciever.enableIRIn();
}
void loop() {
// put your main code here, to run repeatedly:
if(GetInput()){
pos[0]=board[0]+board[1]+board[2];
pos[1]=board[3]+board[4]+board[5];
pos[2]=board[6]+board[7]+board[8];
pos[3]=board[0]+board[3]+board[6];
pos[4]=board[1]+board[4]+board[7];
pos[5]=board[2]+board[5]+board[8];
pos[6]=board[0]+board[4]+board[8];
pos[7]=board[2]+board[4]+board[6];
int pack=PossibleWins(pos);
if (pack==-1){
pack = PossibleLoses(pos);}
int move =-1;
if(pack>-1){
move = DecryptPack(pack);
}else{
move = RandomMove();
}
}
}