Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- 2019US_AminaKantic
- Date:
- 2019-06-15
- Revision:
- 0:41aae9a4c212
File content as of revision 0:41aae9a4c212:
#include "mbed.h" #include "N5110.h" #define dp23 P0_0 N5110 lcd(dp4, dp24, dp23, dp25, dp2, dp6, dp18); AnalogIn VRx (dp11); AnalogIn VRy (dp10); InterruptIn SW (dp9); Timer timer; Timer seed; Timeout t1, t2, cp; struct Point { int x; int y; }; Point p[9] = {{14, 9}, {41, 9}, {68, 9}, {14, 24}, {41, 24}, {68, 24}, {14, 39}, {41, 39}, {68, 39}}; int currentPointX = 1; int currentPointY = 1; int fields[9] = {0,0,0,0,0,0,0,0,0}; int computer, gameType = 1; bool turnX = true; enum State {Menu, Turn, AITurn, Pause, End}; State state = Menu; bool canMove = true; int winner; int RandomNumber() { return seed.read_ms(); } void DrawRow(int y) { for(int i = 0; i < 84; i++) { lcd.setPixel(i, y); } } void DrawColumn(int x) { for(int i = 0; i < 48; i++) { lcd.setPixel(x, i); } } void DrawBorder() { DrawRow(0); DrawRow(1); DrawRow(46); DrawRow(47); DrawColumn(0); DrawColumn(1); DrawColumn(82); DrawColumn(83); } void DrawGrid() { DrawBorder(); DrawColumn(28); DrawColumn(55); DrawRow(16); DrawRow(31); } void DrawX(int t) { fields[t-1] = 1; int x = p[t-1].x; int y = p[t-1].y; lcd.setPixel(x,y); lcd.setPixel(x+1, y); lcd.setPixel(x, y-1); lcd.setPixel(x+1, y-1); for(int i = 0; i < 4; i++) { lcd.setPixel(x-1, y+1); lcd.setPixel(x+2, y+1); lcd.setPixel(x-1, y-2); lcd.setPixel(x+2, y-2); lcd.setPixel(x-2, y+2); lcd.setPixel(x+3, y+2); lcd.setPixel(x-2, y-3); lcd.setPixel(x+3, y-3); lcd.setPixel(x-3, y+3); lcd.setPixel(x+4, y+3); lcd.setPixel(x-3, y-4); lcd.setPixel(x+4, y-4); lcd.setPixel(x-4, y+4); lcd.setPixel(x+5, y+4); lcd.setPixel(x-4, y-5); lcd.setPixel(x+5, y-5); } lcd.refresh(); } void DrawO(int t) { fields[t-1] = 2; int x = p[t-1].x; int y = p[t-1].y-1; for(int i = x-2; i < x+4; i++) { lcd.setPixel(i, y-4); lcd.setPixel(i, y+5); } for(int i = y-1; i < y+3; i++) { lcd.setPixel(x-5, i); lcd.setPixel(x+6, i); } for(int i = 0; i < 2; i++) { lcd.setPixel(x-4, y-2); lcd.setPixel(x-3, y-3); lcd.setPixel(x-4, y+3); lcd.setPixel(x-3, y+4); lcd.setPixel(x+5, y-2); lcd.setPixel(x+4, y-3); lcd.setPixel(x+5, y+3); lcd.setPixel(x+4, y+4); } lcd.refresh(); } void DrawSelector(int t) { int x = p[t-1].x; int y = p[t-1].y-1; for(int i = x-11; i < x+13; i++) { lcd.setPixel(i, y-6); lcd.setPixel(i, y+7); } for(int i = y-5; i < y+7; i++) { lcd.setPixel(x-12, i); lcd.setPixel(x+13, i); } lcd.refresh(); } void DeleteSelector(int t) { int x = p[t-1].x; int y = p[t-1].y-1; for(int i = x-11; i < x+13; i++) { lcd.clearPixel(i, y-6); lcd.clearPixel(i, y+7); } for(int i = y-5; i < y+7; i++) { lcd.clearPixel(x-12, i); lcd.clearPixel(x+13, i); } lcd.refresh(); } bool WinX(){ if(fields[0]==1 && fields[1]==1 && fields[2]==1) return true; else if(fields[3]==1 && fields[4]==1 && fields[5]==1) return true; else if(fields[6]==1 && fields[7]==1 && fields[8]==1) return true; else if(fields[0]==1 && fields[3]==1 && fields[6]==1) return true; else if(fields[1]==1 && fields[4]==1 && fields[7]==1) return true; else if(fields[2]==1 && fields[5]==1 && fields[8]==1) return true; else if(fields[0]==1 && fields[4]==1 && fields[8]==1) return true; else if(fields[2]==1 && fields[4]==1 && fields[6]==1) return true; return false; } bool WinO(){ if(fields[0]==2 && fields[1]==2 && fields[2]==2) return true; else if(fields[3]==2 && fields[4]==2 && fields[5]==2) return true; else if(fields[6]==2 && fields[7]==2 && fields[8]==2) return true; else if(fields[0]==2 && fields[3]==2 && fields[6]==2) return true; else if(fields[1]==2 && fields[4]==2 && fields[7]==2) return true; else if(fields[2]==2 && fields[5]==2 && fields[8]==2) return true; else if(fields[0]==2 && fields[4]==2 && fields[8]==2) return true; else if(fields[2]==2 && fields[4]==2 && fields[6]==2) return true; return false; } bool TieCheck() { for(int i = 0; i < 9; i++) { if(fields[i] == 0) return false; } return true; } void Start(); void Reset() { state = Menu; SW.rise(&Start); for(int i = 0; i < 9; i++) fields[i] = 0; currentPointX = 1; currentPointY = 1; turnX = true; gameType = 1; } void DrawMeni(){ Reset(); lcd.clear(); DrawBorder(); lcd.printString ("TIC-TAC-TOE" , 10,1); lcd.printString ("1 player " , 20,3); lcd.printString ("2 players" , 20,4); lcd.setPixel(15, 28); lcd.setPixel(15, 27); lcd.setPixel(14, 27); lcd.setPixel(14, 28); lcd.refresh(); } void DrawWin(){ state = End; lcd.clear(); DrawBorder(); if(winner == 0) { lcd.printString("Winner is" ,15 ,2); if(gameType == 0) lcd.printString("Player 1" ,15 ,4); else lcd.printString("Player" ,15 ,4); } if(winner == 1) { lcd.printString("Winner is" ,15 ,2); if(gameType == 0) lcd.printString("Player 2" ,15 ,4); else lcd.printString("Player" ,15 ,4); } if(winner == 2) { lcd.printString("Winner is" ,15 ,2); lcd.printString("Computer" ,15 ,4); } if(winner == 3) lcd.printString ("It's a tie!" ,15 ,3); lcd.refresh(); t2.attach(&DrawMeni, 3.0); } void ComputerTurn() { if(state != AITurn) return; int field = -1; int player = (computer%2)+1; if(fields[0] == computer) { if(fields[1] == computer && fields[2] == 0) { field = 2; } else if(fields[2] == computer && fields[1] == 0) { field = 1; } else if(fields[3] == computer && fields[6] == 0) { field = 6; } else if(fields[6] == computer && fields[3] == 0) { field = 3; } else if(fields[4] == computer && fields[8] == 0) { field = 8; } else if(fields[8] == computer && fields[4] == 0) { field = 4; } } if(fields[1] == computer && field == -1) { if(fields[4] == computer && fields[7] == 0) { field = 7; } else if(fields[7] == computer && fields[4] == 0) { field = 4; } else if(fields[2] == computer && fields[0] == 0) { field = 0; } } if(fields[2] == computer && field == -1) { if(fields[5] == computer && fields[8] == 0) { field = 8; } else if(fields[8] == computer && fields[5] == 0) { field = 5; } else if(fields[4] == computer && fields[6] == 0) { field = 6; } else if(fields[6] == computer && fields[4] == 0) { field = 4; } } if(fields[3] == computer && field == -1) { if(fields[6] == computer && fields[0] == 0) { field = 0; } else if(fields[4] == computer && fields[5] == 0) { field = 5; } else if(fields[5] == computer && fields[4] == 0) { field = 4; } } if(fields[4] == computer && field == -1) { if(fields[5] == computer && fields[3] == 0) { field = 3; } else if(fields[7] == computer && fields[1] == 0) { field = 1; } else if(fields[8] == computer && fields[0] == 0) { field = 0; } else if(fields[6] == computer && fields[2] == 0) { field = 2; } } if(fields[5] == computer && field == -1) { if(fields[8] == computer && fields[2] == 0) { field = 2; } } if(fields[6] == computer && field == -1) { if(fields[7] == computer && fields[8] == 0) { field = 8; } if(fields[8] == computer && fields[7] == 0) { field = 7; } } if(fields[7] == computer && field == -1) { if(fields[8] == computer && fields[6] == 0) { field = 6; } } if(fields[0] == player) { if(fields[1] == player && fields[2] == 0) { field = 2; } else if(fields[2] == player && fields[1] == 0) { field = 1; } else if(fields[3] == player && fields[6] == 0) { field = 6; } else if(fields[6] == player && fields[3] == 0) { field = 3; } else if(fields[4] == player && fields[8] == 0) { field = 8; } else if(fields[8] == player && fields[4] == 0) { field = 4; } } if(fields[1] == player && field == -1) { if(fields[4] == player && fields[7] == 0) { field = 7; } else if(fields[7] == player && fields[4] == 0) { field = 4; } else if(fields[2] == player && fields[0] == 0) { field = 0; } } if(fields[2] == player && field == -1) { if(fields[5] == player && fields[8] == 0) { field = 8; } else if(fields[8] == player && fields[5] == 0) { field = 5; } else if(fields[4] == player && fields[6] == 0) { field = 6; } else if(fields[6] == player && fields[4] == 0) { field = 4; } } if(fields[3] == player && field == -1) { if(fields[6] == player && fields[0] == 0) { field = 0; } else if(fields[4] == player && fields[5] == 0) { field = 5; } else if(fields[5] == player && fields[4] == 0) { field = 4; } } if(fields[4] == player && field == -1) { if(fields[5] == player && fields[3] == 0) { field = 3; } else if(fields[7] == player && fields[1] == 0) { field = 1; } else if(fields[8] == player && fields[0] == 0) { field = 0; } else if(fields[6] == player && fields[2] == 0) { field = 2; } } if(fields[5] == player && field == -1) { if(fields[8] == player && fields[2] == 0) { field = 2; } } if(fields[6] == player && field == -1) { if(fields[7] == player && fields[8] == 0) { field = 8; } if(fields[8] == player && fields[7] == 0) { field = 7; } } if(fields[7] == player && field == -1) { if(fields[8] == player && fields[6] == 0) { field = 6; } } if(field == -1) { do{ field = RandomNumber()%9; } while(fields[field] != 0); } if(turnX) DrawX(field+1); else DrawO(field+1); if(WinX() || WinO()) { state = End; winner = 2; t1.attach(&DrawWin, 1.0); } else if(TieCheck()) { state = End; winner = 3; t1.attach(&DrawWin, 1.0); } state = Turn; turnX = !turnX; } void Move() { if(state != Turn && state != Menu) return; if(state == Turn) { if(VRy > 1.0/3.0 && VRy < 2.0/3.0 && canMove) { bool change = false; bool inc; if(VRx < 1.0/3.0 && currentPointX > 0) { currentPointX--; inc = false; change = true; canMove = false; } if(VRx > 2.0/3.0 && currentPointX < 2) { currentPointX++; inc = true; change = true; canMove = false; } if(change) { if(!inc) { DeleteSelector(currentPointY*3 + currentPointX+2); } else { DeleteSelector(currentPointY*3 + currentPointX); } DrawSelector(currentPointY*3 + currentPointX+1); } } else if(VRx > 1.0/3.0 && VRx < 2.0/3.0 && canMove) { bool change = false; bool inc; if(VRy < 1.0/3.0 && currentPointY > 0) { currentPointY--; inc = false; change = true; canMove = false; } if(VRy > 2.0/3.0 && currentPointY < 2) { currentPointY++; inc = true; change = true; canMove = false; } if(change) { if(!inc) { DeleteSelector((currentPointY+1)*3 + currentPointX+1); } else { DeleteSelector((currentPointY-1)*3 + currentPointX+1); } DrawSelector(currentPointY*3 + currentPointX+1); } } else if(!canMove && VRx > 1.0/3.0 && VRx < 2.0/3.0 && VRy > 1.0/3.0 && VRy < 2.0/3.0) { canMove = true; } } else if(state == Menu) { if(VRy < 1.0/3.0 && gameType == 1) { gameType = 0; lcd.setPixel(15, 35); lcd.setPixel(15, 34); lcd.setPixel(14, 34); lcd.setPixel(14, 35); lcd.clearPixel(15, 28); lcd.clearPixel(15, 27); lcd.clearPixel(14, 27); lcd.clearPixel(14, 28); lcd.refresh(); } if(VRy > 2.0/3.0 && gameType == 0) { gameType = 1; lcd.setPixel(15, 28); lcd.setPixel(15, 27); lcd.setPixel(14, 27); lcd.setPixel(14, 28); lcd.clearPixel(15, 35); lcd.clearPixel(15, 34); lcd.clearPixel(14, 34); lcd.clearPixel(14, 35); lcd.refresh(); } } } void PlayerTurn() { if(state != Turn) return; int f = currentPointY*3 + currentPointX; if(fields[f] != 0) { return; } state = Pause; if(turnX == true) DrawX(f+1); else DrawO(f+1); turnX = !turnX; if(WinX()) { if(gameType == 0){ winner = 0; } else{ if(computer != 1) winner = 0; else winner = 2; } state = End; t1.attach(&DrawWin, 1.0); } else if(WinO()) { if(gameType == 0){ winner = 1; } else{ if(computer != 2) winner = 1; else winner = 2; } state = End; t1.attach(&DrawWin, 1.0); } else if(TieCheck()) { state = End; winner = 3; t1.attach(&DrawWin, 1.0); }else{ if(gameType == 1) { state = AITurn; cp.attach(&ComputerTurn, 0.5); } else { state = Turn; } } } void Start() { if(state != Menu) return; state = Pause; timer.start(); lcd.clear(); DrawBorder(); DrawGrid(); DrawSelector(5); if(gameType == 1) { computer = RandomNumber()%2+1; if(computer == 1) { state = AITurn; wait(0.5); ComputerTurn(); } else { state = Turn; } } else { state = Turn; } lcd.refresh(); } int main() { state = Menu; lcd.init(); lcd.refresh(); SW.mode(PullUp); DrawMeni(); seed.start(); while(1) { Move(); if(timer.read_ms() > 1000) { SW.rise(&PlayerTurn); timer.reset(); timer.stop(); } if(seed.read_ms() == 100000) { seed.reset(); seed.start(); } } }