#include #include #include // Sätter in ett drag i board-vektorn extern int tur; extern int board[9]; extern int keypad; extern redbaby(); extern nollbaby(); bool checkMove(int drag); int convertToCase(int n); int convertFromCase(int n); int checkWin(int board[9]); // Metod sätter DDRen för en specifik pixel void setDDR(int pixel) { switch (pixel) { case 4: DDRD = 0b00000100; DDRB = 0b00000000; break; case 6: DDRD = 0b00000010; DDRB = 0b00000000; break; case 7: DDRD = 0b00000001; DDRB = 0b00000000; break; case 8: DDRD = 0b00100000; DDRB = 0b00000000; break; case 11: DDRD = 0b00001000; DDRB = 0b00000000; break; case 10: DDRD = 0b00010000; DDRB = 0b00000000; break; case 15: DDRD = 0b01000000; DDRB = 0b00000000; break; case 14: DDRB = 0b00000001; DDRD = 0b00000000; break; case 12: DDRB = 0b00000010; DDRD = 0b00000000; break; } } // Metod konverterar vektor- till case-värde int convertToCase(int n) { int newN; if (n == 0) { newN = 12; } else if (n == 1) { newN = 14; } else if (n == 2) { newN = 15; } else if (n == 3) { newN = 8; } else if (n == 4) { newN = 10; } else if (n == 5) { newN = 11; } else if (n == 6) { newN = 4; } else if (n == 7) { newN = 6; } else if (n == 8) { newN = 7; } return newN; } // metod konverterar case- till vektor-värde int convertFromCase(int n) { int newN; if (n == 12) { newN = 0; } else if (n == 14) { newN = 1; } else if (n == 15) { newN = 2; } else if (n == 8) { newN = 3; } else if (n == 10) { newN = 4; } else if (n == 11) { newN = 5; } else if (n == 4) { newN = 6; } else if (n == 6) { newN = 7; } else if (n == 7) { newN = 8; } return newN; } // Denna metod tar alltid in case-värdet void playMove(int plats) { // vektor-värdet av inputen placeras i vektorn board[convertFromCase(plats)] = tur; // metoden setDDR tar input som case-värde, och ingen konvertering behövs därför setDDR(plats); if (tur == 1) { bluebaby(); } else if (tur == 2) { greenbaby(); } int vinnare = checkWin(board); if (vinnare != 0) { winAnimation(vinnare); } } // Om n�gon har vunnit kommer br�det att resetas inf�r ett nytt spel och en spelanimation kommer k�ras // Denna metod kommer att �ndra pixelf�rgen p� alla pixlar beroende p� vem som van, och g�ra n�gon form av animation void winAnimation(int vinnare) { DDRB = 0b00000011; DDRD = 0b01111111; if (vinnare == 2) { while (PINA != 3) { greenbaby(); _delay_ms(1000); nollbaby(); _delay_ms(1000); } } else if (vinnare == 1) { while (PINA != 3) { bluebaby(); _delay_ms(1000); nollbaby(); _delay_ms(1000); } } else if (vinnare == -1) { // r�d loop plz while (PINA != 3) { redbaby(); // r�d1!!!!! _delay_ms(1000); nollbaby(); _delay_ms(1000); } } DDRB = 0b00000011; DDRD = 0b01111111; nollbaby(); DDRD = 0b00000000; DDRB = 0b00000100; redbaby(); // tur = 1; //_delay_ms(1000); } // Metod som kollar om n�gon har vunnit och returnerar is�fall vem. Har ingen vunnit returneras 0 int checkWin(int board[9]) { // Detta kommer att vara lite klurigt att f�rklara utan att rita upp det, men ska f�rs�ka // Kollar den f�rsta rutan i varje x-axel, dvs rutor 0, 3 och 6, inte �r tom och st�mmer �verens med resten av raden // Om det �r sant kommer v�rdet p� den f�rsta rutan i raden att returneras for (int x = 0; x <= 2; x++) { if (board[3 * x] != 0 && board[3 * x] == board[3 * x + 1] && board[3 * x] == board[3 * x + 2]) { return board[3 * x]; } } // Samma princip som innan fast f�r y-axeln. Lite annorlunda kod f�r att f� dessa positioner for (int y = 0; y <= 2; y++) { if (board[y] != 0 && board[y] == board[y + 3] && board[y] == board[y + 6]) { return board[y]; } } // Kod f�r att kolla diagonal 1 och diagonal 2 if (board[0] != 0 && board[0] == board[4] && board[0] == board[8]) { return board[0]; } else if (board[2] != 0 && board[2] == board[4] && board[2] == board[6]) { return board[2]; } // Kollar oavgjort, returnerar -1 i s� fall int cot = 0; for (int i = 0; i <= 8; i++) { if (board[i] != 0) { cot++; } } if (cot == 9) { return -1; } // Om inga linjer har samma v�rden kommer 0 att returneras return 0; } // Kollar om draget �r lagligt, dvs om platsen �r tillg�nglig att l�gga p� bool checkMove(int drag) { if (board[drag] == 0) { return true; } return false; } // Metod f�r att byta den publika variabeln 'tur', vilken best�mmer vems tur det �r att spela (bl� = 1/gr�n = 2) void switchTur() { DDRD = 0b00000000; DDRB = 0b00000100; if (tur == 1) { tur = 2; greenbaby(); } else if (tur == 2) { tur = 1; bluebaby(); } } void resetBoard() { DDRB = 0b00000011; DDRD = 0b01111111; nollbaby(); for (int i = 0; i <= 8; i++) { board[i] = 0; } } // Det ovanför här är main-metoden, och allt nedanför är funktioner // Initierar pinsen, DDR är vilka som ska aktiveras, PORT är 0 för out, 1 för in void init() { DDRA = 0b11110000; DDRB = 0b00000000; DDRC |= 0b00111100; DDRD = 0b00000000; PORTA = 0x00; PORTB = 0x00; PORTC = 0b00111100; // JTAG PORTD = 0b11111000; }