Dzana Hanic
/
IksOksIgra_Grupa4_Tim7
Hanić Džana Karkelja Adna
Fork of US2016_LV3_Z1 by
main.cpp
- Committer:
- 2016US_DzanaHanic
- Date:
- 2016-06-05
- Revision:
- 1:bf8dd0eecb3d
- Parent:
- 0:6ebfd28a8b0c
File content as of revision 1:bf8dd0eecb3d:
#include "mbed.h" #include "N5110.h" #define dp23 P0_0 DigitalOut enable(dp14); //N5110 lcd(VCC,SCE,RST,D/C,MOSI,SCLK,LED) N5110 lcd(dp4, dp24, dp23, dp25, dp2, dp6, dp18); //Analogni ulazi sa dzojstika AnalogIn VRx(dp11); AnalogIn VRy(dp10); Timer debounce; //Taster sa dzojstika InterruptIn SW(dp9); char mode = '0'; //0-prije pokretanja, 1-pocetni ekran, 2-meni, 3-player vs computer, 4-player vs player, 5-result struct Pozicija { int x; int y; bool upisano; bool imaX; bool imaO; }; bool pozvano=false; int brRundi=0; bool naReduCPU=false; bool naReduX = true; bool pobijedioX = false; bool pobijedioO = false; Pozicija pozicija[3][3]; Pozicija trenutnaPozicija; int brPobjedaX = 0, brPobjedaO = 0; int popunjenaPoljaCPU=0; bool prviPotez=true; int trenPoljeX=0,trenPoljeY=0; void postavkaPolja() { //koordinate pocetka kvadratica //prvi red pozicija[0][0].x=0; pozicija[0][0].y=0; pozicija[0][1].x=0; pozicija[0][1].y=16; pozicija[0][2].x=0; pozicija[0][2].y=32; pozicija[0][0].upisano = false; pozicija[0][1].upisano = false; pozicija[0][2].upisano = false; pozicija[0][0].imaX = false; pozicija[0][1].imaX = false; pozicija[0][2].imaX = false; pozicija[0][0].imaO = false; pozicija[0][1].imaO = false; pozicija[0][2].imaO = false; //drugi red pozicija[1][0].x=16; pozicija[1][0].y=0; pozicija[1][1].x=16; pozicija[1][1].y=16; pozicija[1][2].x=16; pozicija[1][2].y=32; pozicija[1][0].upisano = false; pozicija[1][1].upisano = false; pozicija[1][2].upisano = false; pozicija[1][0].imaX = false; pozicija[1][1].imaX = false; pozicija[1][2].imaX = false; pozicija[1][0].imaO = false; pozicija[1][1].imaO = false; pozicija[1][2].imaO = false; //treci red pozicija[2][0].x=32; pozicija[2][0].y=0; pozicija[2][1].x=32; pozicija[2][1].y=16; pozicija[2][2].x=32; pozicija[2][2].y=32; pozicija[2][0].upisano = false; pozicija[2][1].upisano = false; pozicija[2][2].upisano = false; pozicija[2][0].imaX = false; pozicija[2][1].imaX = false; pozicija[2][2].imaX = false; pozicija[2][0].imaO = false; pozicija[2][1].imaO = false; pozicija[2][2].imaO = false; trenutnaPozicija = pozicija[0][0]; popunjenaPoljaCPU=0; } //funkcija za izbor nacina igre PvP, PvC void izborNacinaIgre() { lcd.clear(); mode = '2'; lcd.printString("(Up) P vs C", 0, 2); lcd.printString("(Down) P vs P", 0, 4); } //funkcija za crtanje x void nacrtajX(int x, int y) { lcd.setPixel(x+3, y+3); lcd.setPixel(x+12, y+3); lcd.setPixel(x+4, y+4); lcd.setPixel(x+11, y+4); lcd.setPixel(x+5, y+5); lcd.setPixel(x+10, y+5); lcd.setPixel(x+6, y+6); lcd.setPixel(x+9, y+6); lcd.setPixel(x+7, y+7); lcd.setPixel(x+8, y+7); lcd.setPixel(x+7, y+8); lcd.setPixel(x+8, y+8); lcd.setPixel(x+6, y+9); lcd.setPixel(x+9, y+9); lcd.setPixel(x+5, y+10); lcd.setPixel(x+10, y+10); lcd.setPixel(x+4, y+11); lcd.setPixel(x+11, y+11); lcd.setPixel(x+3, y+12); lcd.setPixel(x+12, y+12); } //funkcija za crtanje o void nacrtajO(int x, int y) { lcd.setPixel(x+3, y+6); lcd.setPixel(x+3, y+7); lcd.setPixel(x+3, y+8); lcd.setPixel(x+3, y+9); lcd.setPixel(x+4, y+5); lcd.setPixel(x+4, y+10); lcd.setPixel(x+5, y+4); lcd.setPixel(x+5, y+11); lcd.setPixel(x+6, y+3); lcd.setPixel(x+6, y+12); lcd.setPixel(x+7, y+3); lcd.setPixel(x+7, y+12); lcd.setPixel(x+8, y+3); lcd.setPixel(x+8, y+12); lcd.setPixel(x+9, y+3); lcd.setPixel(x+9, y+12); lcd.setPixel(x+10, y+4); lcd.setPixel(x+10, y+11); lcd.setPixel(x+11, y+5); lcd.setPixel(x+11, y+10); lcd.setPixel(x+12, y+6); lcd.setPixel(x+12, y+7); lcd.setPixel(x+12, y+8); lcd.setPixel(x+12, y+9); } //funkcija za crtanje pozicije joystick-a za vrijeme igre void nacrtajKursor(int x, int y) { for (int i = x+1; i < x + 15; i++) { for(int j = y+1; j < y +15; j++) { if(((i == x+2|| i == x+13 ) && j!=y+1 && j!= y+14 ) || ((j== y+2 ||j == y + 13) && i!=x+1 && i!= x+14)) lcd.setPixel(i, j); } } } void izbrisiKursor(int x, int y) { for (int i = x+1; i < x + 15; i++) { for(int j = y+1; j < y +15; j++) { if(((i == x+2|| i == x+13 ) && j!=y+1 && j!= y+14 ) || ((j== y+2 ||j == y + 13) && i!=x+1 && i!= x+14)) lcd.clearPixel(i, j); } } } void iscrtajGrid() { //redovi for (int i = 0; i < 47; i++) lcd.setPixel(i, 0); for (int i = 0; i < 47; i++) lcd.setPixel(i, 15); for (int i = 0; i < 47; i++) lcd.setPixel(i, 31); for (int i = 0; i < 47; i++) lcd.setPixel(i, 47); //kolone for (int i = 0; i < 47; i++) lcd.setPixel(0, i); for (int i = 0; i < 47; i++) lcd.setPixel(15, i); for (int i = 0; i < 47; i++) lcd.setPixel(31, i); for (int i = 0; i < 47; i++) lcd.setPixel(47, i); //updateovanje displeja zbog promjena u pikselima lcd.refresh(); } //funkcija za ciscenje mreze nakon odigrane igre void ocistiGrid() { for (int i = 0; i < 47; i++) { for (int j = 0; j < 47; j++) lcd.clearPixel(i,j); } } //funkcija za ispisivanje trenutnog rezultata i icrtavanje polja za novu rundu void iscrtajPoljeNoveRunde () { if ((mode == '3' || mode == '4') && (brPobjedaO + brPobjedaX != 3)) { ocistiGrid(); iscrtajGrid(); postavkaPolja(); trenPoljeX = 0; trenPoljeY = 0; if(brRundi%2 == 0) { naReduCPU=true; naReduX=false; } else {naReduCPU=false; naReduX=true;} prviPotez=true; brRundi++; nacrtajKursor(trenutnaPozicija.x, trenutnaPozicija.y); if(brPobjedaX==1 && brPobjedaO==0) lcd.printString("1 : 0", 50, 4); else if(brPobjedaX==2 && brPobjedaO==0) lcd.printString("2 : 0", 50, 4); else if(brPobjedaX==3 && brPobjedaO==0) lcd.printString("3 : 0", 50, 4); else if(brPobjedaX==0 && brPobjedaO==3) lcd.printString("0 : 3", 50, 4); else if(brPobjedaX==0 && brPobjedaO==2) lcd.printString("0 : 2", 50, 4); else if(brPobjedaX==1 && brPobjedaO==1) lcd.printString("1 : 1", 50, 4); else if(brPobjedaX==0 && brPobjedaO==1) lcd.printString("0 : 1", 50, 4); else if(brPobjedaX==2 && brPobjedaO==1) lcd.printString("2 : 1", 50, 4); else if(brPobjedaX==1 && brPobjedaO==2) lcd.printString("1 : 2", 50, 4); } lcd.refresh(); popunjenaPoljaCPU = 0; pobijedioX = false; pobijedioO = false; } void gore() { izbrisiKursor(trenutnaPozicija.x, trenutnaPozicija.y); if(trenPoljeY == 1 || trenPoljeY == 2) { trenPoljeY--; trenutnaPozicija = pozicija[trenPoljeX][trenPoljeY]; } else if (trenPoljeY == 0) { trenutnaPozicija = pozicija[trenPoljeX][2]; trenPoljeY = 2; } nacrtajKursor(trenutnaPozicija.x, trenutnaPozicija.y); } void dole() { izbrisiKursor(trenutnaPozicija.x, trenutnaPozicija.y); if(trenPoljeY == 0 || trenPoljeY ==1 ) { trenPoljeY++; trenutnaPozicija = pozicija[trenPoljeX][trenPoljeY]; } else if (trenPoljeY == 2 ) { trenPoljeY = 0; trenutnaPozicija = pozicija[trenPoljeX][trenPoljeY]; } nacrtajKursor(trenutnaPozicija.x, trenutnaPozicija.y); } void lijevo() { izbrisiKursor(trenutnaPozicija.x, trenutnaPozicija.y); if(trenPoljeX == 2 || trenPoljeX == 1) { trenPoljeX--; trenutnaPozicija = pozicija[trenPoljeX][trenPoljeY]; } else if (trenPoljeX == 0) { trenutnaPozicija = pozicija[2][trenPoljeY]; trenPoljeX=2; } nacrtajKursor(trenutnaPozicija.x, trenutnaPozicija.y); } void desno() { izbrisiKursor(trenutnaPozicija.x, trenutnaPozicija.y); if(trenPoljeX == 0 || trenPoljeX == 1) { trenPoljeX++; trenutnaPozicija = pozicija[trenPoljeX][trenPoljeY]; } else if (trenPoljeX == 2) { trenutnaPozicija = pozicija[0][trenPoljeY]; trenPoljeX=0; } nacrtajKursor(trenutnaPozicija.x, trenutnaPozicija.y); } //provjerava ishod igre bool provjeriPobjedu() { int brojacRedovaX = 0, brojacDijagonalaX1 = 0, brojacDijagonalaX2 = 0, brojacKolonaX= 0, br =0; for(int i=0; i<3; i++) { for(int j=0; j<3; j++) { if (pozicija[i][j].imaX == true) brojacRedovaX++; if (pozicija[j][i].imaX == true) brojacKolonaX++; if (i == j && pozicija[i][j].imaX == true) brojacDijagonalaX1++; if (j == 3 - i -1 && pozicija[i][j].imaX == true) brojacDijagonalaX2++; //provjerava da li su sva polja popunjena (nerijesen ishod) if (pozicija[i][j].upisano) br++; } if(brojacRedovaX == 3 || brojacDijagonalaX1 == 3 || brojacKolonaX == 3 || brojacDijagonalaX2 == 3) { brPobjedaX++; pobijedioX = true; pobijedioO = false; return true; } brojacRedovaX = 0; brojacKolonaX = 0; } int brojacRedovaO = 0, brojacDijagonalaO1 = 0, brojacKolonaO = 0, brojacDijagonalaO2 = 0; for(int i=0; i<3; i++) { for(int j=0; j<3; j++) { if (pozicija[i][j].imaO == true) brojacRedovaO++; if (pozicija[j][i].imaO == true) brojacKolonaO++; if (i == j && pozicija[i][j].imaO == true) brojacDijagonalaO1++; if (j == 3 - i -1 && pozicija[i][j].imaO == true) brojacDijagonalaO2++; } if(brojacRedovaO == 3 || brojacDijagonalaO1 == 3 || brojacDijagonalaO2 == 3 || brojacKolonaO == 3 ) { brPobjedaO++; pobijedioX = false; pobijedioO = true; return true; } brojacRedovaO = 0; brojacKolonaO = 0; } if (br == 9) { pobijedioX = false; pobijedioO = false; return true; } pobijedioX = false; pobijedioO = false; return false; } void zavrsenaIgra() { lcd.clear(); lcd.printString("Final ", 0 ,1); if (brPobjedaX > brPobjedaO) { lcd.printString("Winner: X", 0, 1); } else lcd. printString ("Winner: O", 0, 2); wait(2); lcd.clear(); lcd.printString("Game over!", 1, 1); } void zavrsenaRunda(char c) { lcd.clear(); if(c =='x') { lcd.printString("Winner: X", 0, 1); } else if(c =='o') lcd. printString ("Winner: O", 0, 2); else lcd.printString("Tie!", 0, 3); wait(2); lcd.clear(); } bool pobjediBlokirajCPU() { //Kompjuter prvo provjerava mogućnosti njegove pobjede, pa blokiranja pobjede drugog igrača int brojacRedovaO = 0, brojacDijagonalaO1 = 0, brojacDijagonalaO2 = 0, brojacKolonaO = 0; int brojacRedovaX = 0, brojacDijagonalaX1 = 0, brojacDijagonalaX2 = 0, brojacKolonaX = 0; int pobijediRed=0,pobijedikolona=0; int blokirajRed = 0, blokirajKolona = 0; // prilika da cpu pobijedi - ima dva O u redu/koloni/dijagonali for(int i=0; i<3; i++) { for(int j=0; j<3; j++) { if (pozicija[i][j].imaO == true) { brojacRedovaO++; pobijediRed=i; } if (pozicija[j][i].imaO == true) { brojacKolonaO++; pobijedikolona=i; } if ( i== j && pozicija[i][j].imaO == true) { brojacDijagonalaO1++; } if ( j == 3 - i -1 && pozicija [i][j].imaO== true) { brojacDijagonalaO2++; } //CPU blokira protivnika ukoliko je brojac X=2 if (pozicija[i][j].imaX == true) { brojacRedovaX++; blokirajRed = i; } if (pozicija[j][i].imaX == true) { brojacKolonaX++; blokirajKolona = i; } if ( i== j && pozicija[i][j].imaX == true) brojacDijagonalaX1++; if ( j == 3 - i -1 && pozicija [i][j].imaX == true) brojacDijagonalaX2++; } //primjer za 2 u redu if(brojacRedovaO == 2) { for(int k=0; k<3; k++) { if(pozicija[pobijediRed][k].upisano==false) { nacrtajO(pozicija[pobijediRed][k].x, pozicija[pobijediRed][k].y); pozicija[pobijediRed][k].upisano=true; pozicija[pobijediRed][k].imaO=true; return true; } } } else if(brojacKolonaO== 2) { for(int k=0; k<3; k++) { if(pozicija[k][pobijedikolona].upisano==false) { nacrtajO(pozicija[k][pobijedikolona].x, pozicija[k][pobijedikolona].y); pozicija[k][pobijedikolona].upisano=true; pozicija[k][pobijedikolona].imaO=true; return true; } } } else if(brojacDijagonalaO1== 2) { for(int k=0; k<3; k++) { if(pozicija[k][k].upisano==false) { nacrtajO(pozicija[k][k].x, pozicija[k][k].y); pozicija[k][k].upisano=true; pozicija[k][k].imaO=true; return true; } } } else if(brojacDijagonalaO2== 2) { for(int k=0; k<3; k++) { if(pozicija[k][3-k-1].upisano==false) { nacrtajO(pozicija[k][3-k-1].x, pozicija[k][3-k-1].y); pozicija[k][3-k-1].upisano=true; pozicija[k][3-k-1].imaO=true; return true; } } } if (brojacRedovaX == 2) { for ( int k = 0; k<3; k++) { if (pozicija[blokirajRed][k].upisano == false) { nacrtajO(pozicija[blokirajRed][k].x, pozicija[blokirajRed][k].y); pozicija[blokirajRed][k].upisano = true; pozicija[blokirajRed][k].imaO=true; return true; } } } else if (brojacKolonaX == 2) { for ( int k = 0; k<3; k++) { if(pozicija[k][blokirajKolona].upisano == false) { nacrtajO(pozicija[k][blokirajKolona].x, pozicija[k][blokirajKolona].y); pozicija[k][blokirajKolona].imaO=true; pozicija[k][blokirajKolona].upisano=true; return true; } } } else if (brojacDijagonalaX1 == 2) { for ( int k = 0; k<3; k++) { if(pozicija[k][k].upisano == false) { nacrtajO(pozicija[k][k].x, pozicija[k][k].y); pozicija[k][k].imaO=true; pozicija[k][k].upisano =true; return true; } } } else if (brojacDijagonalaX2 == 2) { for ( int k = 0; k<3; k++) { if(pozicija[k][3 - k - 1].upisano == false) { nacrtajO(pozicija[k][3- k -1].x, pozicija[k][3 - k - 1].y); pozicija[k][3- k -1].imaO=true; pozicija[k][3 - k - 1].upisano = true; return true; } } } brojacRedovaO = 0; brojacKolonaO = 0; brojacRedovaX = 0; brojacKolonaX = 0; } return false; } bool provjeriUgloveCPU() { if(pozicija[0][0].upisano==false) { nacrtajO(pozicija[0][0].x, pozicija[0][0].y); pozicija[0][0].imaO=true; pozicija[0][0].upisano=true; return true; } else if(pozicija[0][2].upisano==false) { nacrtajO(pozicija[0][2].x, pozicija[0][2].y); pozicija[0][2].imaO=true; pozicija[0][2].upisano=true; return true; } else if(pozicija[2][0].upisano==false) { nacrtajO(pozicija[2][0].x, pozicija[2][0].y); pozicija[2][0].imaO=true; pozicija[2][0].upisano=true; return true; } else if(pozicija[2][2].upisano==false) { nacrtajO(pozicija[2][2].x, pozicija[2][2].y); pozicija[2][2].imaO=true; pozicija[2][2].upisano=true; return true; } return false; } bool generisiPotezCPU() { int brojacRedovaO = 0, brojacKolonaO = 0; int odigrajRed=0,odigrajkolona=0; for(int i=0; i<3; i++) { for(int j=0; j<3; j++) { if (pozicija[i][j].imaO == true) { if(pozicija[i][j].imaX == true) { brojacRedovaO = 0; break; } brojacRedovaO++; odigrajRed=i; } if (pozicija[j][i].imaO == true) { if(pozicija[i][j].imaX == true) { brojacKolonaO = 0; break; } brojacKolonaO++; odigrajkolona=i; } } if(brojacRedovaO == 1) { for(int k=0; k<3; k++) { if(pozicija[odigrajRed][k].upisano==false) { nacrtajO(pozicija[odigrajRed][k].x, pozicija[odigrajRed][k].y); pozicija[odigrajRed][k].upisano=true; pozicija[odigrajRed][k].imaO=true; return true; } } } else if(brojacKolonaO== 1) { for(int k=0; k<3; k++) { if(pozicija[k][odigrajkolona].upisano==false) { nacrtajO(pozicija[k][odigrajkolona].x, pozicija[k][odigrajkolona].y); pozicija[k][odigrajkolona].upisano=true; pozicija[k][odigrajkolona].imaO=true; return true; } } } brojacRedovaO = 0; brojacKolonaO = 0; } return false; } void potezKompjutera() { if(popunjenaPoljaCPU==1 && provjeriUgloveCPU() && brRundi%2 != 0 ) { return; } //ako CPU igra prvi, zapocinje sa oznakom u centru else if(popunjenaPoljaCPU==0 && pozicija[1][1].upisano==false) { // wait(0.5); nacrtajO(pozicija[1][1].x, pozicija[1][1].y); pozicija[1][1].imaO=true; pozicija[1][1].upisano=true; return; } else if(pobjediBlokirajCPU()) { return; } else if(generisiPotezCPU()) { return; } else if(provjeriUgloveCPU()) { return; } popunjenaPoljaCPU++; } void odigrajPotez () { if(debounce.read_ms() > 200) { if (trenutnaPozicija.upisano == false) { if (naReduX || (naReduCPU && mode=='3') || (!prviPotez && mode=='3' && brRundi%2!=0) ) { /*ReduCPU*/ if(!naReduCPU && mode=='3') { if(pozicija[trenPoljeX][trenPoljeY].upisano == false) { nacrtajX(trenutnaPozicija.x, trenutnaPozicija.y); pozicija[trenPoljeX][trenPoljeY].imaX = true; pozicija[trenPoljeX][trenPoljeY].upisano = true; } } else if(mode=='4') { if(pozicija[trenPoljeX][trenPoljeY].upisano == false) { nacrtajX(trenutnaPozicija.x, trenutnaPozicija.y); pozicija[trenPoljeX][trenPoljeY].imaX = true; pozicija[trenPoljeX][trenPoljeY].upisano = true; } } if(mode=='4') //Ako je player vs player- pređi na Oks igrača naReduX = false; else if(mode=='3') { potezKompjutera(); naReduCPU=false; //Ako je player vs CPU - preskoči Oks igrača (prvi ostaje true)- idi na CPU potez } } else if (!naReduX && mode=='4') { if(pozicija[trenPoljeX][trenPoljeY].upisano == false) { nacrtajO(trenutnaPozicija.x, trenutnaPozicija.y); pozicija[trenPoljeX][trenPoljeY].imaO = true; pozicija[trenPoljeX][trenPoljeY].upisano = true; naReduX = true; } } } prviPotez=false; if (provjeriPobjedu()) { lcd.refresh(); if(pobijedioX==true)zavrsenaRunda('x'); else if(pobijedioO==true) zavrsenaRunda('o'); else zavrsenaRunda('t'); iscrtajPoljeNoveRunde(); } if (brPobjedaX + brPobjedaO == 3)zavrsenaIgra(); } debounce.reset(); } //funkcija za ispisivanje pocetnog ekrana void startniMode() { lcd.clear(); lcd.printString("Tic-Tac-Toe",1, 2); wait(2); mode = '1'; //Prelazak na ekran odabira nakon 2 sekunde izborNacinaIgre(); } void glavniMode() { iscrtajGrid(); if (mode == '4') { lcd.printString("P vs P",50,0); } if (mode == '3') { lcd.printString("P vs CPU ",50,1); } nacrtajKursor(trenutnaPozicija.x, trenutnaPozicija.y); lcd.printString("0:0",50,4); } int main() { //deaktivacija led dioda enable = 1; //inicijalizacija displeja lcd.init(); //Aktivacija pull-up otpornika SW.mode(PullUp); //pozivanje pocetnog ekrana startniMode(); trenPoljeX = 0; trenPoljeY = 0; postavkaPolja(); debounce.start(); SW.rise(&odigrajPotez); //potez igrača while(1) { // pozicijaJoysticka(); if (mode == '2') { //Klikom na taster if( VRy > 2.0/3.0) { mode = '3'; } //donji klik na taster else if (VRy < 1.0/3.0) { mode = '4'; } } //wait (0.01); if(pozvano ==false) { if(mode == '3' || mode == '4') { lcd.clear(); glavniMode(); pozvano=true; } } if(pozvano==true) { lcd.printString("",0,0); if (VRy < 1.0/3.0) { dole(); wait(0.3); } else if(VRy > 2.0/3.0) { gore(); wait(0.3); } else if (VRx < 1.0/3.0) { desno(); wait(0.3); } else if(VRx > 2.0/3.0) { lijevo(); wait(0.3); } } } }