Chess game on the mbed.

Dependencies:   4DGL-uLCD-SE PinDetect SDFileSystem mbed

Committer:
mbavare
Date:
Mon Mar 14 02:45:47 2016 +0000
Revision:
0:a5f9535b6e3d
Child:
1:af3a896cd76d
final

Who changed what in which revision?

UserRevisionLine numberNew 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(&center_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 }