Introduction: Tic Tac Toe Arduino
Required Materials:
Arduino board
9 switches
18 LEDs (9 of each color)
18 resistors (We used 330)
2 small bread boards
1 large bread board
Lots of Wire
Video at:
Step 1: Setting Up the Bread Boards
Connect the bread boards by whatever means, we had to use hot glue to hold the two smaller bread boards to the larger one. Put the LEDs in the bread boards forming a 3 x 3 square with one of each colored LED in each segment of the square.
Step 2: Wiring
Place each of the resistors after the LED in their circuit. Run wires from the player controlled switches to the LEDs that you want the player to be controlling. Run wires from the same place as in the previous step and hook them up to the Arduino. Run wires from the opposite side of the switches to the positive strip on either the right or left side of the bread board. Run wires from the LEDs to the negative strips nearest them so that they all circulate into one strip then run one wire from the combined strip to the ground (gnd) on the Arduino. Run wires from the computer controlled lights to the Digital and Analog inputs on the Arduino board. Try and keep all the wires as low as possible or the second picture above may be how this turns out for you.
Step 3: Code
int computerArray[10] = {2,3,4,5,6,7,8,9,10};
typedef enum{
OPEN,
CLOSED_C,
CLOSED_P
}
BoxState;
int turn = 0;
int switchArray[10]={
11,12,13,14,15,16,17,18,19};
int switchArray2[10]={
2,3,4,5,6,7,8,9,10};
void setup(){
int i;
int e;
Serial.begin(9600);
randomSeed(analogRead(0));
for(i=0; i<9; i+=1){
pinMode(switchArray[i], INPUT);
}
for(e=0; e<9; e+=1){
pinMode(switchArray2[e], OUTPUT);
}
}
BoxState box1 = OPEN;
BoxState box2 = OPEN;
BoxState box3 = OPEN;
BoxState box4 = OPEN;
BoxState box5 = OPEN;
BoxState box6 = OPEN;
BoxState box7 = OPEN;
BoxState box8 = OPEN;
BoxState box9 = OPEN;
int game = 1;
int Array1[9] = {13,19,16,13,12,11,13,11};
int Array2[9] = {12,14,17,19,14,15,14,14};
int Array3[9] = {11,15,18,16,17,18,18,16};
void checkGame(){
int q;
for(q=0; q<8; q+=1){
if(digitalRead(Array1[q]) == HIGH && digitalRead(Array2[q]) && digitalRead(Array3[q])){
game = 2;
}
}
}
void checkComputerWin(){
if (turn%2 == 1){
if(box1 == CLOSED_C && box2 == CLOSED_C && box3 == OPEN){
box3 = CLOSED_C;
digitalWrite(7,HIGH);
game = 0;
turn+=1;
}
else if(box1 == CLOSED_C && box3 == CLOSED_C && box2 == OPEN){
box2 = CLOSED_C;
digitalWrite(8,HIGH);
game = 0;
turn+=1;
}
else if(box3 == CLOSED_C && box2 == CLOSED_C && box1 == OPEN){
box1 = CLOSED_C;
digitalWrite(9,HIGH);
game = 0;
turn+=1;
}
else if(box4 == CLOSED_C && box5 == CLOSED_C && box6 == OPEN){
box6 = CLOSED_C;
digitalWrite(4,HIGH);
game = 0;
turn+=1;
}
else if(box5 == CLOSED_C && box6 == CLOSED_C && box4 == OPEN){
box4 = CLOSED_C;
digitalWrite(6,HIGH);
game = 0;
turn+=1;
}
else if(box4 == CLOSED_C && box6 == CLOSED_C && box5 == OPEN){
box5 = CLOSED_C;
digitalWrite(5,HIGH);
game = 0;
turn+=1;
}
else if(box7 == CLOSED_C && box8 == CLOSED_C && box9 == OPEN){
box9 = CLOSED_C;
digitalWrite(10,HIGH);
game = 0;
turn+=1;
}
else if(box8 == CLOSED_C && box9 == CLOSED_C && box7 == OPEN){
box7 = CLOSED_C;
digitalWrite(3,HIGH);
game = 0;
turn+=1;
}
else if(box7 == CLOSED_C && box9 == CLOSED_C && box8 == OPEN){
box8 = CLOSED_C;
digitalWrite(2,HIGH);
game = 0;
turn+=1;
}
else if(box1 == CLOSED_C && box4 == CLOSED_C && box7 == OPEN){
box7 = CLOSED_C;
digitalWrite(3,HIGH);
game = 0;
turn+=1;
}
else if(box1 == CLOSED_C && box7 == CLOSED_C && box4 == OPEN){
box4 = CLOSED_C;
digitalWrite(6,HIGH);
game = 0;
turn+=1;
}
else if(box4 == CLOSED_C && box7 == CLOSED_C && box1 == OPEN){
box1 = CLOSED_C;
digitalWrite(9,HIGH);
game = 0;
turn+=1;
}
else if(box5 == CLOSED_C && box2 == CLOSED_C && box8 == OPEN){
box8 = CLOSED_C;
digitalWrite(2,HIGH);
game = 0;
turn+=1;
}
else if(box8 == CLOSED_C && box2 == CLOSED_C && box5 == OPEN){
box5 = CLOSED_C;
digitalWrite(5,HIGH);
game = 0;
turn+=1;
}
else if(box5 == CLOSED_C && box8 == CLOSED_C && box2 == OPEN){
box2 = CLOSED_C;
digitalWrite(8,HIGH);
game = 0;
turn+=1;
}
else if(box3 == CLOSED_C && box6 == CLOSED_C && box9 == OPEN){
box9 = CLOSED_C;
digitalWrite(10,HIGH);
game = 0;
turn+=1;
}
else if(box6 == CLOSED_C && box9 == CLOSED_C && box3 == OPEN){
box3 = CLOSED_C;
digitalWrite(7,HIGH);
game = 0;
turn+=1;
}
else if(box3 == CLOSED_C && box9 == CLOSED_C && box6 == OPEN){
box6 = CLOSED_C;
digitalWrite(4,HIGH);
game = 0;
turn+=1;
}
else if(box1 == CLOSED_C && box5 == CLOSED_C && box9 == OPEN){
box9 = CLOSED_C;
digitalWrite(10,HIGH);
game = 0;
turn+=1;
}
else if(box5 == CLOSED_C && box9 == CLOSED_C && box1 == OPEN){
box1 = CLOSED_C;
digitalWrite(9,HIGH);
game = 0;
turn+=1;
}
else if(box9 == CLOSED_C && box1 == CLOSED_C && box5 == OPEN){
box5 = CLOSED_C;
digitalWrite(5,HIGH);
game = 0;
turn+=1;
}
else if(box3 == CLOSED_C && box5 == CLOSED_C && box7 == OPEN){
box7 = CLOSED_C;
digitalWrite(3,HIGH);
game = 0;
turn+=1;
}
else if(box7 == CLOSED_C && box5 == CLOSED_C && box3 == OPEN){
box3 = CLOSED_C;
digitalWrite(7,HIGH);
game = 0;
turn+=1;
}
else if(box3 == CLOSED_C && box7 == CLOSED_C && box5 == OPEN){
box5 = CLOSED_C;
digitalWrite(5,HIGH);
game = 0;
turn+=1;
}
}
}
void checkPlayerWin(){
if(box1 == CLOSED_P && box2 == CLOSED_P && box3 == OPEN && turn%2 == 1){
box3 = CLOSED_C;
digitalWrite(7,HIGH);
turn+=1;
}
if(box1 == CLOSED_P && box3 == CLOSED_P && box2 == OPEN && turn%2 == 1){
box2 = CLOSED_C;
digitalWrite(8,HIGH);
turn+=1;
}
if(box3 == CLOSED_P && box2 == CLOSED_P && box1 == OPEN && turn%2 == 1){
box1 = CLOSED_C;
digitalWrite(9,HIGH);
turn+=1;
}
if(box4 == CLOSED_P && box5 == CLOSED_P && box6 == OPEN && turn%2 == 1){
box6 = CLOSED_C;
digitalWrite(4,HIGH);
turn+=1;
}
if(box5 == CLOSED_P && box6 == CLOSED_P && box4 == OPEN && turn%2 == 1){
box4 = CLOSED_C;
digitalWrite(6,HIGH);
turn+=1;
}
if(box4 == CLOSED_P && box6 == CLOSED_P && box5 == OPEN && turn%2 == 1){
box5 = CLOSED_C;
digitalWrite(5,HIGH);
turn+=1;
}
if(box7 == CLOSED_P && box8 == CLOSED_P && box9 == OPEN && turn%2 == 1){
box9 = CLOSED_C;
digitalWrite(10,HIGH);
turn+=1;
}
if(box8 == CLOSED_P && box9 == CLOSED_P && box7 == OPEN && turn%2 == 1){
box7 = CLOSED_C;
digitalWrite(3,HIGH);
turn+=1;
}
if(box7 == CLOSED_P && box9 == CLOSED_P && box8 == OPEN && turn%2 == 1){
box8 = CLOSED_C;
digitalWrite(2,HIGH);
turn+=1;
}
if(box1 == CLOSED_P && box4 == CLOSED_P && box7 == OPEN && turn%2 == 1){
box7 = CLOSED_C;
digitalWrite(3,HIGH);
turn+=1;
}
if(box1 == CLOSED_P && box7 == CLOSED_P && box4 == OPEN && turn%2 == 1){
box4 = CLOSED_C;
digitalWrite(6,HIGH);
turn+=1;
}
if(box4 == CLOSED_P && box7 == CLOSED_P && box1 == OPEN && turn%2 == 1){
box1 = CLOSED_C;
digitalWrite(9,HIGH);
turn+=1;
}
if(box5 == CLOSED_P && box2 == CLOSED_P && box8 == OPEN && turn%2 == 1){
box8 = CLOSED_C;
digitalWrite(2,HIGH);
turn+=1;
}
if(box8 == CLOSED_P && box2 == CLOSED_P && box4 == OPEN && turn%2 == 1){
box5 = CLOSED_C;
digitalWrite(5,HIGH);
turn+=1;
}
if(box5 == CLOSED_P && box8 == CLOSED_P && box2 == OPEN && turn%2 == 1){
box2 = CLOSED_C;
digitalWrite(8,HIGH);
turn+=1;
}
if(box3 == CLOSED_P && box6 == CLOSED_P && box9 == OPEN && turn%2 == 1){
box9 = CLOSED_C;
digitalWrite(10,HIGH);
turn+=1;
}
if(box6 == CLOSED_P && box9 == CLOSED_P && box3 == OPEN && turn%2 == 1){
box3 = CLOSED_C;
digitalWrite(7,HIGH);
turn+=1;
}
if(box3 == CLOSED_P && box9 == CLOSED_P && box6 == OPEN && turn%2 == 1){
box6 = CLOSED_C;
digitalWrite(4,HIGH);
turn+=1;
}
if(box1 == CLOSED_P && box5 == CLOSED_P && box9 == OPEN && turn%2 == 1){
box9 = CLOSED_C;
digitalWrite(10,HIGH);
turn+=1;
}
if(box5 == CLOSED_P && box9 == CLOSED_P && box1 == OPEN && turn%2 == 1){
box1 = CLOSED_C;
digitalWrite(9,HIGH);
turn+=1;
}
if(box9 == CLOSED_P && box1 == CLOSED_P && box5 == OPEN && turn%2 == 1){
box5 = CLOSED_C;
digitalWrite(5,HIGH);
turn+=1;
}
if(box3 == CLOSED_P && box5 == CLOSED_P && box7 == OPEN && turn%2 == 1){
box7 = CLOSED_C;
digitalWrite(3,HIGH);
turn+=1;
}
if(box7 == CLOSED_P && box5 == CLOSED_P && box3 == OPEN && turn%2 == 1){
box3 = CLOSED_C;
digitalWrite(7,HIGH);
turn+=1;
}
if(box3 == CLOSED_P && box7 == CLOSED_P && box5 == OPEN && turn%2 == 1){
box5 = CLOSED_C;
digitalWrite(5,HIGH);
turn+=1;
}
}
void playRandom(){
int ran = random(0,90);
if(ran <= 10 && box1 == OPEN && turn%2 == 1){
box1 = CLOSED_C;
turn+=1;
digitalWrite(9,HIGH);
}
if(ran <= 20 && ran > 10 && box2 == OPEN && turn%2 == 1){
box2 = CLOSED_C;
turn+=1;
digitalWrite(8,HIGH);
}
if(ran <= 30 && ran > 20 && box3 == OPEN && turn%2 == 1){
box3 = CLOSED_C;
turn+=1;
digitalWrite(7,HIGH);
}
if(ran <= 40 && ran > 30 && box4 == OPEN && turn%2 == 1){
box4 = CLOSED_C;
turn+=1;
digitalWrite(6,HIGH);
}
if(ran <= 50 && ran > 40 && box5 == OPEN && turn%2 == 1){
box5 = CLOSED_C;
turn+=1;
digitalWrite(5,HIGH);
}
if(ran <= 60 && ran > 50 && box6 == OPEN && turn%2 == 1){
box6 = CLOSED_C;
turn+=1;
digitalWrite(4,HIGH);
}
if(ran <= 70 && ran > 60 && box7 == OPEN && turn%2 == 1){
box7 = CLOSED_C;
turn+=1;
digitalWrite(3,HIGH);
}
if(ran <= 80 && ran > 70 && box8 == OPEN && turn%2 == 1){
box8 = CLOSED_C;
turn+=1;
digitalWrite(2,HIGH);
}
if(ran <= 90 && ran > 80 && box9 == OPEN && turn%2 == 1){
box9 = CLOSED_C;
turn+=1;
digitalWrite(10,HIGH);
}
}
void loop(){
if(turn%2 == 0){
if(digitalRead(19)== HIGH && box4 == OPEN){
box4 = CLOSED_P;
turn+=1;
}
if(digitalRead(11)==HIGH && box3 == OPEN){
box3 = CLOSED_P;
turn+=1;
}
if(digitalRead(12)==HIGH && box2 == OPEN){
box2 = CLOSED_P;
turn+=1;
}
if(digitalRead(13)== HIGH && box1 == OPEN){
box1 = CLOSED_P;
turn+=1;
}
if(digitalRead(14)== HIGH && box5 == OPEN){
box5 = CLOSED_P;
turn+=1;
}
if(digitalRead(15)== HIGH && box6 == OPEN){
box6 = CLOSED_P;
turn+=1;
}
if(digitalRead(16)== HIGH && box7 == OPEN){
box7 = CLOSED_P;
turn+=1;
}
if(digitalRead(17)== HIGH && box8 == OPEN){
box8 = CLOSED_P;
turn+=1;
}
if(digitalRead(18)== HIGH && box9 == OPEN){
box9 = CLOSED_P;
turn+=1;
}
}
if(turn%2 == 1){
checkComputerWin();
checkPlayerWin();
playRandom();
}
checkGame();
if(game == 0 || game == 2){
delay(2000);
int t;
for(t=0;t<9;t+=1){
digitalWrite(computerArray[t],HIGH);
}
}
}
6 Comments
4 years ago
good work!
but wwhat u have done whith the wires in sketch?
Reply 4 years ago
Sorry. If I at some point knew what sketch was that knowledge and any files from this project are long gone. I worked on this as a part of the Governor's Institute of Vermont at least 4 years ago. If you mean a mock-up of the wiring, I did that in Fritz it seems. If that is what you are looking for, it is attached at the top. Sorry again that I couldn't be of more use.
7 years ago
hello, nice job, do you have a electric schematic to send me please?
Reply 7 years ago
Sorry I do not it was done at a camp over a weekend a while back and I don't think I have any files from that camp left over. Sorry again that I couldn't be of any help
8 years ago
Hi, what could I change in the code if I want to use an FSR instead of a switch.
9 years ago on Introduction
Impressive fritzing work! Updates of classic games can never have enough LEDs.