Chess game on the mbed.
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed
main.cpp@0:a5f9535b6e3d, 2016-03-14 (annotated)
- Committer:
- mbavare
- Date:
- Mon Mar 14 02:45:47 2016 +0000
- Revision:
- 0:a5f9535b6e3d
- Child:
- 1:af3a896cd76d
final
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbavare | 0:a5f9535b6e3d | 1 | #include "mbed.h" |
mbavare | 0:a5f9535b6e3d | 2 | #include "uLCD_4DGL.h" |
mbavare | 0:a5f9535b6e3d | 3 | #include "SDFileSystem.h" |
mbavare | 0:a5f9535b6e3d | 4 | #include <algorithm> |
mbavare | 0:a5f9535b6e3d | 5 | #include "PinDetect.h" |
mbavare | 0:a5f9535b6e3d | 6 | #include "Speaker.h" |
mbavare | 0:a5f9535b6e3d | 7 | |
mbavare | 0:a5f9535b6e3d | 8 | |
mbavare | 0:a5f9535b6e3d | 9 | uLCD_4DGL uLCD(p28,p27,p29); // serial tx, serial rx, reset pin; |
mbavare | 0:a5f9535b6e3d | 10 | |
mbavare | 0:a5f9535b6e3d | 11 | //need bluetooth https://developer.mbed.org/users/4180_1/notebook/adafruit-bluefruit-le-uart-friend---bluetooth-low-/ |
mbavare | 0:a5f9535b6e3d | 12 | Serial blue(p13,p14); //serial tx, rx |
mbavare | 0:a5f9535b6e3d | 13 | |
mbavare | 0:a5f9535b6e3d | 14 | |
mbavare | 0:a5f9535b6e3d | 15 | //joystick - declare pins and then have interrupt functions for each one |
mbavare | 0:a5f9535b6e3d | 16 | |
mbavare | 0:a5f9535b6e3d | 17 | //speaker - declare pins, may want to use it as pwm out instead of wav? |
mbavare | 0:a5f9535b6e3d | 18 | Speaker mySpeaker(p21); |
mbavare | 0:a5f9535b6e3d | 19 | |
mbavare | 0:a5f9535b6e3d | 20 | //sd card - to hold the video file |
mbavare | 0:a5f9535b6e3d | 21 | //SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card setup |
mbavare | 0:a5f9535b6e3d | 22 | |
mbavare | 0:a5f9535b6e3d | 23 | int board[8][8]={0}; |
mbavare | 0:a5f9535b6e3d | 24 | int current_player = 1; |
mbavare | 0:a5f9535b6e3d | 25 | //pieces |
mbavare | 0:a5f9535b6e3d | 26 | const int pawn=1; |
mbavare | 0:a5f9535b6e3d | 27 | const int rook=2; |
mbavare | 0:a5f9535b6e3d | 28 | const int knight=3; |
mbavare | 0:a5f9535b6e3d | 29 | const int bishop=4; |
mbavare | 0:a5f9535b6e3d | 30 | const int queen=5; |
mbavare | 0:a5f9535b6e3d | 31 | const int king=6; |
mbavare | 0:a5f9535b6e3d | 32 | |
mbavare | 0:a5f9535b6e3d | 33 | int winner = 0; |
mbavare | 0:a5f9535b6e3d | 34 | |
mbavare | 0:a5f9535b6e3d | 35 | |
mbavare | 0:a5f9535b6e3d | 36 | class Nav_Switch |
mbavare | 0:a5f9535b6e3d | 37 | { |
mbavare | 0:a5f9535b6e3d | 38 | public: |
mbavare | 0:a5f9535b6e3d | 39 | Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire); |
mbavare | 0:a5f9535b6e3d | 40 | int read(); |
mbavare | 0:a5f9535b6e3d | 41 | //boolean functions to test each switch |
mbavare | 0:a5f9535b6e3d | 42 | bool up(); |
mbavare | 0:a5f9535b6e3d | 43 | bool down(); |
mbavare | 0:a5f9535b6e3d | 44 | bool left(); |
mbavare | 0:a5f9535b6e3d | 45 | bool right(); |
mbavare | 0:a5f9535b6e3d | 46 | bool fire(); |
mbavare | 0:a5f9535b6e3d | 47 | //automatic read on RHS |
mbavare | 0:a5f9535b6e3d | 48 | operator int (); |
mbavare | 0:a5f9535b6e3d | 49 | //index to any switch array style |
mbavare | 0:a5f9535b6e3d | 50 | bool operator[](int index) { |
mbavare | 0:a5f9535b6e3d | 51 | return _pins[index]; |
mbavare | 0:a5f9535b6e3d | 52 | }; |
mbavare | 0:a5f9535b6e3d | 53 | private: |
mbavare | 0:a5f9535b6e3d | 54 | BusIn _pins; |
mbavare | 0:a5f9535b6e3d | 55 | |
mbavare | 0:a5f9535b6e3d | 56 | }; |
mbavare | 0:a5f9535b6e3d | 57 | Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire): |
mbavare | 0:a5f9535b6e3d | 58 | _pins(up, down, left, right, fire) |
mbavare | 0:a5f9535b6e3d | 59 | { |
mbavare | 0:a5f9535b6e3d | 60 | _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise |
mbavare | 0:a5f9535b6e3d | 61 | wait(0.001); //delays just a bit for pullups to pull inputs high |
mbavare | 0:a5f9535b6e3d | 62 | } |
mbavare | 0:a5f9535b6e3d | 63 | inline bool Nav_Switch::up() |
mbavare | 0:a5f9535b6e3d | 64 | { |
mbavare | 0:a5f9535b6e3d | 65 | return !(_pins[0]); |
mbavare | 0:a5f9535b6e3d | 66 | } |
mbavare | 0:a5f9535b6e3d | 67 | inline bool Nav_Switch::down() |
mbavare | 0:a5f9535b6e3d | 68 | { |
mbavare | 0:a5f9535b6e3d | 69 | return !(_pins[1]); |
mbavare | 0:a5f9535b6e3d | 70 | } |
mbavare | 0:a5f9535b6e3d | 71 | inline bool Nav_Switch::left() |
mbavare | 0:a5f9535b6e3d | 72 | { |
mbavare | 0:a5f9535b6e3d | 73 | return !(_pins[2]); |
mbavare | 0:a5f9535b6e3d | 74 | } |
mbavare | 0:a5f9535b6e3d | 75 | inline bool Nav_Switch::right() |
mbavare | 0:a5f9535b6e3d | 76 | { |
mbavare | 0:a5f9535b6e3d | 77 | return !(_pins[3]); |
mbavare | 0:a5f9535b6e3d | 78 | } |
mbavare | 0:a5f9535b6e3d | 79 | inline bool Nav_Switch::fire() |
mbavare | 0:a5f9535b6e3d | 80 | { |
mbavare | 0:a5f9535b6e3d | 81 | return !(_pins[4]); |
mbavare | 0:a5f9535b6e3d | 82 | } |
mbavare | 0:a5f9535b6e3d | 83 | inline int Nav_Switch::read() |
mbavare | 0:a5f9535b6e3d | 84 | { |
mbavare | 0:a5f9535b6e3d | 85 | return _pins.read(); |
mbavare | 0:a5f9535b6e3d | 86 | } |
mbavare | 0:a5f9535b6e3d | 87 | inline Nav_Switch::operator int () |
mbavare | 0:a5f9535b6e3d | 88 | { |
mbavare | 0:a5f9535b6e3d | 89 | return _pins.read(); |
mbavare | 0:a5f9535b6e3d | 90 | } |
mbavare | 0:a5f9535b6e3d | 91 | |
mbavare | 0:a5f9535b6e3d | 92 | Nav_Switch p1( p9, p6, p7, p5, p8); //pin order on Sparkfun breakout |
mbavare | 0:a5f9535b6e3d | 93 | DigitalOut myLed1(LED1); |
mbavare | 0:a5f9535b6e3d | 94 | DigitalOut myLed2(LED2); |
mbavare | 0:a5f9535b6e3d | 95 | DigitalOut myLed3(LED3); |
mbavare | 0:a5f9535b6e3d | 96 | DigitalOut myLed4(LED4); |
mbavare | 0:a5f9535b6e3d | 97 | |
mbavare | 0:a5f9535b6e3d | 98 | //I guess these need a color arguement too |
mbavare | 0:a5f9535b6e3d | 99 | |
mbavare | 0:a5f9535b6e3d | 100 | void drawPawn(int x, int y, int Color) { |
mbavare | 0:a5f9535b6e3d | 101 | uLCD.filled_circle(x*16+8,y*16+5,2,Color); |
mbavare | 0:a5f9535b6e3d | 102 | uLCD.triangle(x*16+8,y*16+5,x*16+4,y*16+12,x*16+12,y*16+12,Color); |
mbavare | 0:a5f9535b6e3d | 103 | } |
mbavare | 0:a5f9535b6e3d | 104 | void drawQueen(int x, int y, int Color) { |
mbavare | 0:a5f9535b6e3d | 105 | uLCD.filled_rectangle(x*16+4,y*16+6, x*16+12, y*16+12, Color); |
mbavare | 0:a5f9535b6e3d | 106 | uLCD.triangle(x*16+4,y*16+6,x*16+4,y*16+2,x*16+7,y*16+6,Color); |
mbavare | 0:a5f9535b6e3d | 107 | uLCD.triangle(x*16+7,y*16+6,x*16+8.5,y*16+2,x*16+10,y*16+6,Color); |
mbavare | 0:a5f9535b6e3d | 108 | uLCD.triangle(x*16+10,y*16+6,x*16+12,y*16+6,x*16+12,y*16+2,Color); |
mbavare | 0:a5f9535b6e3d | 109 | } |
mbavare | 0:a5f9535b6e3d | 110 | void drawKing(int x,int y, int Color) { |
mbavare | 0:a5f9535b6e3d | 111 | uLCD.filled_rectangle(x*16+7,y*16+2,x*16+9,y*16+12,Color); |
mbavare | 0:a5f9535b6e3d | 112 | uLCD.filled_rectangle(x*16+4,y*16+6,x*16+12,y*16+8,Color); |
mbavare | 0:a5f9535b6e3d | 113 | } |
mbavare | 0:a5f9535b6e3d | 114 | void drawKnight(int x, int y, int Color) { |
mbavare | 0:a5f9535b6e3d | 115 | //uLCD.filled_rectangle(x+3, y+2, x+8,y+4, RED); |
mbavare | 0:a5f9535b6e3d | 116 | uLCD.triangle(x*16+8,y*16+2,x*16+4,y*16+4,x*16+8,y*16+4,Color); |
mbavare | 0:a5f9535b6e3d | 117 | uLCD.filled_rectangle(x*16+7, y*16+2, x*16+9, y*16+10, Color); |
mbavare | 0:a5f9535b6e3d | 118 | uLCD.filled_rectangle(x*16+4, y*16+10, x*16+12, y*16+ 12, Color); |
mbavare | 0:a5f9535b6e3d | 119 | } |
mbavare | 0:a5f9535b6e3d | 120 | |
mbavare | 0:a5f9535b6e3d | 121 | void drawRook(int x, int y, int Color) { |
mbavare | 0:a5f9535b6e3d | 122 | uLCD.filled_rectangle(x*16+2, y*16+4, x*16+ 14, y*16+6,Color); |
mbavare | 0:a5f9535b6e3d | 123 | uLCD.filled_rectangle(x*16+5, y*16+6, x*16+11, y*16+12, Color); |
mbavare | 0:a5f9535b6e3d | 124 | uLCD.filled_rectangle(x*16+2, y*16+12, x*16+14,y*16+14,Color); |
mbavare | 0:a5f9535b6e3d | 125 | uLCD.filled_rectangle(x*16+3, y*16+2, x*16+5, y*16+4,Color); |
mbavare | 0:a5f9535b6e3d | 126 | uLCD.filled_rectangle(x*16+7, y*16+2, x*16+9, y*16+4,Color); |
mbavare | 0:a5f9535b6e3d | 127 | uLCD.filled_rectangle(x*16+11, y*16+2,x*16+13,y*16+4,Color); |
mbavare | 0:a5f9535b6e3d | 128 | } |
mbavare | 0:a5f9535b6e3d | 129 | void drawBishop(int x, int y, int Color) { |
mbavare | 0:a5f9535b6e3d | 130 | uLCD.filled_rectangle(x*16+4,y*16+10, x*16+12, y*16+12,Color); |
mbavare | 0:a5f9535b6e3d | 131 | uLCD.filled_rectangle(x*16+7, y*16+4,x*16+9,y*16+10,Color); |
mbavare | 0:a5f9535b6e3d | 132 | uLCD.triangle(x*16+5,y*16+4,x*16+11,y*16+4,x*16+8,y*16,Color); |
mbavare | 0:a5f9535b6e3d | 133 | } |
mbavare | 0:a5f9535b6e3d | 134 | void display_board(void) |
mbavare | 0:a5f9535b6e3d | 135 | { |
mbavare | 0:a5f9535b6e3d | 136 | //uLCD.filled_rectangle(0, 0 , 127, 127, 0xefded1) ; |
mbavare | 0:a5f9535b6e3d | 137 | bool alternator = true; |
mbavare | 0:a5f9535b6e3d | 138 | for(int i=0; i<8; i++)//This loop will be executed for each row once |
mbavare | 0:a5f9535b6e3d | 139 | { |
mbavare | 0:a5f9535b6e3d | 140 | for(int j=0; j<8; j++) //This loop will be executed 7 times for each row |
mbavare | 0:a5f9535b6e3d | 141 | { |
mbavare | 0:a5f9535b6e3d | 142 | if (alternator) { |
mbavare | 0:a5f9535b6e3d | 143 | uLCD.filled_rectangle(j*16,i*16,(j*16)+16,(i*16)+16, 0xbcb6b8); |
mbavare | 0:a5f9535b6e3d | 144 | alternator = false; |
mbavare | 0:a5f9535b6e3d | 145 | } else { |
mbavare | 0:a5f9535b6e3d | 146 | uLCD.filled_rectangle(j*16,i*16,(j*16)+16,(i*16)+16, 0x645659); |
mbavare | 0:a5f9535b6e3d | 147 | alternator = true; |
mbavare | 0:a5f9535b6e3d | 148 | } |
mbavare | 0:a5f9535b6e3d | 149 | } |
mbavare | 0:a5f9535b6e3d | 150 | alternator = !alternator; |
mbavare | 0:a5f9535b6e3d | 151 | } |
mbavare | 0:a5f9535b6e3d | 152 | |
mbavare | 0:a5f9535b6e3d | 153 | //pawns |
mbavare | 0:a5f9535b6e3d | 154 | for(int i=0;i<8;i++) |
mbavare | 0:a5f9535b6e3d | 155 | { |
mbavare | 0:a5f9535b6e3d | 156 | drawPawn(i,1,BLACK); |
mbavare | 0:a5f9535b6e3d | 157 | board[i][1]= -pawn; |
mbavare | 0:a5f9535b6e3d | 158 | drawPawn(i,6,WHITE); |
mbavare | 0:a5f9535b6e3d | 159 | board[i][6]= pawn; |
mbavare | 0:a5f9535b6e3d | 160 | } |
mbavare | 0:a5f9535b6e3d | 161 | |
mbavare | 0:a5f9535b6e3d | 162 | drawRook(0,0,BLACK); |
mbavare | 0:a5f9535b6e3d | 163 | drawRook(7,0,BLACK); |
mbavare | 0:a5f9535b6e3d | 164 | board[0][0]=-rook; |
mbavare | 0:a5f9535b6e3d | 165 | board[7][0]=-rook; |
mbavare | 0:a5f9535b6e3d | 166 | |
mbavare | 0:a5f9535b6e3d | 167 | drawRook(0,7,WHITE); |
mbavare | 0:a5f9535b6e3d | 168 | drawRook(7,7,WHITE); |
mbavare | 0:a5f9535b6e3d | 169 | board[0][7]=rook; |
mbavare | 0:a5f9535b6e3d | 170 | board[7][7]=rook; |
mbavare | 0:a5f9535b6e3d | 171 | |
mbavare | 0:a5f9535b6e3d | 172 | drawKnight(1,0,BLACK); |
mbavare | 0:a5f9535b6e3d | 173 | drawKnight(6,0,BLACK); |
mbavare | 0:a5f9535b6e3d | 174 | board[1][0]=-knight; |
mbavare | 0:a5f9535b6e3d | 175 | board[6][0]=-knight; |
mbavare | 0:a5f9535b6e3d | 176 | |
mbavare | 0:a5f9535b6e3d | 177 | drawKnight(1,7,WHITE); |
mbavare | 0:a5f9535b6e3d | 178 | drawKnight(6,7,WHITE); |
mbavare | 0:a5f9535b6e3d | 179 | board[1][7]=knight; |
mbavare | 0:a5f9535b6e3d | 180 | board[6][7]=knight; |
mbavare | 0:a5f9535b6e3d | 181 | |
mbavare | 0:a5f9535b6e3d | 182 | drawBishop(2,0,BLACK); |
mbavare | 0:a5f9535b6e3d | 183 | drawBishop(5,0,BLACK); |
mbavare | 0:a5f9535b6e3d | 184 | board[2][0]=-bishop; |
mbavare | 0:a5f9535b6e3d | 185 | board[5][0]=-bishop; |
mbavare | 0:a5f9535b6e3d | 186 | |
mbavare | 0:a5f9535b6e3d | 187 | drawBishop(2,7,WHITE); |
mbavare | 0:a5f9535b6e3d | 188 | drawBishop(5,7,WHITE); |
mbavare | 0:a5f9535b6e3d | 189 | board[2][7]=bishop; |
mbavare | 0:a5f9535b6e3d | 190 | board[5][7]=bishop; |
mbavare | 0:a5f9535b6e3d | 191 | |
mbavare | 0:a5f9535b6e3d | 192 | drawQueen(3,0,BLACK); |
mbavare | 0:a5f9535b6e3d | 193 | board[3][0]=-queen; |
mbavare | 0:a5f9535b6e3d | 194 | |
mbavare | 0:a5f9535b6e3d | 195 | drawQueen(3,7,WHITE); |
mbavare | 0:a5f9535b6e3d | 196 | board[3][7]=queen; |
mbavare | 0:a5f9535b6e3d | 197 | |
mbavare | 0:a5f9535b6e3d | 198 | drawKing(4,0,BLACK); |
mbavare | 0:a5f9535b6e3d | 199 | board[4][0]=-king; |
mbavare | 0:a5f9535b6e3d | 200 | |
mbavare | 0:a5f9535b6e3d | 201 | drawKing(4,7,WHITE); |
mbavare | 0:a5f9535b6e3d | 202 | board[4][7]=king; |
mbavare | 0:a5f9535b6e3d | 203 | } |
mbavare | 0:a5f9535b6e3d | 204 | //take in a piece coordinate and move it to the new spot |
mbavare | 0:a5f9535b6e3d | 205 | void movePiece(int ox, int oy, int dx, int dy, int player) { |
mbavare | 0:a5f9535b6e3d | 206 | |
mbavare | 0:a5f9535b6e3d | 207 | if(board[dx][dy] !=0) { |
mbavare | 0:a5f9535b6e3d | 208 | if( (dx+dy)%2==0) { //moving to a white square |
mbavare | 0:a5f9535b6e3d | 209 | uLCD.filled_rectangle(dx*16,dy*16,(dx*16)+16,(dy*16)+16, 0xbcb6b8); |
mbavare | 0:a5f9535b6e3d | 210 | |
mbavare | 0:a5f9535b6e3d | 211 | } |
mbavare | 0:a5f9535b6e3d | 212 | else { //dark square |
mbavare | 0:a5f9535b6e3d | 213 | uLCD.filled_rectangle(dx*16,dy*16,(dx*16)+16,(dy*16)+16, 0x645659); |
mbavare | 0:a5f9535b6e3d | 214 | } |
mbavare | 0:a5f9535b6e3d | 215 | } |
mbavare | 0:a5f9535b6e3d | 216 | |
mbavare | 0:a5f9535b6e3d | 217 | //blank out the old square |
mbavare | 0:a5f9535b6e3d | 218 | if( (ox+oy)%2==0) { //moving from a white square |
mbavare | 0:a5f9535b6e3d | 219 | uLCD.filled_rectangle(ox*16,oy*16,(ox*16)+16,(oy*16)+16, 0xbcb6b8); |
mbavare | 0:a5f9535b6e3d | 220 | |
mbavare | 0:a5f9535b6e3d | 221 | } |
mbavare | 0:a5f9535b6e3d | 222 | else { //dark square |
mbavare | 0:a5f9535b6e3d | 223 | uLCD.filled_rectangle(ox*16,oy*16,(ox*16)+16,(oy*16)+16, 0x645659); |
mbavare | 0:a5f9535b6e3d | 224 | } |
mbavare | 0:a5f9535b6e3d | 225 | |
mbavare | 0:a5f9535b6e3d | 226 | //draw piece in the new square |
mbavare | 0:a5f9535b6e3d | 227 | switch (abs(board[ox][oy])) { |
mbavare | 0:a5f9535b6e3d | 228 | case pawn: |
mbavare | 0:a5f9535b6e3d | 229 | drawPawn(dx,dy,player); |
mbavare | 0:a5f9535b6e3d | 230 | break; |
mbavare | 0:a5f9535b6e3d | 231 | |
mbavare | 0:a5f9535b6e3d | 232 | case rook: |
mbavare | 0:a5f9535b6e3d | 233 | drawRook(dx,dy,player); |
mbavare | 0:a5f9535b6e3d | 234 | |
mbavare | 0:a5f9535b6e3d | 235 | break; |
mbavare | 0:a5f9535b6e3d | 236 | |
mbavare | 0:a5f9535b6e3d | 237 | case knight: |
mbavare | 0:a5f9535b6e3d | 238 | drawKnight(dx,dy,player); |
mbavare | 0:a5f9535b6e3d | 239 | break; |
mbavare | 0:a5f9535b6e3d | 240 | |
mbavare | 0:a5f9535b6e3d | 241 | case bishop: |
mbavare | 0:a5f9535b6e3d | 242 | drawBishop(dx,dy,player); |
mbavare | 0:a5f9535b6e3d | 243 | break; |
mbavare | 0:a5f9535b6e3d | 244 | |
mbavare | 0:a5f9535b6e3d | 245 | case queen: |
mbavare | 0:a5f9535b6e3d | 246 | drawQueen(dx,dy,player); |
mbavare | 0:a5f9535b6e3d | 247 | break; |
mbavare | 0:a5f9535b6e3d | 248 | |
mbavare | 0:a5f9535b6e3d | 249 | case king: |
mbavare | 0:a5f9535b6e3d | 250 | drawKing(dx,dy,player); |
mbavare | 0:a5f9535b6e3d | 251 | break; |
mbavare | 0:a5f9535b6e3d | 252 | } |
mbavare | 0:a5f9535b6e3d | 253 | if(board[dx][dy] !=0) |
mbavare | 0:a5f9535b6e3d | 254 | { |
mbavare | 0:a5f9535b6e3d | 255 | mySpeaker.PlayNote(500.0,0.1,0.05); |
mbavare | 0:a5f9535b6e3d | 256 | mySpeaker.PlayNote(700.0,0.1,0.05); |
mbavare | 0:a5f9535b6e3d | 257 | } |
mbavare | 0:a5f9535b6e3d | 258 | else |
mbavare | 0:a5f9535b6e3d | 259 | mySpeaker.PlayNote(600.0,0.1,0.05); |
mbavare | 0:a5f9535b6e3d | 260 | |
mbavare | 0:a5f9535b6e3d | 261 | |
mbavare | 0:a5f9535b6e3d | 262 | if(board[dx][dy] == 6) |
mbavare | 0:a5f9535b6e3d | 263 | winner = 2; |
mbavare | 0:a5f9535b6e3d | 264 | else if(board[dx][dy] == -6) |
mbavare | 0:a5f9535b6e3d | 265 | winner=1; |
mbavare | 0:a5f9535b6e3d | 266 | board[dx][dy] = board[ox][oy]; |
mbavare | 0:a5f9535b6e3d | 267 | board[ox][oy] = 0; |
mbavare | 0:a5f9535b6e3d | 268 | } |
mbavare | 0:a5f9535b6e3d | 269 | |
mbavare | 0:a5f9535b6e3d | 270 | |
mbavare | 0:a5f9535b6e3d | 271 | //should look at what piece is in old spot, redraw the square there and then draw piece in new spot |
mbavare | 0:a5f9535b6e3d | 272 | int validMove(int ox, int oy, int dx, int dy){ |
mbavare | 0:a5f9535b6e3d | 273 | int source = board[ox][oy]; |
mbavare | 0:a5f9535b6e3d | 274 | int target = board[dx][dy]; |
mbavare | 0:a5f9535b6e3d | 275 | int typePiece = abs(source); |
mbavare | 0:a5f9535b6e3d | 276 | if (board[ox][oy] > 0 && board[dx][dy]>0 || board[ox][oy] < 0 && board[dx][dy]<0) |
mbavare | 0:a5f9535b6e3d | 277 | return 0; |
mbavare | 0:a5f9535b6e3d | 278 | if (typePiece == pawn){ |
mbavare | 0:a5f9535b6e3d | 279 | if(current_player == 2 && dx==ox && dy-oy==1 && target==0) return 1; |
mbavare | 0:a5f9535b6e3d | 280 | if(current_player == 1 && dx==ox && dy-oy==-1 && target==0) return 1; |
mbavare | 0:a5f9535b6e3d | 281 | if(abs(dx-ox)==1 && current_player == 2 && dy-oy==1 && target > 0) return 1; |
mbavare | 0:a5f9535b6e3d | 282 | if(abs(dx-ox)==1 && current_player == 1 && dy-oy==-1 && target < 0) return 1; |
mbavare | 0:a5f9535b6e3d | 283 | if(current_player == 2 && oy==1 && (abs(ox-dx)==0) && abs(oy-dy)==2 && target == 0) return 1; |
mbavare | 0:a5f9535b6e3d | 284 | if(current_player == 1 && oy==6 && (abs(ox-dx)==0) &&(abs(oy-dy)==2) && target == 0) return 1; |
mbavare | 0:a5f9535b6e3d | 285 | |
mbavare | 0:a5f9535b6e3d | 286 | } else if (typePiece == rook) { |
mbavare | 0:a5f9535b6e3d | 287 | if(dx==ox){ // Moving vertically |
mbavare | 0:a5f9535b6e3d | 288 | if(dy>oy){ // Downards |
mbavare | 0:a5f9535b6e3d | 289 | for(size_t row = (unsigned)(oy+1); row < (unsigned)dy; ++row){ |
mbavare | 0:a5f9535b6e3d | 290 | if(board[dx][row] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 291 | } |
mbavare | 0:a5f9535b6e3d | 292 | } else { // Upwards |
mbavare | 0:a5f9535b6e3d | 293 | for(size_t row = (unsigned)dy+1; row < (unsigned)(oy); ++row){ |
mbavare | 0:a5f9535b6e3d | 294 | if(board[dx][row] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 295 | } |
mbavare | 0:a5f9535b6e3d | 296 | } |
mbavare | 0:a5f9535b6e3d | 297 | return 1; |
mbavare | 0:a5f9535b6e3d | 298 | } |
mbavare | 0:a5f9535b6e3d | 299 | if(dy==oy){ // Moving horizontally |
mbavare | 0:a5f9535b6e3d | 300 | if(dx>ox){ // Rightwards |
mbavare | 0:a5f9535b6e3d | 301 | for(size_t column = (unsigned)(ox+1); column < (unsigned)dx; ++column){ |
mbavare | 0:a5f9535b6e3d | 302 | if(board[column][dy] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 303 | } |
mbavare | 0:a5f9535b6e3d | 304 | } |
mbavare | 0:a5f9535b6e3d | 305 | if(dx<ox){ // Leftwards |
mbavare | 0:a5f9535b6e3d | 306 | for(size_t column = (unsigned)dx+1; column < (unsigned)(ox); ++column){ |
mbavare | 0:a5f9535b6e3d | 307 | if(board[column][dy] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 308 | } |
mbavare | 0:a5f9535b6e3d | 309 | } |
mbavare | 0:a5f9535b6e3d | 310 | return 1; |
mbavare | 0:a5f9535b6e3d | 311 | } |
mbavare | 0:a5f9535b6e3d | 312 | return 0; |
mbavare | 0:a5f9535b6e3d | 313 | } else if (typePiece == knight) { |
mbavare | 0:a5f9535b6e3d | 314 | |
mbavare | 0:a5f9535b6e3d | 315 | if((abs(dy-oy)==2 && abs(dx-ox)==1) || (abs(dx-ox)==2 && abs(dy-oy)==1)){ |
mbavare | 0:a5f9535b6e3d | 316 | return 1; |
mbavare | 0:a5f9535b6e3d | 317 | } |
mbavare | 0:a5f9535b6e3d | 318 | return 0; |
mbavare | 0:a5f9535b6e3d | 319 | } else if (typePiece ==bishop) { |
mbavare | 0:a5f9535b6e3d | 320 | // Bishop |
mbavare | 0:a5f9535b6e3d | 321 | if (abs(dx-ox) != abs(dy-oy)) |
mbavare | 0:a5f9535b6e3d | 322 | return 0; |
mbavare | 0:a5f9535b6e3d | 323 | |
mbavare | 0:a5f9535b6e3d | 324 | int ymult = -1; |
mbavare | 0:a5f9535b6e3d | 325 | int xmult = -1; |
mbavare | 0:a5f9535b6e3d | 326 | if (dx>ox) |
mbavare | 0:a5f9535b6e3d | 327 | xmult = 1; |
mbavare | 0:a5f9535b6e3d | 328 | if (dy>oy) |
mbavare | 0:a5f9535b6e3d | 329 | ymult = 1; |
mbavare | 0:a5f9535b6e3d | 330 | |
mbavare | 0:a5f9535b6e3d | 331 | for(int i=1; i < abs(dx-ox); ++i) |
mbavare | 0:a5f9535b6e3d | 332 | { |
mbavare | 0:a5f9535b6e3d | 333 | if(board[ox + i*xmult][oy+i*ymult] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 334 | } |
mbavare | 0:a5f9535b6e3d | 335 | return 1; |
mbavare | 0:a5f9535b6e3d | 336 | |
mbavare | 0:a5f9535b6e3d | 337 | } else if (typePiece ==queen) { |
mbavare | 0:a5f9535b6e3d | 338 | |
mbavare | 0:a5f9535b6e3d | 339 | // Queen |
mbavare | 0:a5f9535b6e3d | 340 | if(abs(dx-ox) == abs(dy-oy)) { |
mbavare | 0:a5f9535b6e3d | 341 | int ymult = -1; |
mbavare | 0:a5f9535b6e3d | 342 | int xmult = -1; |
mbavare | 0:a5f9535b6e3d | 343 | if (dx>ox) |
mbavare | 0:a5f9535b6e3d | 344 | xmult = 1; |
mbavare | 0:a5f9535b6e3d | 345 | if (dy>oy) |
mbavare | 0:a5f9535b6e3d | 346 | ymult = 1; |
mbavare | 0:a5f9535b6e3d | 347 | |
mbavare | 0:a5f9535b6e3d | 348 | for(int i=1; i < abs(dx-ox); ++i) |
mbavare | 0:a5f9535b6e3d | 349 | { |
mbavare | 0:a5f9535b6e3d | 350 | if(board[ox + i*xmult][oy+i*ymult] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 351 | } |
mbavare | 0:a5f9535b6e3d | 352 | return 1; |
mbavare | 0:a5f9535b6e3d | 353 | |
mbavare | 0:a5f9535b6e3d | 354 | } |
mbavare | 0:a5f9535b6e3d | 355 | |
mbavare | 0:a5f9535b6e3d | 356 | if(dx==ox){ // Moving vertically |
mbavare | 0:a5f9535b6e3d | 357 | if(dy>oy){ // Downards |
mbavare | 0:a5f9535b6e3d | 358 | for(size_t row = (unsigned)(oy+1); row < (unsigned)dy; ++row){ |
mbavare | 0:a5f9535b6e3d | 359 | if(board[dx][row] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 360 | } |
mbavare | 0:a5f9535b6e3d | 361 | } else { // Upwards |
mbavare | 0:a5f9535b6e3d | 362 | for(size_t row = (unsigned)dy+1; row < (unsigned)(oy); ++row){ |
mbavare | 0:a5f9535b6e3d | 363 | if(board[dx][row] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 364 | } |
mbavare | 0:a5f9535b6e3d | 365 | } |
mbavare | 0:a5f9535b6e3d | 366 | return 1; |
mbavare | 0:a5f9535b6e3d | 367 | } |
mbavare | 0:a5f9535b6e3d | 368 | if(dy==oy){ // Moving horizontally |
mbavare | 0:a5f9535b6e3d | 369 | if(dx>ox){ // Rightwards |
mbavare | 0:a5f9535b6e3d | 370 | for(size_t column = (unsigned)(ox+1); column < (unsigned)dx; ++column){ |
mbavare | 0:a5f9535b6e3d | 371 | if(board[column][dy] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 372 | } |
mbavare | 0:a5f9535b6e3d | 373 | } |
mbavare | 0:a5f9535b6e3d | 374 | if(dx<ox){ // Leftwards |
mbavare | 0:a5f9535b6e3d | 375 | for(size_t column = (unsigned)dx+1; column < (unsigned)(ox); ++column){ |
mbavare | 0:a5f9535b6e3d | 376 | if(board[column][dy] != 0) return 0; |
mbavare | 0:a5f9535b6e3d | 377 | } |
mbavare | 0:a5f9535b6e3d | 378 | } |
mbavare | 0:a5f9535b6e3d | 379 | return 1; |
mbavare | 0:a5f9535b6e3d | 380 | } |
mbavare | 0:a5f9535b6e3d | 381 | return 0; |
mbavare | 0:a5f9535b6e3d | 382 | |
mbavare | 0:a5f9535b6e3d | 383 | } else if (typePiece ==king) { |
mbavare | 0:a5f9535b6e3d | 384 | if(abs(dy-oy)<=1 && abs(dx-ox)<=1) return 1; |
mbavare | 0:a5f9535b6e3d | 385 | return 0; |
mbavare | 0:a5f9535b6e3d | 386 | } |
mbavare | 0:a5f9535b6e3d | 387 | |
mbavare | 0:a5f9535b6e3d | 388 | return 0; |
mbavare | 0:a5f9535b6e3d | 389 | } |
mbavare | 0:a5f9535b6e3d | 390 | |
mbavare | 0:a5f9535b6e3d | 391 | |
mbavare | 0:a5f9535b6e3d | 392 | PinDetect up(p26); |
mbavare | 0:a5f9535b6e3d | 393 | PinDetect center(p25); |
mbavare | 0:a5f9535b6e3d | 394 | PinDetect left(p24); |
mbavare | 0:a5f9535b6e3d | 395 | PinDetect down(p23); |
mbavare | 0:a5f9535b6e3d | 396 | PinDetect right(p22); |
mbavare | 0:a5f9535b6e3d | 397 | |
mbavare | 0:a5f9535b6e3d | 398 | volatile int x = 4; |
mbavare | 0:a5f9535b6e3d | 399 | volatile int y = 6; |
mbavare | 0:a5f9535b6e3d | 400 | volatile int x2 = 4; |
mbavare | 0:a5f9535b6e3d | 401 | volatile int y2 = 2; |
mbavare | 0:a5f9535b6e3d | 402 | volatile bool center_hit = false; |
mbavare | 0:a5f9535b6e3d | 403 | void up_hit_callback(void) { |
mbavare | 0:a5f9535b6e3d | 404 | --y; |
mbavare | 0:a5f9535b6e3d | 405 | if(y<0) |
mbavare | 0:a5f9535b6e3d | 406 | y=7; |
mbavare | 0:a5f9535b6e3d | 407 | } |
mbavare | 0:a5f9535b6e3d | 408 | void down_hit_callback(void) { |
mbavare | 0:a5f9535b6e3d | 409 | y = (y+1)%8; |
mbavare | 0:a5f9535b6e3d | 410 | } |
mbavare | 0:a5f9535b6e3d | 411 | void left_hit_callback(void) { |
mbavare | 0:a5f9535b6e3d | 412 | --x; |
mbavare | 0:a5f9535b6e3d | 413 | if(x<0) |
mbavare | 0:a5f9535b6e3d | 414 | x=7; |
mbavare | 0:a5f9535b6e3d | 415 | } |
mbavare | 0:a5f9535b6e3d | 416 | void right_hit_callback(void) { |
mbavare | 0:a5f9535b6e3d | 417 | x = (x+1)%8; |
mbavare | 0:a5f9535b6e3d | 418 | } |
mbavare | 0:a5f9535b6e3d | 419 | void center_hit_callback(void) { |
mbavare | 0:a5f9535b6e3d | 420 | center_hit = true; |
mbavare | 0:a5f9535b6e3d | 421 | } |
mbavare | 0:a5f9535b6e3d | 422 | |
mbavare | 0:a5f9535b6e3d | 423 | |
mbavare | 0:a5f9535b6e3d | 424 | |
mbavare | 0:a5f9535b6e3d | 425 | int main() { |
mbavare | 0:a5f9535b6e3d | 426 | |
mbavare | 0:a5f9535b6e3d | 427 | center.attach_deasserted(¢er_hit_callback); |
mbavare | 0:a5f9535b6e3d | 428 | left.attach_deasserted(&left_hit_callback); |
mbavare | 0:a5f9535b6e3d | 429 | right.attach_deasserted(&right_hit_callback); |
mbavare | 0:a5f9535b6e3d | 430 | up.attach_deasserted(&up_hit_callback); |
mbavare | 0:a5f9535b6e3d | 431 | down.attach_deasserted(&down_hit_callback); |
mbavare | 0:a5f9535b6e3d | 432 | |
mbavare | 0:a5f9535b6e3d | 433 | center.setSampleFrequency(); |
mbavare | 0:a5f9535b6e3d | 434 | left.setSampleFrequency(); |
mbavare | 0:a5f9535b6e3d | 435 | right.setSampleFrequency(); |
mbavare | 0:a5f9535b6e3d | 436 | down.setSampleFrequency(); |
mbavare | 0:a5f9535b6e3d | 437 | up.setSampleFrequency(); |
mbavare | 0:a5f9535b6e3d | 438 | |
mbavare | 0:a5f9535b6e3d | 439 | |
mbavare | 0:a5f9535b6e3d | 440 | display_board(); |
mbavare | 0:a5f9535b6e3d | 441 | int oldx = 4; |
mbavare | 0:a5f9535b6e3d | 442 | int oldx2 = 4; |
mbavare | 0:a5f9535b6e3d | 443 | int oldy = 6; |
mbavare | 0:a5f9535b6e3d | 444 | int oldy2 = 1; |
mbavare | 0:a5f9535b6e3d | 445 | int selectedx; |
mbavare | 0:a5f9535b6e3d | 446 | int selectedy; |
mbavare | 0:a5f9535b6e3d | 447 | bool selected=false; |
mbavare | 0:a5f9535b6e3d | 448 | int selectedx2; |
mbavare | 0:a5f9535b6e3d | 449 | int selectedy2; |
mbavare | 0:a5f9535b6e3d | 450 | bool selected2 = false; |
mbavare | 0:a5f9535b6e3d | 451 | uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, GREEN); |
mbavare | 0:a5f9535b6e3d | 452 | |
mbavare | 0:a5f9535b6e3d | 453 | while(1) { |
mbavare | 0:a5f9535b6e3d | 454 | while(current_player==1) { |
mbavare | 0:a5f9535b6e3d | 455 | //put a border around selected square |
mbavare | 0:a5f9535b6e3d | 456 | myLed4 = 0; |
mbavare | 0:a5f9535b6e3d | 457 | myLed1 = selected; |
mbavare | 0:a5f9535b6e3d | 458 | if(x != oldx || y != oldy) { |
mbavare | 0:a5f9535b6e3d | 459 | mySpeaker.PlayNote(969.0,0.05,0.05); |
mbavare | 0:a5f9535b6e3d | 460 | if(oldx % 2 == oldy %2) |
mbavare | 0:a5f9535b6e3d | 461 | uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0xbcb6b8); |
mbavare | 0:a5f9535b6e3d | 462 | else |
mbavare | 0:a5f9535b6e3d | 463 | uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0x645659); |
mbavare | 0:a5f9535b6e3d | 464 | |
mbavare | 0:a5f9535b6e3d | 465 | uLCD.rectangle(x*16,y*16,(x*16)+16,(y*16)+16, GREEN); |
mbavare | 0:a5f9535b6e3d | 466 | oldx = x; |
mbavare | 0:a5f9535b6e3d | 467 | oldy = y; |
mbavare | 0:a5f9535b6e3d | 468 | } |
mbavare | 0:a5f9535b6e3d | 469 | |
mbavare | 0:a5f9535b6e3d | 470 | if (center_hit) { |
mbavare | 0:a5f9535b6e3d | 471 | if(board[oldx][oldy] > 0 || selected) |
mbavare | 0:a5f9535b6e3d | 472 | { |
mbavare | 0:a5f9535b6e3d | 473 | if(selected) { |
mbavare | 0:a5f9535b6e3d | 474 | //check move, make move and change turn if valid |
mbavare | 0:a5f9535b6e3d | 475 | if(selectedx == oldx && selectedy==oldy) { //deselect piece by clicking on it again |
mbavare | 0:a5f9535b6e3d | 476 | selected = false; |
mbavare | 0:a5f9535b6e3d | 477 | } |
mbavare | 0:a5f9535b6e3d | 478 | else { |
mbavare | 0:a5f9535b6e3d | 479 | if(validMove(selectedx, selectedy, oldx, oldy) ==1) { |
mbavare | 0:a5f9535b6e3d | 480 | movePiece(selectedx, selectedy, oldx, oldy, WHITE); |
mbavare | 0:a5f9535b6e3d | 481 | selected = false; |
mbavare | 0:a5f9535b6e3d | 482 | current_player = 2; |
mbavare | 0:a5f9535b6e3d | 483 | if(oldx % 2 == oldy %2) |
mbavare | 0:a5f9535b6e3d | 484 | uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0xbcb6b8); |
mbavare | 0:a5f9535b6e3d | 485 | else |
mbavare | 0:a5f9535b6e3d | 486 | uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0x645659); |
mbavare | 0:a5f9535b6e3d | 487 | |
mbavare | 0:a5f9535b6e3d | 488 | uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, BLUE); |
mbavare | 0:a5f9535b6e3d | 489 | } |
mbavare | 0:a5f9535b6e3d | 490 | } |
mbavare | 0:a5f9535b6e3d | 491 | } |
mbavare | 0:a5f9535b6e3d | 492 | else |
mbavare | 0:a5f9535b6e3d | 493 | { |
mbavare | 0:a5f9535b6e3d | 494 | selected = true; |
mbavare | 0:a5f9535b6e3d | 495 | selectedx = oldx; |
mbavare | 0:a5f9535b6e3d | 496 | selectedy = oldy; |
mbavare | 0:a5f9535b6e3d | 497 | } |
mbavare | 0:a5f9535b6e3d | 498 | |
mbavare | 0:a5f9535b6e3d | 499 | } |
mbavare | 0:a5f9535b6e3d | 500 | center_hit =false; |
mbavare | 0:a5f9535b6e3d | 501 | } |
mbavare | 0:a5f9535b6e3d | 502 | |
mbavare | 0:a5f9535b6e3d | 503 | } |
mbavare | 0:a5f9535b6e3d | 504 | while(current_player==2 && winner!=1) |
mbavare | 0:a5f9535b6e3d | 505 | { |
mbavare | 0:a5f9535b6e3d | 506 | myLed4 = 1; |
mbavare | 0:a5f9535b6e3d | 507 | char bnum=0; |
mbavare | 0:a5f9535b6e3d | 508 | char bhit=0; |
mbavare | 0:a5f9535b6e3d | 509 | myLed1 = selected2; |
mbavare | 0:a5f9535b6e3d | 510 | |
mbavare | 0:a5f9535b6e3d | 511 | bool one_hit = false; |
mbavare | 0:a5f9535b6e3d | 512 | if (blue.getc()=='!') { |
mbavare | 0:a5f9535b6e3d | 513 | if (blue.getc()=='B') { //button data packet |
mbavare | 0:a5f9535b6e3d | 514 | bnum = blue.getc(); //button number |
mbavare | 0:a5f9535b6e3d | 515 | bhit = blue.getc(); //1=hit, 0=release |
mbavare | 0:a5f9535b6e3d | 516 | if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
mbavare | 0:a5f9535b6e3d | 517 | switch (bnum) { |
mbavare | 0:a5f9535b6e3d | 518 | case '1': //number button 1 |
mbavare | 0:a5f9535b6e3d | 519 | if (bhit=='1') { |
mbavare | 0:a5f9535b6e3d | 520 | one_hit = true; |
mbavare | 0:a5f9535b6e3d | 521 | } |
mbavare | 0:a5f9535b6e3d | 522 | break; |
mbavare | 0:a5f9535b6e3d | 523 | case '5': //button 5 up arrow |
mbavare | 0:a5f9535b6e3d | 524 | if (bhit=='1') { |
mbavare | 0:a5f9535b6e3d | 525 | //y2 = (y2-1)%8; |
mbavare | 0:a5f9535b6e3d | 526 | --y2; |
mbavare | 0:a5f9535b6e3d | 527 | if(y2<0) |
mbavare | 0:a5f9535b6e3d | 528 | y2=7; |
mbavare | 0:a5f9535b6e3d | 529 | } |
mbavare | 0:a5f9535b6e3d | 530 | break; |
mbavare | 0:a5f9535b6e3d | 531 | case '6': //button 6 down arrow |
mbavare | 0:a5f9535b6e3d | 532 | if (bhit=='1') { |
mbavare | 0:a5f9535b6e3d | 533 | y2 = (y2+1)%8; |
mbavare | 0:a5f9535b6e3d | 534 | } |
mbavare | 0:a5f9535b6e3d | 535 | break; |
mbavare | 0:a5f9535b6e3d | 536 | case '7': //button 7 left arrow |
mbavare | 0:a5f9535b6e3d | 537 | if (bhit=='1') { |
mbavare | 0:a5f9535b6e3d | 538 | //x2 = (x2-1)%8; |
mbavare | 0:a5f9535b6e3d | 539 | --x2; |
mbavare | 0:a5f9535b6e3d | 540 | if(x2<0) |
mbavare | 0:a5f9535b6e3d | 541 | x2=7; |
mbavare | 0:a5f9535b6e3d | 542 | } |
mbavare | 0:a5f9535b6e3d | 543 | break; |
mbavare | 0:a5f9535b6e3d | 544 | case '8': //button 8 right arrow |
mbavare | 0:a5f9535b6e3d | 545 | if (bhit=='1') { |
mbavare | 0:a5f9535b6e3d | 546 | x2 = (x2+1)%8; |
mbavare | 0:a5f9535b6e3d | 547 | } |
mbavare | 0:a5f9535b6e3d | 548 | break; |
mbavare | 0:a5f9535b6e3d | 549 | |
mbavare | 0:a5f9535b6e3d | 550 | } |
mbavare | 0:a5f9535b6e3d | 551 | |
mbavare | 0:a5f9535b6e3d | 552 | |
mbavare | 0:a5f9535b6e3d | 553 | if(x2 != oldx2 || y2 != oldy2) |
mbavare | 0:a5f9535b6e3d | 554 | { |
mbavare | 0:a5f9535b6e3d | 555 | mySpeaker.PlayNote(800.0,0.05,0.05); |
mbavare | 0:a5f9535b6e3d | 556 | if(oldx % 2 == oldy2 %2) |
mbavare | 0:a5f9535b6e3d | 557 | uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0xbcb6b8); |
mbavare | 0:a5f9535b6e3d | 558 | else |
mbavare | 0:a5f9535b6e3d | 559 | uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0x645659); |
mbavare | 0:a5f9535b6e3d | 560 | |
mbavare | 0:a5f9535b6e3d | 561 | uLCD.rectangle(x2*16,y2*16,(x2*16)+16,(y2*16)+16, BLUE); |
mbavare | 0:a5f9535b6e3d | 562 | oldx2 = x2; |
mbavare | 0:a5f9535b6e3d | 563 | oldy2 = y2; |
mbavare | 0:a5f9535b6e3d | 564 | } |
mbavare | 0:a5f9535b6e3d | 565 | |
mbavare | 0:a5f9535b6e3d | 566 | if (one_hit) { |
mbavare | 0:a5f9535b6e3d | 567 | if(board[oldx2][oldy2] < 0 || selected2) { |
mbavare | 0:a5f9535b6e3d | 568 | if(selected2) { |
mbavare | 0:a5f9535b6e3d | 569 | //check move, make move and change turn if valid |
mbavare | 0:a5f9535b6e3d | 570 | if(selectedx2 == oldx2 && selectedy2 == oldy2) { |
mbavare | 0:a5f9535b6e3d | 571 | selected2 = false; |
mbavare | 0:a5f9535b6e3d | 572 | } |
mbavare | 0:a5f9535b6e3d | 573 | else { |
mbavare | 0:a5f9535b6e3d | 574 | if(validMove(selectedx2, selectedy2, oldx2, oldy2)) { |
mbavare | 0:a5f9535b6e3d | 575 | movePiece(selectedx2, selectedy2, oldx2, oldy2, BLACK); |
mbavare | 0:a5f9535b6e3d | 576 | selected2 = false; |
mbavare | 0:a5f9535b6e3d | 577 | current_player = 1; |
mbavare | 0:a5f9535b6e3d | 578 | if(oldx % 2 == oldy2 %2) |
mbavare | 0:a5f9535b6e3d | 579 | uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0xbcb6b8); |
mbavare | 0:a5f9535b6e3d | 580 | else |
mbavare | 0:a5f9535b6e3d | 581 | uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0x645659); |
mbavare | 0:a5f9535b6e3d | 582 | uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, GREEN); |
mbavare | 0:a5f9535b6e3d | 583 | } |
mbavare | 0:a5f9535b6e3d | 584 | } |
mbavare | 0:a5f9535b6e3d | 585 | } |
mbavare | 0:a5f9535b6e3d | 586 | else |
mbavare | 0:a5f9535b6e3d | 587 | { |
mbavare | 0:a5f9535b6e3d | 588 | selected2 = true; |
mbavare | 0:a5f9535b6e3d | 589 | selectedx2 = oldx2; |
mbavare | 0:a5f9535b6e3d | 590 | selectedy2 = oldy2; |
mbavare | 0:a5f9535b6e3d | 591 | } |
mbavare | 0:a5f9535b6e3d | 592 | one_hit =false; |
mbavare | 0:a5f9535b6e3d | 593 | } |
mbavare | 0:a5f9535b6e3d | 594 | } |
mbavare | 0:a5f9535b6e3d | 595 | |
mbavare | 0:a5f9535b6e3d | 596 | |
mbavare | 0:a5f9535b6e3d | 597 | |
mbavare | 0:a5f9535b6e3d | 598 | } |
mbavare | 0:a5f9535b6e3d | 599 | } |
mbavare | 0:a5f9535b6e3d | 600 | |
mbavare | 0:a5f9535b6e3d | 601 | } |
mbavare | 0:a5f9535b6e3d | 602 | |
mbavare | 0:a5f9535b6e3d | 603 | } |
mbavare | 0:a5f9535b6e3d | 604 | while(winner) { |
mbavare | 0:a5f9535b6e3d | 605 | uLCD.cls(); |
mbavare | 0:a5f9535b6e3d | 606 | uLCD.printf("Player %i wins", winner); |
mbavare | 0:a5f9535b6e3d | 607 | while(1) { |
mbavare | 0:a5f9535b6e3d | 608 | |
mbavare | 0:a5f9535b6e3d | 609 | uLCD.media_init(); |
mbavare | 0:a5f9535b6e3d | 610 | uLCD.set_sector_address(0x0000, 0x00); |
mbavare | 0:a5f9535b6e3d | 611 | uLCD.display_video(0,0); |
mbavare | 0:a5f9535b6e3d | 612 | } |
mbavare | 0:a5f9535b6e3d | 613 | } |
mbavare | 0:a5f9535b6e3d | 614 | |
mbavare | 0:a5f9535b6e3d | 615 | |
mbavare | 0:a5f9535b6e3d | 616 | |
mbavare | 0:a5f9535b6e3d | 617 | } |
mbavare | 0:a5f9535b6e3d | 618 | } |