completed with EvolutionOfWar
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
Fork of Lab4-Reversi by
Reversi.cpp@1:cc72ad58982b, 2016-11-01 (annotated)
- Committer:
- aolmenki
- Date:
- Tue Nov 01 11:46:09 2016 +0000
- Revision:
- 1:cc72ad58982b
- Parent:
- 0:fce0f9489de3
reversi v1 with EvolutionofWar;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EvolutionOfWar | 0:fce0f9489de3 | 1 | #include "mbed.h" |
EvolutionOfWar | 0:fce0f9489de3 | 2 | #include "uLCD_4DGL.h" |
aolmenki | 1:cc72ad58982b | 3 | #include "SDFileSystem.h" |
aolmenki | 1:cc72ad58982b | 4 | #include "wave_player.h" |
EvolutionOfWar | 0:fce0f9489de3 | 5 | uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object |
aolmenki | 1:cc72ad58982b | 6 | SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board |
aolmenki | 1:cc72ad58982b | 7 | PwmOut Speaker(p21); |
aolmenki | 1:cc72ad58982b | 8 | AnalogOut DACout(p18); |
EvolutionOfWar | 0:fce0f9489de3 | 9 | |
aolmenki | 1:cc72ad58982b | 10 | wave_player waver(&DACout); |
EvolutionOfWar | 0:fce0f9489de3 | 11 | |
EvolutionOfWar | 0:fce0f9489de3 | 12 | class Nav_Switch |
EvolutionOfWar | 0:fce0f9489de3 | 13 | { |
EvolutionOfWar | 0:fce0f9489de3 | 14 | public: |
EvolutionOfWar | 0:fce0f9489de3 | 15 | Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire); |
EvolutionOfWar | 0:fce0f9489de3 | 16 | int read(); |
EvolutionOfWar | 0:fce0f9489de3 | 17 | //boolean functions to test each switch |
EvolutionOfWar | 0:fce0f9489de3 | 18 | bool up(); |
EvolutionOfWar | 0:fce0f9489de3 | 19 | bool down(); |
EvolutionOfWar | 0:fce0f9489de3 | 20 | bool left(); |
EvolutionOfWar | 0:fce0f9489de3 | 21 | bool right(); |
EvolutionOfWar | 0:fce0f9489de3 | 22 | bool fire(); |
EvolutionOfWar | 0:fce0f9489de3 | 23 | //automatic read on RHS |
EvolutionOfWar | 0:fce0f9489de3 | 24 | operator int (); |
EvolutionOfWar | 0:fce0f9489de3 | 25 | //index to any switch array style |
EvolutionOfWar | 0:fce0f9489de3 | 26 | bool operator[](int index) { |
EvolutionOfWar | 0:fce0f9489de3 | 27 | return _pins[index]; |
EvolutionOfWar | 0:fce0f9489de3 | 28 | }; |
EvolutionOfWar | 0:fce0f9489de3 | 29 | private: |
EvolutionOfWar | 0:fce0f9489de3 | 30 | BusIn _pins; |
EvolutionOfWar | 0:fce0f9489de3 | 31 | |
EvolutionOfWar | 0:fce0f9489de3 | 32 | }; |
EvolutionOfWar | 0:fce0f9489de3 | 33 | Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire): |
EvolutionOfWar | 0:fce0f9489de3 | 34 | _pins(up, down, left, right, fire) |
EvolutionOfWar | 0:fce0f9489de3 | 35 | { |
EvolutionOfWar | 0:fce0f9489de3 | 36 | _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise |
EvolutionOfWar | 0:fce0f9489de3 | 37 | wait(0.001); //delays just a bit for pullups to pull inputs high |
EvolutionOfWar | 0:fce0f9489de3 | 38 | } |
EvolutionOfWar | 0:fce0f9489de3 | 39 | inline bool Nav_Switch::up() |
EvolutionOfWar | 0:fce0f9489de3 | 40 | { |
EvolutionOfWar | 0:fce0f9489de3 | 41 | return !(_pins[0]); |
EvolutionOfWar | 0:fce0f9489de3 | 42 | } |
EvolutionOfWar | 0:fce0f9489de3 | 43 | inline bool Nav_Switch::down() |
EvolutionOfWar | 0:fce0f9489de3 | 44 | { |
EvolutionOfWar | 0:fce0f9489de3 | 45 | return !(_pins[1]); |
EvolutionOfWar | 0:fce0f9489de3 | 46 | } |
EvolutionOfWar | 0:fce0f9489de3 | 47 | inline bool Nav_Switch::left() |
EvolutionOfWar | 0:fce0f9489de3 | 48 | { |
EvolutionOfWar | 0:fce0f9489de3 | 49 | return !(_pins[2]); |
EvolutionOfWar | 0:fce0f9489de3 | 50 | } |
EvolutionOfWar | 0:fce0f9489de3 | 51 | inline bool Nav_Switch::right() |
EvolutionOfWar | 0:fce0f9489de3 | 52 | { |
EvolutionOfWar | 0:fce0f9489de3 | 53 | return !(_pins[3]); |
EvolutionOfWar | 0:fce0f9489de3 | 54 | } |
EvolutionOfWar | 0:fce0f9489de3 | 55 | inline bool Nav_Switch::fire() |
EvolutionOfWar | 0:fce0f9489de3 | 56 | { |
EvolutionOfWar | 0:fce0f9489de3 | 57 | return !(_pins[4]); |
EvolutionOfWar | 0:fce0f9489de3 | 58 | } |
EvolutionOfWar | 0:fce0f9489de3 | 59 | inline int Nav_Switch::read() |
EvolutionOfWar | 0:fce0f9489de3 | 60 | { |
EvolutionOfWar | 0:fce0f9489de3 | 61 | return _pins.read(); |
EvolutionOfWar | 0:fce0f9489de3 | 62 | } |
EvolutionOfWar | 0:fce0f9489de3 | 63 | inline Nav_Switch::operator int () |
EvolutionOfWar | 0:fce0f9489de3 | 64 | { |
EvolutionOfWar | 0:fce0f9489de3 | 65 | return _pins.read(); |
EvolutionOfWar | 0:fce0f9489de3 | 66 | } |
EvolutionOfWar | 0:fce0f9489de3 | 67 | |
EvolutionOfWar | 0:fce0f9489de3 | 68 | Nav_Switch myNav( p14, p11, p12, p10, p13); //pin order on Sparkfun breakout |
EvolutionOfWar | 0:fce0f9489de3 | 69 | |
aolmenki | 1:cc72ad58982b | 70 | int turn = 1; // black goes on 1, white goes on 2 (or 0) |
EvolutionOfWar | 0:fce0f9489de3 | 71 | int gb[8][8]; |
EvolutionOfWar | 0:fce0f9489de3 | 72 | int NUM_COLS = 8; |
EvolutionOfWar | 0:fce0f9489de3 | 73 | int NUM_ROWS = 8; |
aolmenki | 1:cc72ad58982b | 74 | int xCoor = 3; |
aolmenki | 1:cc72ad58982b | 75 | int yCoor = 4; |
aolmenki | 1:cc72ad58982b | 76 | int numBlack = 0; |
aolmenki | 1:cc72ad58982b | 77 | int numWhite = 0; |
aolmenki | 1:cc72ad58982b | 78 | bool moved = false; |
aolmenki | 1:cc72ad58982b | 79 | bool gameover = false; |
aolmenki | 1:cc72ad58982b | 80 | |
EvolutionOfWar | 0:fce0f9489de3 | 81 | void initialize_game_board() |
EvolutionOfWar | 0:fce0f9489de3 | 82 | { |
EvolutionOfWar | 0:fce0f9489de3 | 83 | //This is a nested loop to make sure every cell is empty |
EvolutionOfWar | 0:fce0f9489de3 | 84 | //Cell Codes: 0 = empty, 1 = white piece, 2 = black piece |
EvolutionOfWar | 0:fce0f9489de3 | 85 | for (int i = 0; i < NUM_ROWS; i++) |
EvolutionOfWar | 0:fce0f9489de3 | 86 | { |
EvolutionOfWar | 0:fce0f9489de3 | 87 | for (int j = 0; j < NUM_COLS; j++) |
EvolutionOfWar | 0:fce0f9489de3 | 88 | gb[i][j] = 0; |
EvolutionOfWar | 0:fce0f9489de3 | 89 | } |
EvolutionOfWar | 0:fce0f9489de3 | 90 | gb[3][3] = 1;//Put down white piece |
EvolutionOfWar | 0:fce0f9489de3 | 91 | gb[4][4] = 1;//Put down white piece |
EvolutionOfWar | 0:fce0f9489de3 | 92 | gb[3][4] = 2;//Put down black piece |
EvolutionOfWar | 0:fce0f9489de3 | 93 | gb[4][3] = 2;//Put down black piece |
EvolutionOfWar | 0:fce0f9489de3 | 94 | |
EvolutionOfWar | 0:fce0f9489de3 | 95 | uLCD.cls(); |
aolmenki | 1:cc72ad58982b | 96 | uLCD.filled_rectangle(0,0,127,127,0x007f00); |
EvolutionOfWar | 0:fce0f9489de3 | 97 | |
EvolutionOfWar | 0:fce0f9489de3 | 98 | uLCD.rectangle(7,7,120,120,DGREY); |
EvolutionOfWar | 0:fce0f9489de3 | 99 | uLCD.rectangle(8,8,119,119,DGREY); |
EvolutionOfWar | 0:fce0f9489de3 | 100 | //uLCD.filled_rectangle(8,20,120,21,DGREY); |
EvolutionOfWar | 0:fce0f9489de3 | 101 | |
EvolutionOfWar | 0:fce0f9489de3 | 102 | for( int i = 1; i< 9; i++) |
EvolutionOfWar | 0:fce0f9489de3 | 103 | { |
EvolutionOfWar | 0:fce0f9489de3 | 104 | uLCD.filled_rectangle(8, 7 + 14*i,119,8 + 14*i,DGREY); |
EvolutionOfWar | 0:fce0f9489de3 | 105 | } |
EvolutionOfWar | 0:fce0f9489de3 | 106 | for( int j = 1; j<9; j++) |
EvolutionOfWar | 0:fce0f9489de3 | 107 | { |
EvolutionOfWar | 0:fce0f9489de3 | 108 | uLCD.filled_rectangle(7 + 14*j, 8, 8+14*j, 119, DGREY); |
EvolutionOfWar | 0:fce0f9489de3 | 109 | } |
EvolutionOfWar | 0:fce0f9489de3 | 110 | } |
EvolutionOfWar | 0:fce0f9489de3 | 111 | |
aolmenki | 1:cc72ad58982b | 112 | void drawCursor(int x, int y) //Expecting x ={0,7} and y ={0,7} |
EvolutionOfWar | 0:fce0f9489de3 | 113 | { |
aolmenki | 1:cc72ad58982b | 114 | uLCD.filled_rectangle(7 + 14*x, 7 + 14*y,8 + 14*x,22 + 14*y,RED); |
aolmenki | 1:cc72ad58982b | 115 | uLCD.filled_rectangle(7 + 14*x, 7 + 14*y,22 + 14*x,8 + 14*y,RED); |
aolmenki | 1:cc72ad58982b | 116 | uLCD.filled_rectangle(7 + 14*x, 21 + 14*y,22 + 14*x,22 + 14*y,RED); |
aolmenki | 1:cc72ad58982b | 117 | uLCD.filled_rectangle(21 + 14*x, 7 + 14*y,22 + 14*x,22 + 14*y,RED); |
EvolutionOfWar | 0:fce0f9489de3 | 118 | } |
EvolutionOfWar | 0:fce0f9489de3 | 119 | |
aolmenki | 1:cc72ad58982b | 120 | void removeCursor(int x,int y) |
EvolutionOfWar | 0:fce0f9489de3 | 121 | { |
aolmenki | 1:cc72ad58982b | 122 | uLCD.filled_rectangle(7 + 14*x, 7 + 14*y,8 + 14*x,22 + 14*y,DGREY); |
aolmenki | 1:cc72ad58982b | 123 | uLCD.filled_rectangle(7 + 14*x, 7 + 14*y,22 + 14*x,8 + 14*y,DGREY); |
aolmenki | 1:cc72ad58982b | 124 | uLCD.filled_rectangle(7 + 14*x, 21 + 14*y,22 + 14*x,22 + 14*y,DGREY); |
aolmenki | 1:cc72ad58982b | 125 | uLCD.filled_rectangle(21 + 14*x, 7 + 14*y,22 + 14*x,22 + 14*y,DGREY); |
EvolutionOfWar | 0:fce0f9489de3 | 126 | } |
EvolutionOfWar | 0:fce0f9489de3 | 127 | |
EvolutionOfWar | 0:fce0f9489de3 | 128 | void drawPieces(){ |
EvolutionOfWar | 0:fce0f9489de3 | 129 | for (int i = 0; i < NUM_ROWS; i++) |
EvolutionOfWar | 0:fce0f9489de3 | 130 | { |
EvolutionOfWar | 0:fce0f9489de3 | 131 | for (int j = 0; j < NUM_COLS; j++) |
EvolutionOfWar | 0:fce0f9489de3 | 132 | { |
aolmenki | 1:cc72ad58982b | 133 | if(gb[i][j] == 0){ |
aolmenki | 1:cc72ad58982b | 134 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , 0x007f00); |
aolmenki | 1:cc72ad58982b | 135 | } |
EvolutionOfWar | 0:fce0f9489de3 | 136 | if(gb[i][j] == 1){ |
EvolutionOfWar | 0:fce0f9489de3 | 137 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , WHITE); |
EvolutionOfWar | 0:fce0f9489de3 | 138 | } |
EvolutionOfWar | 0:fce0f9489de3 | 139 | if(gb[i][j] == 2){ |
EvolutionOfWar | 0:fce0f9489de3 | 140 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , BLACK); |
EvolutionOfWar | 0:fce0f9489de3 | 141 | } |
EvolutionOfWar | 0:fce0f9489de3 | 142 | } |
EvolutionOfWar | 0:fce0f9489de3 | 143 | } |
EvolutionOfWar | 0:fce0f9489de3 | 144 | } |
EvolutionOfWar | 0:fce0f9489de3 | 145 | |
EvolutionOfWar | 0:fce0f9489de3 | 146 | void drawPiece(int i, int j) { //xCoor, yCoor |
aolmenki | 1:cc72ad58982b | 147 | if (turn == 0) { |
aolmenki | 1:cc72ad58982b | 148 | gb[i][j] = 1; |
aolmenki | 1:cc72ad58982b | 149 | } else { |
aolmenki | 1:cc72ad58982b | 150 | gb[i][j] = 2; |
aolmenki | 1:cc72ad58982b | 151 | } |
EvolutionOfWar | 0:fce0f9489de3 | 152 | if(gb[i][j] == 1){ |
EvolutionOfWar | 0:fce0f9489de3 | 153 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , WHITE); |
EvolutionOfWar | 0:fce0f9489de3 | 154 | } |
EvolutionOfWar | 0:fce0f9489de3 | 155 | if(gb[i][j] == 2){ |
EvolutionOfWar | 0:fce0f9489de3 | 156 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , BLACK); |
EvolutionOfWar | 0:fce0f9489de3 | 157 | } |
EvolutionOfWar | 0:fce0f9489de3 | 158 | } |
EvolutionOfWar | 0:fce0f9489de3 | 159 | |
EvolutionOfWar | 0:fce0f9489de3 | 160 | void flippingPiece(int i, int j) { //xCoor, yCoor, animation |
aolmenki | 1:cc72ad58982b | 161 | |
aolmenki | 1:cc72ad58982b | 162 | if(gb[i][j] == 2){ //Gradually changes a piece White |
aolmenki | 1:cc72ad58982b | 163 | gb[i][j] = 1; |
EvolutionOfWar | 0:fce0f9489de3 | 164 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 1 , 0x4c4c4c); |
EvolutionOfWar | 0:fce0f9489de3 | 165 | wait(0.1); |
EvolutionOfWar | 0:fce0f9489de3 | 166 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 1 , 0xb2b2b2); |
EvolutionOfWar | 0:fce0f9489de3 | 167 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 3 , 0x4c4c4c); |
EvolutionOfWar | 0:fce0f9489de3 | 168 | wait(0.1); |
EvolutionOfWar | 0:fce0f9489de3 | 169 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 1 , 0xffffff); |
EvolutionOfWar | 0:fce0f9489de3 | 170 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 3 , 0xb2b2b2); |
EvolutionOfWar | 0:fce0f9489de3 | 171 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , 0x4c4c4c); |
EvolutionOfWar | 0:fce0f9489de3 | 172 | wait(0.1); |
EvolutionOfWar | 0:fce0f9489de3 | 173 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 3 , 0xffffff); |
EvolutionOfWar | 0:fce0f9489de3 | 174 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , 0xb2b2b2); |
EvolutionOfWar | 0:fce0f9489de3 | 175 | wait(0.1); |
EvolutionOfWar | 0:fce0f9489de3 | 176 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , 0xffffff); |
EvolutionOfWar | 0:fce0f9489de3 | 177 | wait(0.1); |
aolmenki | 1:cc72ad58982b | 178 | } else if(gb[i][j] == 1){ //Gradually changes a piece Black |
aolmenki | 1:cc72ad58982b | 179 | gb[i][j] = 2; |
EvolutionOfWar | 0:fce0f9489de3 | 180 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 1 , 0xb2b2b2); |
EvolutionOfWar | 0:fce0f9489de3 | 181 | wait(0.1); |
EvolutionOfWar | 0:fce0f9489de3 | 182 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 1 , 0x4c4c4c); |
EvolutionOfWar | 0:fce0f9489de3 | 183 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 3 , 0xb2b2b2); |
EvolutionOfWar | 0:fce0f9489de3 | 184 | wait(0.1); |
EvolutionOfWar | 0:fce0f9489de3 | 185 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 1 , 0x000000); |
EvolutionOfWar | 0:fce0f9489de3 | 186 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 3 , 0x4c4c4c); |
EvolutionOfWar | 0:fce0f9489de3 | 187 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , 0xb2b2b2); |
EvolutionOfWar | 0:fce0f9489de3 | 188 | wait(0.1); |
EvolutionOfWar | 0:fce0f9489de3 | 189 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 3 , 0x000000); |
EvolutionOfWar | 0:fce0f9489de3 | 190 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , 0x4c4c4c); |
EvolutionOfWar | 0:fce0f9489de3 | 191 | wait(0.1); |
EvolutionOfWar | 0:fce0f9489de3 | 192 | uLCD.filled_circle(14 * (i + 1), 14 * (j + 1), 5 , 0x000000); |
EvolutionOfWar | 0:fce0f9489de3 | 193 | wait(0.1); |
EvolutionOfWar | 0:fce0f9489de3 | 194 | } |
EvolutionOfWar | 0:fce0f9489de3 | 195 | } |
EvolutionOfWar | 0:fce0f9489de3 | 196 | |
EvolutionOfWar | 0:fce0f9489de3 | 197 | /*var fillBoard = function() { |
EvolutionOfWar | 0:fce0f9489de3 | 198 | for(var r=0; r<8; r++) |
EvolutionOfWar | 0:fce0f9489de3 | 199 | { |
EvolutionOfWar | 0:fce0f9489de3 | 200 | for(var c=0; c<8; c++) |
EvolutionOfWar | 0:fce0f9489de3 | 201 | { |
EvolutionOfWar | 0:fce0f9489de3 | 202 | drawPiece(r,c,board[r][c]); |
EvolutionOfWar | 0:fce0f9489de3 | 203 | } |
EvolutionOfWar | 0:fce0f9489de3 | 204 | } |
EvolutionOfWar | 0:fce0f9489de3 | 205 | }; |
EvolutionOfWar | 0:fce0f9489de3 | 206 | var drawBoard = function() { |
EvolutionOfWar | 0:fce0f9489de3 | 207 | drawEmptyBoard(); |
EvolutionOfWar | 0:fce0f9489de3 | 208 | fillBoard(); |
EvolutionOfWar | 0:fce0f9489de3 | 209 | }; --------------------------------------------WAS NOT USED VVVVV ---------------------------- |
aolmenki | 1:cc72ad58982b | 210 | var flipFromInDir = function(r,c,player,rDir,cDir) |
EvolutionOfWar | 0:fce0f9489de3 | 211 | { |
EvolutionOfWar | 0:fce0f9489de3 | 212 | //debug("Checking direction rDir: "+rDir+" cDir: "+cDir+" for player "+player); |
EvolutionOfWar | 0:fce0f9489de3 | 213 | var currentR = r; |
EvolutionOfWar | 0:fce0f9489de3 | 214 | var currentC = c; |
EvolutionOfWar | 0:fce0f9489de3 | 215 | var current = board[currentR][currentC]; |
EvolutionOfWar | 0:fce0f9489de3 | 216 | var toBeFlipped = []; |
EvolutionOfWar | 0:fce0f9489de3 | 217 | var withinRBounds = 0<=currentR && currentR<8; |
EvolutionOfWar | 0:fce0f9489de3 | 218 | var withinCBounds = 0<=currentC && currentC<8; |
EvolutionOfWar | 0:fce0f9489de3 | 219 | var oppositePieces = true; |
EvolutionOfWar | 0:fce0f9489de3 | 220 | var samePlayerEncounterred = false; |
EvolutionOfWar | 0:fce0f9489de3 | 221 | while(withinRBounds && withinCBounds && oppositePieces) |
EvolutionOfWar | 0:fce0f9489de3 | 222 | { |
EvolutionOfWar | 0:fce0f9489de3 | 223 | //debug(" oh, sweet! "+currentR+", "+currentC+" looks good!"); |
EvolutionOfWar | 0:fce0f9489de3 | 224 | toBeFlipped.push({r:currentR, c:currentC}); |
EvolutionOfWar | 0:fce0f9489de3 | 225 | currentR += rDir; |
EvolutionOfWar | 0:fce0f9489de3 | 226 | currentC += cDir; |
EvolutionOfWar | 0:fce0f9489de3 | 227 | withinRBounds = 0<=currentR && currentR<8; |
EvolutionOfWar | 0:fce0f9489de3 | 228 | withinCBounds = 0<=currentC && currentC<8; |
EvolutionOfWar | 0:fce0f9489de3 | 229 | if(withinCBounds && withinRBounds) |
EvolutionOfWar | 0:fce0f9489de3 | 230 | { |
EvolutionOfWar | 0:fce0f9489de3 | 231 | current = board[currentR][currentC]; |
EvolutionOfWar | 0:fce0f9489de3 | 232 | oppositePieces = (current===-player); |
EvolutionOfWar | 0:fce0f9489de3 | 233 | //debug(" current at "+currentR+", "+currentC+" is "+current); |
EvolutionOfWar | 0:fce0f9489de3 | 234 | //debug(" oppositePieces at "+currentR+", "+currentC+" is "+oppositePieces); |
EvolutionOfWar | 0:fce0f9489de3 | 235 | if(current===player) |
EvolutionOfWar | 0:fce0f9489de3 | 236 | { |
EvolutionOfWar | 0:fce0f9489de3 | 237 | samePlayerEncounterred = true; |
EvolutionOfWar | 0:fce0f9489de3 | 238 | } |
EvolutionOfWar | 0:fce0f9489de3 | 239 | } |
EvolutionOfWar | 0:fce0f9489de3 | 240 | } |
EvolutionOfWar | 0:fce0f9489de3 | 241 | //debug(" we found "+toBeFlipped.length); |
EvolutionOfWar | 0:fce0f9489de3 | 242 | if(toBeFlipped.length > 1 && samePlayerEncounterred) |
EvolutionOfWar | 0:fce0f9489de3 | 243 | { |
EvolutionOfWar | 0:fce0f9489de3 | 244 | for(var i=1; i<toBeFlipped.length; i++) |
EvolutionOfWar | 0:fce0f9489de3 | 245 | { |
EvolutionOfWar | 0:fce0f9489de3 | 246 | var flipMe = toBeFlipped[i]; |
EvolutionOfWar | 0:fce0f9489de3 | 247 | drawPiece(flipMe.r, flipMe.c, player); |
EvolutionOfWar | 0:fce0f9489de3 | 248 | board[flipMe.r][flipMe.c] = player; |
EvolutionOfWar | 0:fce0f9489de3 | 249 | } |
EvolutionOfWar | 0:fce0f9489de3 | 250 | } |
EvolutionOfWar | 0:fce0f9489de3 | 251 | }; -------------------------------WAS NOT USED ^^^^-------------------- |
EvolutionOfWar | 0:fce0f9489de3 | 252 | var flipFromInDir = function(r,c,player,rDir,cDir) { |
EvolutionOfWar | 0:fce0f9489de3 | 253 | var potentialBoard = copyBoard(); |
EvolutionOfWar | 0:fce0f9489de3 | 254 | |
EvolutionOfWar | 0:fce0f9489de3 | 255 | var currentR = r+rDir; |
EvolutionOfWar | 0:fce0f9489de3 | 256 | var currentC = c+cDir; |
EvolutionOfWar | 0:fce0f9489de3 | 257 | var withinRBounds = 0<=currentR && currentR<8; |
EvolutionOfWar | 0:fce0f9489de3 | 258 | var withinCBounds = 0<=currentC && currentC<8; |
EvolutionOfWar | 0:fce0f9489de3 | 259 | |
EvolutionOfWar | 0:fce0f9489de3 | 260 | while(withinRBounds && withinCBounds) |
EvolutionOfWar | 0:fce0f9489de3 | 261 | { |
EvolutionOfWar | 0:fce0f9489de3 | 262 | debug("r,c: "+r+", "+c+" direction: "+rDir+", "+cDir+" current: "+currentR+", "+currentC); |
EvolutionOfWar | 0:fce0f9489de3 | 263 | var current = board[currentR][currentC]; |
EvolutionOfWar | 0:fce0f9489de3 | 264 | if(current === 0) |
EvolutionOfWar | 0:fce0f9489de3 | 265 | { |
EvolutionOfWar | 0:fce0f9489de3 | 266 | return board; |
EvolutionOfWar | 0:fce0f9489de3 | 267 | } |
EvolutionOfWar | 0:fce0f9489de3 | 268 | else if(current === player) |
EvolutionOfWar | 0:fce0f9489de3 | 269 | { |
EvolutionOfWar | 0:fce0f9489de3 | 270 | //board = potentialBoard; |
EvolutionOfWar | 0:fce0f9489de3 | 271 | return potentialBoard; |
EvolutionOfWar | 0:fce0f9489de3 | 272 | } |
EvolutionOfWar | 0:fce0f9489de3 | 273 | else |
EvolutionOfWar | 0:fce0f9489de3 | 274 | { |
EvolutionOfWar | 0:fce0f9489de3 | 275 | potentialBoard[currentR][currentC] = player; |
EvolutionOfWar | 0:fce0f9489de3 | 276 | currentR = currentR+rDir; |
EvolutionOfWar | 0:fce0f9489de3 | 277 | currentC = currentC+cDir; |
EvolutionOfWar | 0:fce0f9489de3 | 278 | withinRBounds = 0<=currentR && currentR<8; |
EvolutionOfWar | 0:fce0f9489de3 | 279 | withinCBounds = 0<=currentC && currentC<8; |
EvolutionOfWar | 0:fce0f9489de3 | 280 | } |
EvolutionOfWar | 0:fce0f9489de3 | 281 | } |
EvolutionOfWar | 0:fce0f9489de3 | 282 | return board; |
EvolutionOfWar | 0:fce0f9489de3 | 283 | }; |
EvolutionOfWar | 0:fce0f9489de3 | 284 | var flipFrom = function(r,c,player) { |
EvolutionOfWar | 0:fce0f9489de3 | 285 | for(var rDir = -1; rDir<2; rDir++) |
EvolutionOfWar | 0:fce0f9489de3 | 286 | { |
EvolutionOfWar | 0:fce0f9489de3 | 287 | for(var cDir = -1; cDir<2; cDir++) |
EvolutionOfWar | 0:fce0f9489de3 | 288 | { |
EvolutionOfWar | 0:fce0f9489de3 | 289 | board = flipFromInDir(r, c, player, rDir, cDir); |
EvolutionOfWar | 0:fce0f9489de3 | 290 | } |
EvolutionOfWar | 0:fce0f9489de3 | 291 | } |
EvolutionOfWar | 0:fce0f9489de3 | 292 | }; |
EvolutionOfWar | 0:fce0f9489de3 | 293 | var placePiece = function(r,c,player) { |
EvolutionOfWar | 0:fce0f9489de3 | 294 | //debug("placing piece for player "+player); |
EvolutionOfWar | 0:fce0f9489de3 | 295 | drawPiece(r,c,player); |
EvolutionOfWar | 0:fce0f9489de3 | 296 | board[r][c] = player; |
EvolutionOfWar | 0:fce0f9489de3 | 297 | flipFrom(r,c,player); |
EvolutionOfWar | 0:fce0f9489de3 | 298 | drawBoard(); |
EvolutionOfWar | 0:fce0f9489de3 | 299 | }; |
EvolutionOfWar | 0:fce0f9489de3 | 300 | var move = function(r,c) |
EvolutionOfWar | 0:fce0f9489de3 | 301 | { |
EvolutionOfWar | 0:fce0f9489de3 | 302 | placePiece(r,c,whosTurn); |
EvolutionOfWar | 0:fce0f9489de3 | 303 | whosTurn *= -1; |
EvolutionOfWar | 0:fce0f9489de3 | 304 | }; |
EvolutionOfWar | 0:fce0f9489de3 | 305 | var isValidInDir = function(r,c,player,rDir,cDir) |
EvolutionOfWar | 0:fce0f9489de3 | 306 | { |
EvolutionOfWar | 0:fce0f9489de3 | 307 | //debug("Checking direction rDir: "+rDir+" cDir: "+cDir+" for player "+player); |
EvolutionOfWar | 0:fce0f9489de3 | 308 | var currentR = r; |
EvolutionOfWar | 0:fce0f9489de3 | 309 | var currentC = c; |
EvolutionOfWar | 0:fce0f9489de3 | 310 | var current = board[currentR][currentC]; |
EvolutionOfWar | 0:fce0f9489de3 | 311 | var toBeFlipped = []; |
EvolutionOfWar | 0:fce0f9489de3 | 312 | var withinRBounds = 0<=currentR && currentR<8; |
EvolutionOfWar | 0:fce0f9489de3 | 313 | var withinCBounds = 0<=currentC && currentC<8; |
EvolutionOfWar | 0:fce0f9489de3 | 314 | var oppositePieces = true; |
EvolutionOfWar | 0:fce0f9489de3 | 315 | var samePlayerEncounterred = false; |
EvolutionOfWar | 0:fce0f9489de3 | 316 | while(withinRBounds && withinCBounds && oppositePieces) |
EvolutionOfWar | 0:fce0f9489de3 | 317 | { |
EvolutionOfWar | 0:fce0f9489de3 | 318 | //debug(" oh, sweet! "+currentR+", "+currentC+" looks good!"); |
EvolutionOfWar | 0:fce0f9489de3 | 319 | toBeFlipped.push({r:currentR, c:currentC}); |
EvolutionOfWar | 0:fce0f9489de3 | 320 | currentR += rDir; |
EvolutionOfWar | 0:fce0f9489de3 | 321 | currentC += cDir; |
EvolutionOfWar | 0:fce0f9489de3 | 322 | withinRBounds = 0<=currentR && currentR<8; |
EvolutionOfWar | 0:fce0f9489de3 | 323 | withinCBounds = 0<=currentC && currentC<8; |
EvolutionOfWar | 0:fce0f9489de3 | 324 | if(withinCBounds && withinRBounds) |
EvolutionOfWar | 0:fce0f9489de3 | 325 | { |
EvolutionOfWar | 0:fce0f9489de3 | 326 | current = board[currentR][currentC]; |
EvolutionOfWar | 0:fce0f9489de3 | 327 | oppositePieces = (current===-player); |
EvolutionOfWar | 0:fce0f9489de3 | 328 | //debug(" current at "+currentR+", "+currentC+" is "+current); |
EvolutionOfWar | 0:fce0f9489de3 | 329 | //debug(" oppositePieces at "+currentR+", "+currentC+" is "+oppositePieces); |
EvolutionOfWar | 0:fce0f9489de3 | 330 | if(current===player) |
EvolutionOfWar | 0:fce0f9489de3 | 331 | { |
EvolutionOfWar | 0:fce0f9489de3 | 332 | samePlayerEncounterred = true; |
EvolutionOfWar | 0:fce0f9489de3 | 333 | } |
EvolutionOfWar | 0:fce0f9489de3 | 334 | } |
EvolutionOfWar | 0:fce0f9489de3 | 335 | } |
EvolutionOfWar | 0:fce0f9489de3 | 336 | //debug(" we found "+toBeFlipped.length); |
EvolutionOfWar | 0:fce0f9489de3 | 337 | if(toBeFlipped.length > 1 && samePlayerEncounterred) |
EvolutionOfWar | 0:fce0f9489de3 | 338 | { |
EvolutionOfWar | 0:fce0f9489de3 | 339 | return true; |
EvolutionOfWar | 0:fce0f9489de3 | 340 | } |
EvolutionOfWar | 0:fce0f9489de3 | 341 | return false; |
EvolutionOfWar | 0:fce0f9489de3 | 342 | }; |
EvolutionOfWar | 0:fce0f9489de3 | 343 | var isValidMove = function(r,c,player) { |
EvolutionOfWar | 0:fce0f9489de3 | 344 | if(!isEmpty(r,c)) |
EvolutionOfWar | 0:fce0f9489de3 | 345 | { |
EvolutionOfWar | 0:fce0f9489de3 | 346 | return false; |
EvolutionOfWar | 0:fce0f9489de3 | 347 | } |
EvolutionOfWar | 0:fce0f9489de3 | 348 | for(var rDir = -1; rDir<2; rDir++) |
EvolutionOfWar | 0:fce0f9489de3 | 349 | { |
EvolutionOfWar | 0:fce0f9489de3 | 350 | for(var cDir = -1; cDir<2; cDir++) |
EvolutionOfWar | 0:fce0f9489de3 | 351 | { |
EvolutionOfWar | 0:fce0f9489de3 | 352 | if(isValidInDir(r, c, player, rDir, cDir)) |
EvolutionOfWar | 0:fce0f9489de3 | 353 | { |
EvolutionOfWar | 0:fce0f9489de3 | 354 | return true; |
EvolutionOfWar | 0:fce0f9489de3 | 355 | } |
EvolutionOfWar | 0:fce0f9489de3 | 356 | } |
EvolutionOfWar | 0:fce0f9489de3 | 357 | } |
EvolutionOfWar | 0:fce0f9489de3 | 358 | return false; |
EvolutionOfWar | 0:fce0f9489de3 | 359 | }; |
aolmenki | 1:cc72ad58982b | 360 | */ |
aolmenki | 1:cc72ad58982b | 361 | void invalid(int x, int y, int oldColor){ |
aolmenki | 1:cc72ad58982b | 362 | gb[x][y] = oldColor; |
aolmenki | 1:cc72ad58982b | 363 | drawPieces(); |
aolmenki | 1:cc72ad58982b | 364 | uLCD.line(9 + 14 * xCoor, 11+ 14 * yCoor, 11+ 14 * xCoor, 9+ 14 * yCoor, RED); |
aolmenki | 1:cc72ad58982b | 365 | uLCD.line(11+ 14 * xCoor, 9+ 14 * yCoor, 20+ 14 * xCoor, 18+ 14 * yCoor, RED); |
aolmenki | 1:cc72ad58982b | 366 | uLCD.line(20+ 14 * xCoor, 18+ 14 * yCoor, 18+ 14 * xCoor, 20+ 14 * yCoor, RED); |
aolmenki | 1:cc72ad58982b | 367 | uLCD.line(18+ 14 * xCoor, 20+ 14 * yCoor, 9+ 14 * xCoor, 11+ 14 * yCoor, RED); |
aolmenki | 1:cc72ad58982b | 368 | uLCD.line(9+ 14 * xCoor, 18+ 14 * yCoor, 18+ 14 * xCoor, 9+ 14 * yCoor, RED); |
aolmenki | 1:cc72ad58982b | 369 | uLCD.line(18+ 14 * xCoor, 9+ 14 * yCoor, 20+ 14 * xCoor, 11+ 14 * yCoor, RED); |
aolmenki | 1:cc72ad58982b | 370 | uLCD.line(20+ 14 * xCoor, 11+ 14 * yCoor, 11+ 14 * xCoor, 20+ 14 * yCoor, RED); |
aolmenki | 1:cc72ad58982b | 371 | uLCD.line(11+ 14 * xCoor, 20+ 14 * yCoor, 9+ 14 * xCoor, 18+ 14 * yCoor, RED); |
aolmenki | 1:cc72ad58982b | 372 | wait(1); |
aolmenki | 1:cc72ad58982b | 373 | uLCD.line(9 + 14 * xCoor, 11+ 14 * yCoor, 11+ 14 * xCoor, 9+ 14 * yCoor, 0x007F00); |
aolmenki | 1:cc72ad58982b | 374 | uLCD.line(11+ 14 * xCoor, 9+ 14 * yCoor, 20+ 14 * xCoor, 18+ 14 * yCoor, 0x007F00); |
aolmenki | 1:cc72ad58982b | 375 | uLCD.line(20+ 14 * xCoor, 18+ 14 * yCoor, 18+ 14 * xCoor, 20+ 14 * yCoor, 0x007F00); |
aolmenki | 1:cc72ad58982b | 376 | uLCD.line(18+ 14 * xCoor, 20+ 14 * yCoor, 9+ 14 * xCoor, 11+ 14 * yCoor, 0x007F00); |
aolmenki | 1:cc72ad58982b | 377 | uLCD.line(9+ 14 * xCoor, 18+ 14 * yCoor, 18+ 14 * xCoor, 9+ 14 * yCoor, 0x007F00); |
aolmenki | 1:cc72ad58982b | 378 | uLCD.line(18+ 14 * xCoor, 9+ 14 * yCoor, 20+ 14 * xCoor, 11+ 14 * yCoor, 0x007F00); |
aolmenki | 1:cc72ad58982b | 379 | uLCD.line(20+ 14 * xCoor, 11+ 14 * yCoor, 11+ 14 * xCoor, 20+ 14 * yCoor, 0x007F00); |
aolmenki | 1:cc72ad58982b | 380 | uLCD.line(11+ 14 * xCoor, 20+ 14 * yCoor, 9+ 14 * xCoor, 18+ 14 * yCoor, 0x007F00); |
aolmenki | 1:cc72ad58982b | 381 | drawPieces(); |
aolmenki | 1:cc72ad58982b | 382 | } |
aolmenki | 1:cc72ad58982b | 383 | |
aolmenki | 1:cc72ad58982b | 384 | void valid_move(int x, int y) { |
aolmenki | 1:cc72ad58982b | 385 | int opp, pl; |
aolmenki | 1:cc72ad58982b | 386 | bool invalidD[] = {false, false, false, false, false, false, false, false}; //flip checker |
aolmenki | 1:cc72ad58982b | 387 | if (turn == 1) { //pl is black |
aolmenki | 1:cc72ad58982b | 388 | opp = 1; |
aolmenki | 1:cc72ad58982b | 389 | pl = 2; |
aolmenki | 1:cc72ad58982b | 390 | } else { // pl is white |
aolmenki | 1:cc72ad58982b | 391 | opp = 2; |
aolmenki | 1:cc72ad58982b | 392 | pl = 1; |
EvolutionOfWar | 0:fce0f9489de3 | 393 | } |
aolmenki | 1:cc72ad58982b | 394 | int oldColor = gb[x][y]; //save old color for drawing over X |
aolmenki | 1:cc72ad58982b | 395 | bool flipped = false; |
aolmenki | 1:cc72ad58982b | 396 | if (gb[x][y] == 0) { // check empty space |
aolmenki | 1:cc72ad58982b | 397 | drawPiece(x, y); // emtpy so draw |
aolmenki | 1:cc72ad58982b | 398 | for (int i = 0; i < 8; i++) { // check for opponent around emtpy space and fill |
aolmenki | 1:cc72ad58982b | 399 | if (i == 0) { // right |
aolmenki | 1:cc72ad58982b | 400 | if (x + 1 < 7 && gb[x + 1][y] == opp) { //check to see if not beyond board and has to be next to the opponent |
aolmenki | 1:cc72ad58982b | 401 | for (int j = x + 2; j < 8; j++) { |
aolmenki | 1:cc72ad58982b | 402 | if (gb[j][y] == pl && !flipped) { |
aolmenki | 1:cc72ad58982b | 403 | for (int k = x + 1; k < j; k++) { |
aolmenki | 1:cc72ad58982b | 404 | flippingPiece(k, y); |
aolmenki | 1:cc72ad58982b | 405 | } |
aolmenki | 1:cc72ad58982b | 406 | flipped = true; |
aolmenki | 1:cc72ad58982b | 407 | } else if (gb[j][y] == 0) { |
aolmenki | 1:cc72ad58982b | 408 | j = 8; |
aolmenki | 1:cc72ad58982b | 409 | } |
aolmenki | 1:cc72ad58982b | 410 | } |
aolmenki | 1:cc72ad58982b | 411 | if (flipped) { |
aolmenki | 1:cc72ad58982b | 412 | flipped = false; |
aolmenki | 1:cc72ad58982b | 413 | } else { |
aolmenki | 1:cc72ad58982b | 414 | invalidD[0] = true; |
aolmenki | 1:cc72ad58982b | 415 | } |
aolmenki | 1:cc72ad58982b | 416 | } else { |
aolmenki | 1:cc72ad58982b | 417 | invalidD[0] = true; |
aolmenki | 1:cc72ad58982b | 418 | } |
aolmenki | 1:cc72ad58982b | 419 | } else if (i == 1) { // down-right |
aolmenki | 1:cc72ad58982b | 420 | if (x + 1 < 7 && y + 1 < 7 && gb[x + 1][y + 1] == opp) { // check if within margin and next to other color |
aolmenki | 1:cc72ad58982b | 421 | for (int j = 2; j < 8 - x && j < 8 - y; j++) { // start finding next same color |
aolmenki | 1:cc72ad58982b | 422 | if (gb[x + j][y + j] == pl && !flipped) { // if same color and not already been flipping |
aolmenki | 1:cc72ad58982b | 423 | for (int k = 1; k < j; k++) { // between other color to this same color |
aolmenki | 1:cc72ad58982b | 424 | flippingPiece(x + k, y + k); // flip |
aolmenki | 1:cc72ad58982b | 425 | } |
aolmenki | 1:cc72ad58982b | 426 | flipped = true; // marked flipped |
aolmenki | 1:cc72ad58982b | 427 | } else if (gb[x + j][y + j] == 0) { // if you find an empty instead |
aolmenki | 1:cc72ad58982b | 428 | j = 8; // skip for loop |
aolmenki | 1:cc72ad58982b | 429 | } |
aolmenki | 1:cc72ad58982b | 430 | } |
aolmenki | 1:cc72ad58982b | 431 | if (flipped) { // if flipped |
aolmenki | 1:cc72ad58982b | 432 | flipped = false; // set variable back to false |
aolmenki | 1:cc72ad58982b | 433 | } else { |
aolmenki | 1:cc72ad58982b | 434 | invalidD[1] = true; // no flip happened, so set invalid tracker to true |
aolmenki | 1:cc72ad58982b | 435 | } |
aolmenki | 1:cc72ad58982b | 436 | } else { |
aolmenki | 1:cc72ad58982b | 437 | invalidD[1] = true; // not within margin or next to other color |
aolmenki | 1:cc72ad58982b | 438 | } |
aolmenki | 1:cc72ad58982b | 439 | } else if (i == 2) { // down |
aolmenki | 1:cc72ad58982b | 440 | if (y + 1 < 7 && gb[x][y + 1] == opp) { |
aolmenki | 1:cc72ad58982b | 441 | for (int j = y + 2; j < 8; j++) { |
aolmenki | 1:cc72ad58982b | 442 | if (gb[x][j] == pl && !flipped) { |
aolmenki | 1:cc72ad58982b | 443 | for (int k = y + 1; k < j; k++) { |
aolmenki | 1:cc72ad58982b | 444 | flippingPiece(x, k); |
aolmenki | 1:cc72ad58982b | 445 | } |
aolmenki | 1:cc72ad58982b | 446 | flipped = true; |
aolmenki | 1:cc72ad58982b | 447 | } else if (gb[x][j] == 0) { |
aolmenki | 1:cc72ad58982b | 448 | j = 8; |
aolmenki | 1:cc72ad58982b | 449 | } |
aolmenki | 1:cc72ad58982b | 450 | } |
aolmenki | 1:cc72ad58982b | 451 | if (flipped) { |
aolmenki | 1:cc72ad58982b | 452 | flipped = false; |
aolmenki | 1:cc72ad58982b | 453 | } else { |
aolmenki | 1:cc72ad58982b | 454 | invalidD[2] = true; |
aolmenki | 1:cc72ad58982b | 455 | } |
aolmenki | 1:cc72ad58982b | 456 | } else { |
aolmenki | 1:cc72ad58982b | 457 | invalidD[2] = true; |
aolmenki | 1:cc72ad58982b | 458 | } |
aolmenki | 1:cc72ad58982b | 459 | } else if (i == 3) { // down-left |
aolmenki | 1:cc72ad58982b | 460 | if (x - 1 > 0 && y + 1 < 7 && gb[x - 1][y + 1] == opp) { |
aolmenki | 1:cc72ad58982b | 461 | for (int j = 2; j < x + 1 && j < 8 - y; j++) { |
aolmenki | 1:cc72ad58982b | 462 | if (gb[x - j][y + j] == pl && !flipped) { |
aolmenki | 1:cc72ad58982b | 463 | for (int k = 1; k < j; k++) { |
aolmenki | 1:cc72ad58982b | 464 | flippingPiece(x - k, y + k); |
aolmenki | 1:cc72ad58982b | 465 | } |
aolmenki | 1:cc72ad58982b | 466 | flipped = true; |
aolmenki | 1:cc72ad58982b | 467 | } else if (gb[x - j][y + j] == 0) { |
aolmenki | 1:cc72ad58982b | 468 | j = 5; |
aolmenki | 1:cc72ad58982b | 469 | } |
aolmenki | 1:cc72ad58982b | 470 | } |
aolmenki | 1:cc72ad58982b | 471 | if (flipped) { |
aolmenki | 1:cc72ad58982b | 472 | flipped = false; |
aolmenki | 1:cc72ad58982b | 473 | } else { |
aolmenki | 1:cc72ad58982b | 474 | invalidD[3] = true; |
aolmenki | 1:cc72ad58982b | 475 | } |
aolmenki | 1:cc72ad58982b | 476 | } else { |
aolmenki | 1:cc72ad58982b | 477 | invalidD[3] = true; |
aolmenki | 1:cc72ad58982b | 478 | } |
aolmenki | 1:cc72ad58982b | 479 | } else if (i == 4) { // left |
aolmenki | 1:cc72ad58982b | 480 | if (x - 1 > 0 && gb[x - 1][y] == opp) { |
aolmenki | 1:cc72ad58982b | 481 | for (int j = x - 2; j > -1; j--) { |
aolmenki | 1:cc72ad58982b | 482 | if (gb[j][y] == pl && !flipped) { |
aolmenki | 1:cc72ad58982b | 483 | for (int k = x - 1; k > j; k--) { |
aolmenki | 1:cc72ad58982b | 484 | flippingPiece(k, y); |
aolmenki | 1:cc72ad58982b | 485 | } |
aolmenki | 1:cc72ad58982b | 486 | flipped = true; |
aolmenki | 1:cc72ad58982b | 487 | } else if (gb[j][y] == 0) { |
aolmenki | 1:cc72ad58982b | 488 | j = -1; |
aolmenki | 1:cc72ad58982b | 489 | } |
aolmenki | 1:cc72ad58982b | 490 | } |
aolmenki | 1:cc72ad58982b | 491 | if (flipped) { |
aolmenki | 1:cc72ad58982b | 492 | flipped = false; |
aolmenki | 1:cc72ad58982b | 493 | } else { |
aolmenki | 1:cc72ad58982b | 494 | invalidD[4] = true; |
aolmenki | 1:cc72ad58982b | 495 | } |
aolmenki | 1:cc72ad58982b | 496 | } else { |
aolmenki | 1:cc72ad58982b | 497 | invalidD[4] = true; |
aolmenki | 1:cc72ad58982b | 498 | } |
aolmenki | 1:cc72ad58982b | 499 | } else if (i == 5) { // up-left |
aolmenki | 1:cc72ad58982b | 500 | if (x - 1 > 0 && y - 1 > 0 && gb[x - 1][y - 1] == opp) { |
aolmenki | 1:cc72ad58982b | 501 | for (int j = 2; j < x + 1 && j < y + 1; j++) { |
aolmenki | 1:cc72ad58982b | 502 | if (gb[x - j][y - j] == pl && !flipped) { |
aolmenki | 1:cc72ad58982b | 503 | for (int k = 1; k < j; k++) { |
aolmenki | 1:cc72ad58982b | 504 | flippingPiece(x - k, y - k); |
aolmenki | 1:cc72ad58982b | 505 | } |
aolmenki | 1:cc72ad58982b | 506 | flipped = true; |
aolmenki | 1:cc72ad58982b | 507 | } else if (gb[x - j][y - j] == 0) { |
aolmenki | 1:cc72ad58982b | 508 | j = 8; |
aolmenki | 1:cc72ad58982b | 509 | } |
aolmenki | 1:cc72ad58982b | 510 | } |
aolmenki | 1:cc72ad58982b | 511 | if (flipped) { |
aolmenki | 1:cc72ad58982b | 512 | flipped = false; |
aolmenki | 1:cc72ad58982b | 513 | } else { |
aolmenki | 1:cc72ad58982b | 514 | invalidD[5] = true; |
aolmenki | 1:cc72ad58982b | 515 | } |
aolmenki | 1:cc72ad58982b | 516 | } else { |
aolmenki | 1:cc72ad58982b | 517 | invalidD[5] = true; |
aolmenki | 1:cc72ad58982b | 518 | } |
aolmenki | 1:cc72ad58982b | 519 | } else if (i == 6) { // up |
aolmenki | 1:cc72ad58982b | 520 | if (y - 1 > 0 && gb[x][y - 1] == opp) { |
aolmenki | 1:cc72ad58982b | 521 | for (int j = y - 2; j > -1; j--) { |
aolmenki | 1:cc72ad58982b | 522 | if (gb[x][j] == pl && !flipped) { |
aolmenki | 1:cc72ad58982b | 523 | for (int k = y - 1; k > j; k--) { |
aolmenki | 1:cc72ad58982b | 524 | flippingPiece(x, k); |
aolmenki | 1:cc72ad58982b | 525 | } |
aolmenki | 1:cc72ad58982b | 526 | flipped = true; |
aolmenki | 1:cc72ad58982b | 527 | } else if (gb[x][j] == 0) { |
aolmenki | 1:cc72ad58982b | 528 | j = -1; |
aolmenki | 1:cc72ad58982b | 529 | } |
aolmenki | 1:cc72ad58982b | 530 | } |
aolmenki | 1:cc72ad58982b | 531 | if (flipped) { |
aolmenki | 1:cc72ad58982b | 532 | flipped = false; |
aolmenki | 1:cc72ad58982b | 533 | } else { |
aolmenki | 1:cc72ad58982b | 534 | invalidD[6] = true; |
aolmenki | 1:cc72ad58982b | 535 | } |
aolmenki | 1:cc72ad58982b | 536 | } else { |
aolmenki | 1:cc72ad58982b | 537 | invalidD[6] = true; |
aolmenki | 1:cc72ad58982b | 538 | } |
aolmenki | 1:cc72ad58982b | 539 | } else if (i == 7) { // up-right |
aolmenki | 1:cc72ad58982b | 540 | if (x + 1 < 7 && y - 1 > 0 && gb[x + 1][y - 1] == opp) { |
aolmenki | 1:cc72ad58982b | 541 | for (int j = 2; j < 8 - x && j < y + 1; j++) { |
aolmenki | 1:cc72ad58982b | 542 | if (gb[x + j][y - j] == pl && !flipped) { |
aolmenki | 1:cc72ad58982b | 543 | for (int k = 1; k < j; k++) { |
aolmenki | 1:cc72ad58982b | 544 | flippingPiece(x + k, y - k); |
aolmenki | 1:cc72ad58982b | 545 | } |
aolmenki | 1:cc72ad58982b | 546 | flipped = true; |
aolmenki | 1:cc72ad58982b | 547 | } else if (gb[x + j][y - j] == 0) { |
aolmenki | 1:cc72ad58982b | 548 | j = 8; |
aolmenki | 1:cc72ad58982b | 549 | } |
aolmenki | 1:cc72ad58982b | 550 | } |
aolmenki | 1:cc72ad58982b | 551 | if (flipped) { |
aolmenki | 1:cc72ad58982b | 552 | flipped = false; |
aolmenki | 1:cc72ad58982b | 553 | } else { |
aolmenki | 1:cc72ad58982b | 554 | invalidD[7] = true; |
aolmenki | 1:cc72ad58982b | 555 | } |
aolmenki | 1:cc72ad58982b | 556 | } else { |
aolmenki | 1:cc72ad58982b | 557 | invalidD[7] = true; |
aolmenki | 1:cc72ad58982b | 558 | } |
aolmenki | 1:cc72ad58982b | 559 | } |
aolmenki | 1:cc72ad58982b | 560 | } // finish checking around |
aolmenki | 1:cc72ad58982b | 561 | flipped = false; |
aolmenki | 1:cc72ad58982b | 562 | for (int i = 0; i < 8; i++) { |
aolmenki | 1:cc72ad58982b | 563 | if (!invalidD[i] && !flipped) { // if a move is found, and only once |
aolmenki | 1:cc72ad58982b | 564 | moved = true; // has moved |
aolmenki | 1:cc72ad58982b | 565 | turn = ++turn%2; // increment turn |
aolmenki | 1:cc72ad58982b | 566 | flipped = true; // check flip |
aolmenki | 1:cc72ad58982b | 567 | } |
aolmenki | 1:cc72ad58982b | 568 | } |
aolmenki | 1:cc72ad58982b | 569 | if (!flipped) { // no changes were made |
aolmenki | 1:cc72ad58982b | 570 | invalid(x, y, oldColor); // change back to old color and revert changes |
aolmenki | 1:cc72ad58982b | 571 | } |
aolmenki | 1:cc72ad58982b | 572 | } else { //invalid |
aolmenki | 1:cc72ad58982b | 573 | invalid(x, y, oldColor); // not empty space |
aolmenki | 1:cc72ad58982b | 574 | } |
aolmenki | 1:cc72ad58982b | 575 | } |
aolmenki | 1:cc72ad58982b | 576 | |
aolmenki | 1:cc72ad58982b | 577 | |
aolmenki | 1:cc72ad58982b | 578 | void countPieces() |
aolmenki | 1:cc72ad58982b | 579 | { |
aolmenki | 1:cc72ad58982b | 580 | numBlack = 0; |
aolmenki | 1:cc72ad58982b | 581 | numWhite = 0; |
aolmenki | 1:cc72ad58982b | 582 | for(int row = 0; row < 8; row++){ |
aolmenki | 1:cc72ad58982b | 583 | for(int col = 0; col < 8; col++){ |
aolmenki | 1:cc72ad58982b | 584 | if(gb[row][col]==2) |
aolmenki | 1:cc72ad58982b | 585 | { |
aolmenki | 1:cc72ad58982b | 586 | numBlack++; |
aolmenki | 1:cc72ad58982b | 587 | } |
aolmenki | 1:cc72ad58982b | 588 | if(gb[row][col]==1) |
aolmenki | 1:cc72ad58982b | 589 | { |
aolmenki | 1:cc72ad58982b | 590 | numWhite++; |
aolmenki | 1:cc72ad58982b | 591 | } |
aolmenki | 1:cc72ad58982b | 592 | } |
aolmenki | 1:cc72ad58982b | 593 | } |
aolmenki | 1:cc72ad58982b | 594 | } |
aolmenki | 1:cc72ad58982b | 595 | void result() { |
aolmenki | 1:cc72ad58982b | 596 | uLCD.cls(); // THIS CODE ASSUMES BACKGROUND CORRECTLY RESETS TO 0x007F00 |
aolmenki | 1:cc72ad58982b | 597 | |
aolmenki | 1:cc72ad58982b | 598 | countPieces(); |
aolmenki | 1:cc72ad58982b | 599 | uLCD.color(RED); |
aolmenki | 1:cc72ad58982b | 600 | uLCD.printf("Score\n"); |
aolmenki | 1:cc72ad58982b | 601 | uLCD.color(BLACK); |
aolmenki | 1:cc72ad58982b | 602 | uLCD.printf("%D, numBlack"); |
aolmenki | 1:cc72ad58982b | 603 | uLCD.color(RED); |
aolmenki | 1:cc72ad58982b | 604 | uLCD.printf(" - "); |
aolmenki | 1:cc72ad58982b | 605 | uLCD.color(WHITE); |
aolmenki | 1:cc72ad58982b | 606 | uLCD.printf("%D \n", numWhite); |
aolmenki | 1:cc72ad58982b | 607 | uLCD.color(RED); |
aolmenki | 1:cc72ad58982b | 608 | uLCD.printf("\n Play again? \n"); |
aolmenki | 1:cc72ad58982b | 609 | |
aolmenki | 1:cc72ad58982b | 610 | uLCD.text_char('Y', 4, 9, BLUE); |
aolmenki | 1:cc72ad58982b | 611 | uLCD.text_char('E', 5, 9, BLUE); |
aolmenki | 1:cc72ad58982b | 612 | uLCD.text_char('S', 6, 9, BLUE); |
aolmenki | 1:cc72ad58982b | 613 | uLCD.text_char('N', 11, 9, RED); |
aolmenki | 1:cc72ad58982b | 614 | uLCD.text_char('O', 12, 9, RED); |
aolmenki | 1:cc72ad58982b | 615 | |
aolmenki | 1:cc72ad58982b | 616 | uLCD.rectangle(20,90, 40, 110, 0xffff00); //Default over Yes |
aolmenki | 1:cc72ad58982b | 617 | bool optionSelected = false; |
aolmenki | 1:cc72ad58982b | 618 | int choice = 1; //Default choice Yes |
aolmenki | 1:cc72ad58982b | 619 | while(optionSelected ==false){ |
aolmenki | 1:cc72ad58982b | 620 | if(myNav[2] == 0 ){ |
aolmenki | 1:cc72ad58982b | 621 | uLCD.rectangle(20,90, 40, 110, 0xffff00); |
aolmenki | 1:cc72ad58982b | 622 | uLCD.rectangle(80,90, 100, 110, 0x007F00); |
aolmenki | 1:cc72ad58982b | 623 | choice = 1; |
aolmenki | 1:cc72ad58982b | 624 | } |
aolmenki | 1:cc72ad58982b | 625 | if(myNav[3] == 0 ){ |
aolmenki | 1:cc72ad58982b | 626 | uLCD.rectangle(20,90, 40, 110, 0x007F00); |
aolmenki | 1:cc72ad58982b | 627 | uLCD.rectangle(80,90, 100, 110, 0xffff00); |
aolmenki | 1:cc72ad58982b | 628 | choice = 2; |
aolmenki | 1:cc72ad58982b | 629 | } |
aolmenki | 1:cc72ad58982b | 630 | if(myNav[4] == 0){ //Joystick pressed to Select |
aolmenki | 1:cc72ad58982b | 631 | if(choice == 1) { |
aolmenki | 1:cc72ad58982b | 632 | //Restart and play again |
aolmenki | 1:cc72ad58982b | 633 | initialize_game_board(); |
aolmenki | 1:cc72ad58982b | 634 | xCoor = 3; |
aolmenki | 1:cc72ad58982b | 635 | yCoor = 4; |
aolmenki | 1:cc72ad58982b | 636 | } |
aolmenki | 1:cc72ad58982b | 637 | else{ //choice == 0 |
aolmenki | 1:cc72ad58982b | 638 | //Quit? |
aolmenki | 1:cc72ad58982b | 639 | } |
aolmenki | 1:cc72ad58982b | 640 | } |
aolmenki | 1:cc72ad58982b | 641 | } |
aolmenki | 1:cc72ad58982b | 642 | } |
aolmenki | 1:cc72ad58982b | 643 | |
EvolutionOfWar | 0:fce0f9489de3 | 644 | int main() { |
aolmenki | 1:cc72ad58982b | 645 | while (1) { |
aolmenki | 1:cc72ad58982b | 646 | |
aolmenki | 1:cc72ad58982b | 647 | initialize_game_board(); |
aolmenki | 1:cc72ad58982b | 648 | drawPieces(); |
aolmenki | 1:cc72ad58982b | 649 | while(!gameover) { //active game, checks game over |
aolmenki | 1:cc72ad58982b | 650 | |
aolmenki | 1:cc72ad58982b | 651 | // check inputs |
aolmenki | 1:cc72ad58982b | 652 | while (!moved) { |
aolmenki | 1:cc72ad58982b | 653 | drawCursor(xCoor, yCoor); |
aolmenki | 1:cc72ad58982b | 654 | wait(0.02); |
aolmenki | 1:cc72ad58982b | 655 | removeCursor(xCoor, yCoor); |
aolmenki | 1:cc72ad58982b | 656 | //with pullups a button hit is a "0" - "~" inverts data to leds |
aolmenki | 1:cc72ad58982b | 657 | //~(myNav & 0x0F); //update leds with nav switch direction inputs |
aolmenki | 1:cc72ad58982b | 658 | if(myNav[0] == 0 && xCoor != 0){xCoor --;} |
aolmenki | 1:cc72ad58982b | 659 | if(myNav[1] == 0 && xCoor != 7){xCoor ++;} |
aolmenki | 1:cc72ad58982b | 660 | if(myNav[2] == 0 && yCoor != 7){yCoor ++;} |
aolmenki | 1:cc72ad58982b | 661 | if(myNav[3] == 0 && yCoor != 0){yCoor --;} |
aolmenki | 1:cc72ad58982b | 662 | if(myNav.fire()) {valid_move(xCoor, yCoor);} // Press Down Joystick for Select |
aolmenki | 1:cc72ad58982b | 663 | //or use - if(myNav[4]==0) mbedleds = 0x0F; //can index a switch bit like this |
aolmenki | 1:cc72ad58982b | 664 | } |
aolmenki | 1:cc72ad58982b | 665 | moved = false; |
aolmenki | 1:cc72ad58982b | 666 | // check game over |
aolmenki | 1:cc72ad58982b | 667 | countPieces(); |
aolmenki | 1:cc72ad58982b | 668 | gameover = numBlack + numWhite == 64; |
aolmenki | 1:cc72ad58982b | 669 | } |
aolmenki | 1:cc72ad58982b | 670 | result(); |
EvolutionOfWar | 0:fce0f9489de3 | 671 | } |
EvolutionOfWar | 0:fce0f9489de3 | 672 | } |
EvolutionOfWar | 0:fce0f9489de3 | 673 | //initializeBoard(); |
EvolutionOfWar | 0:fce0f9489de3 | 674 | //drawBoard(); |
EvolutionOfWar | 0:fce0f9489de3 | 675 | //displayScore(); |