Miheer Bavare / Mbed 2 deprecated Chess

Dependencies:   4DGL-uLCD-SE PinDetect SDFileSystem mbed

Committer:
mbavare
Date:
Mon Mar 14 16:37:51 2016 +0000
Revision:
1:af3a896cd76d
Parent:
0:a5f9535b6e3d
...

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 uLCD_4DGL uLCD(p28,p27,p29); // serial tx, serial rx, reset pin;
mbavare 0:a5f9535b6e3d 9
mbavare 1:af3a896cd76d 10 //bluetooth for the player two controller
mbavare 0:a5f9535b6e3d 11 Serial blue(p13,p14); //serial tx, rx
mbavare 0:a5f9535b6e3d 12
mbavare 1:af3a896cd76d 13 //Using the speaker as a pwm out
mbavare 0:a5f9535b6e3d 14 Speaker mySpeaker(p21);
mbavare 0:a5f9535b6e3d 15
mbavare 1:af3a896cd76d 16 //set up the chess board as an int array
mbavare 1:af3a896cd76d 17 int board[8][8]={0};
mbavare 0:a5f9535b6e3d 18
mbavare 1:af3a896cd76d 19 //Set the pieces so we can refer to them by name
mbavare 0:a5f9535b6e3d 20 const int pawn=1;
mbavare 0:a5f9535b6e3d 21 const int rook=2;
mbavare 0:a5f9535b6e3d 22 const int knight=3;
mbavare 0:a5f9535b6e3d 23 const int bishop=4;
mbavare 0:a5f9535b6e3d 24 const int queen=5;
mbavare 0:a5f9535b6e3d 25 const int king=6;
mbavare 0:a5f9535b6e3d 26
mbavare 1:af3a896cd76d 27 //global variables to keep track of the current player and the winner
mbavare 0:a5f9535b6e3d 28 int winner = 0;
mbavare 1:af3a896cd76d 29 int current_player = 1;
mbavare 0:a5f9535b6e3d 30
mbavare 1:af3a896cd76d 31 //class declaration for the navswitch
mbavare 0:a5f9535b6e3d 32 class Nav_Switch
mbavare 0:a5f9535b6e3d 33 {
mbavare 0:a5f9535b6e3d 34 public:
mbavare 0:a5f9535b6e3d 35 Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
mbavare 0:a5f9535b6e3d 36 int read();
mbavare 0:a5f9535b6e3d 37 //boolean functions to test each switch
mbavare 0:a5f9535b6e3d 38 bool up();
mbavare 0:a5f9535b6e3d 39 bool down();
mbavare 0:a5f9535b6e3d 40 bool left();
mbavare 0:a5f9535b6e3d 41 bool right();
mbavare 0:a5f9535b6e3d 42 bool fire();
mbavare 0:a5f9535b6e3d 43 //automatic read on RHS
mbavare 0:a5f9535b6e3d 44 operator int ();
mbavare 0:a5f9535b6e3d 45 //index to any switch array style
mbavare 0:a5f9535b6e3d 46 bool operator[](int index) {
mbavare 0:a5f9535b6e3d 47 return _pins[index];
mbavare 0:a5f9535b6e3d 48 };
mbavare 0:a5f9535b6e3d 49 private:
mbavare 0:a5f9535b6e3d 50 BusIn _pins;
mbavare 1:af3a896cd76d 51
mbavare 0:a5f9535b6e3d 52 };
mbavare 0:a5f9535b6e3d 53 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
mbavare 1:af3a896cd76d 54 _pins(up, down, left, right, fire)
mbavare 0:a5f9535b6e3d 55 {
mbavare 0:a5f9535b6e3d 56 _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
mbavare 0:a5f9535b6e3d 57 wait(0.001); //delays just a bit for pullups to pull inputs high
mbavare 0:a5f9535b6e3d 58 }
mbavare 0:a5f9535b6e3d 59 inline bool Nav_Switch::up()
mbavare 0:a5f9535b6e3d 60 {
mbavare 0:a5f9535b6e3d 61 return !(_pins[0]);
mbavare 0:a5f9535b6e3d 62 }
mbavare 0:a5f9535b6e3d 63 inline bool Nav_Switch::down()
mbavare 0:a5f9535b6e3d 64 {
mbavare 0:a5f9535b6e3d 65 return !(_pins[1]);
mbavare 0:a5f9535b6e3d 66 }
mbavare 0:a5f9535b6e3d 67 inline bool Nav_Switch::left()
mbavare 0:a5f9535b6e3d 68 {
mbavare 0:a5f9535b6e3d 69 return !(_pins[2]);
mbavare 0:a5f9535b6e3d 70 }
mbavare 0:a5f9535b6e3d 71 inline bool Nav_Switch::right()
mbavare 0:a5f9535b6e3d 72 {
mbavare 0:a5f9535b6e3d 73 return !(_pins[3]);
mbavare 0:a5f9535b6e3d 74 }
mbavare 0:a5f9535b6e3d 75 inline bool Nav_Switch::fire()
mbavare 0:a5f9535b6e3d 76 {
mbavare 0:a5f9535b6e3d 77 return !(_pins[4]);
mbavare 0:a5f9535b6e3d 78 }
mbavare 0:a5f9535b6e3d 79 inline int Nav_Switch::read()
mbavare 0:a5f9535b6e3d 80 {
mbavare 0:a5f9535b6e3d 81 return _pins.read();
mbavare 0:a5f9535b6e3d 82 }
mbavare 0:a5f9535b6e3d 83 inline Nav_Switch::operator int ()
mbavare 0:a5f9535b6e3d 84 {
mbavare 0:a5f9535b6e3d 85 return _pins.read();
mbavare 0:a5f9535b6e3d 86 }
mbavare 1:af3a896cd76d 87
mbavare 0:a5f9535b6e3d 88 Nav_Switch p1( p9, p6, p7, p5, p8); //pin order on Sparkfun breakout
mbavare 1:af3a896cd76d 89
mbavare 1:af3a896cd76d 90 //set the MBED leds up to signal information
mbavare 0:a5f9535b6e3d 91 DigitalOut myLed1(LED1);
mbavare 0:a5f9535b6e3d 92 DigitalOut myLed2(LED2);
mbavare 0:a5f9535b6e3d 93 DigitalOut myLed3(LED3);
mbavare 0:a5f9535b6e3d 94 DigitalOut myLed4(LED4);
mbavare 0:a5f9535b6e3d 95
mbavare 1:af3a896cd76d 96 //functions for drawing the different chess pieces using uLCD member functions
mbavare 0:a5f9535b6e3d 97 void drawPawn(int x, int y, int Color) {
mbavare 0:a5f9535b6e3d 98 uLCD.filled_circle(x*16+8,y*16+5,2,Color);
mbavare 0:a5f9535b6e3d 99 uLCD.triangle(x*16+8,y*16+5,x*16+4,y*16+12,x*16+12,y*16+12,Color);
mbavare 0:a5f9535b6e3d 100 }
mbavare 0:a5f9535b6e3d 101 void drawQueen(int x, int y, int Color) {
mbavare 0:a5f9535b6e3d 102 uLCD.filled_rectangle(x*16+4,y*16+6, x*16+12, y*16+12, Color);
mbavare 0:a5f9535b6e3d 103 uLCD.triangle(x*16+4,y*16+6,x*16+4,y*16+2,x*16+7,y*16+6,Color);
mbavare 0:a5f9535b6e3d 104 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 105 uLCD.triangle(x*16+10,y*16+6,x*16+12,y*16+6,x*16+12,y*16+2,Color);
mbavare 0:a5f9535b6e3d 106 }
mbavare 0:a5f9535b6e3d 107 void drawKing(int x,int y, int Color) {
mbavare 0:a5f9535b6e3d 108 uLCD.filled_rectangle(x*16+7,y*16+2,x*16+9,y*16+12,Color);
mbavare 0:a5f9535b6e3d 109 uLCD.filled_rectangle(x*16+4,y*16+6,x*16+12,y*16+8,Color);
mbavare 0:a5f9535b6e3d 110 }
mbavare 0:a5f9535b6e3d 111 void drawKnight(int x, int y, int Color) {
mbavare 0:a5f9535b6e3d 112 uLCD.triangle(x*16+8,y*16+2,x*16+4,y*16+4,x*16+8,y*16+4,Color);
mbavare 0:a5f9535b6e3d 113 uLCD.filled_rectangle(x*16+7, y*16+2, x*16+9, y*16+10, Color);
mbavare 0:a5f9535b6e3d 114 uLCD.filled_rectangle(x*16+4, y*16+10, x*16+12, y*16+ 12, Color);
mbavare 0:a5f9535b6e3d 115 }
mbavare 0:a5f9535b6e3d 116 void drawRook(int x, int y, int Color) {
mbavare 0:a5f9535b6e3d 117 uLCD.filled_rectangle(x*16+2, y*16+4, x*16+ 14, y*16+6,Color);
mbavare 0:a5f9535b6e3d 118 uLCD.filled_rectangle(x*16+5, y*16+6, x*16+11, y*16+12, Color);
mbavare 0:a5f9535b6e3d 119 uLCD.filled_rectangle(x*16+2, y*16+12, x*16+14,y*16+14,Color);
mbavare 0:a5f9535b6e3d 120 uLCD.filled_rectangle(x*16+3, y*16+2, x*16+5, y*16+4,Color);
mbavare 0:a5f9535b6e3d 121 uLCD.filled_rectangle(x*16+7, y*16+2, x*16+9, y*16+4,Color);
mbavare 0:a5f9535b6e3d 122 uLCD.filled_rectangle(x*16+11, y*16+2,x*16+13,y*16+4,Color);
mbavare 0:a5f9535b6e3d 123 }
mbavare 0:a5f9535b6e3d 124 void drawBishop(int x, int y, int Color) {
mbavare 0:a5f9535b6e3d 125 uLCD.filled_rectangle(x*16+4,y*16+10, x*16+12, y*16+12,Color);
mbavare 0:a5f9535b6e3d 126 uLCD.filled_rectangle(x*16+7, y*16+4,x*16+9,y*16+10,Color);
mbavare 0:a5f9535b6e3d 127 uLCD.triangle(x*16+5,y*16+4,x*16+11,y*16+4,x*16+8,y*16,Color);
mbavare 0:a5f9535b6e3d 128 }
mbavare 1:af3a896cd76d 129
mbavare 1:af3a896cd76d 130 //display_board sets up the board in the beginning of the game
mbavare 0:a5f9535b6e3d 131 void display_board(void)
mbavare 0:a5f9535b6e3d 132 {
mbavare 1:af3a896cd76d 133 //this loop draws the board squares, alternating color
mbavare 0:a5f9535b6e3d 134 bool alternator = true;
mbavare 0:a5f9535b6e3d 135 for(int i=0; i<8; i++)//This loop will be executed for each row once
mbavare 0:a5f9535b6e3d 136 {
mbavare 0:a5f9535b6e3d 137 for(int j=0; j<8; j++) //This loop will be executed 7 times for each row
mbavare 0:a5f9535b6e3d 138 {
mbavare 0:a5f9535b6e3d 139 if (alternator) {
mbavare 1:af3a896cd76d 140 uLCD.filled_rectangle(j*16,i*16,(j*16)+16,(i*16)+16, 0xbcb6b8); //draws a light tan (white) square
mbavare 0:a5f9535b6e3d 141 alternator = false;
mbavare 0:a5f9535b6e3d 142 } else {
mbavare 1:af3a896cd76d 143 uLCD.filled_rectangle(j*16,i*16,(j*16)+16,(i*16)+16, 0x645659); //draws a dark brown (black) square
mbavare 0:a5f9535b6e3d 144 alternator = true;
mbavare 0:a5f9535b6e3d 145 }
mbavare 0:a5f9535b6e3d 146 }
mbavare 0:a5f9535b6e3d 147 alternator = !alternator;
mbavare 0:a5f9535b6e3d 148 }
mbavare 0:a5f9535b6e3d 149
mbavare 1:af3a896cd76d 150 //draw the pieces in their initial placement and update the board array
mbavare 1:af3a896cd76d 151 for(int i=0;i<8;i++) //set the pawns up in a for loop
mbavare 0:a5f9535b6e3d 152 {
mbavare 0:a5f9535b6e3d 153 drawPawn(i,1,BLACK);
mbavare 0:a5f9535b6e3d 154 board[i][1]= -pawn;
mbavare 0:a5f9535b6e3d 155 drawPawn(i,6,WHITE);
mbavare 0:a5f9535b6e3d 156 board[i][6]= pawn;
mbavare 0:a5f9535b6e3d 157 }
mbavare 0:a5f9535b6e3d 158
mbavare 0:a5f9535b6e3d 159 drawRook(0,0,BLACK);
mbavare 0:a5f9535b6e3d 160 drawRook(7,0,BLACK);
mbavare 0:a5f9535b6e3d 161 board[0][0]=-rook;
mbavare 0:a5f9535b6e3d 162 board[7][0]=-rook;
mbavare 1:af3a896cd76d 163
mbavare 0:a5f9535b6e3d 164 drawRook(0,7,WHITE);
mbavare 0:a5f9535b6e3d 165 drawRook(7,7,WHITE);
mbavare 0:a5f9535b6e3d 166 board[0][7]=rook;
mbavare 0:a5f9535b6e3d 167 board[7][7]=rook;
mbavare 1:af3a896cd76d 168
mbavare 0:a5f9535b6e3d 169 drawKnight(1,0,BLACK);
mbavare 0:a5f9535b6e3d 170 drawKnight(6,0,BLACK);
mbavare 0:a5f9535b6e3d 171 board[1][0]=-knight;
mbavare 0:a5f9535b6e3d 172 board[6][0]=-knight;
mbavare 0:a5f9535b6e3d 173
mbavare 0:a5f9535b6e3d 174 drawKnight(1,7,WHITE);
mbavare 0:a5f9535b6e3d 175 drawKnight(6,7,WHITE);
mbavare 0:a5f9535b6e3d 176 board[1][7]=knight;
mbavare 0:a5f9535b6e3d 177 board[6][7]=knight;
mbavare 0:a5f9535b6e3d 178
mbavare 0:a5f9535b6e3d 179 drawBishop(2,0,BLACK);
mbavare 0:a5f9535b6e3d 180 drawBishop(5,0,BLACK);
mbavare 0:a5f9535b6e3d 181 board[2][0]=-bishop;
mbavare 0:a5f9535b6e3d 182 board[5][0]=-bishop;
mbavare 0:a5f9535b6e3d 183
mbavare 0:a5f9535b6e3d 184 drawBishop(2,7,WHITE);
mbavare 0:a5f9535b6e3d 185 drawBishop(5,7,WHITE);
mbavare 0:a5f9535b6e3d 186 board[2][7]=bishop;
mbavare 0:a5f9535b6e3d 187 board[5][7]=bishop;
mbavare 0:a5f9535b6e3d 188
mbavare 0:a5f9535b6e3d 189 drawQueen(3,0,BLACK);
mbavare 0:a5f9535b6e3d 190 board[3][0]=-queen;
mbavare 0:a5f9535b6e3d 191
mbavare 0:a5f9535b6e3d 192 drawQueen(3,7,WHITE);
mbavare 0:a5f9535b6e3d 193 board[3][7]=queen;
mbavare 0:a5f9535b6e3d 194
mbavare 0:a5f9535b6e3d 195 drawKing(4,0,BLACK);
mbavare 0:a5f9535b6e3d 196 board[4][0]=-king;
mbavare 0:a5f9535b6e3d 197
mbavare 0:a5f9535b6e3d 198 drawKing(4,7,WHITE);
mbavare 0:a5f9535b6e3d 199 board[4][7]=king;
mbavare 0:a5f9535b6e3d 200 }
mbavare 1:af3a896cd76d 201 //globals for castling - keep track of if the pieces have moved
mbavare 1:af3a896cd76d 202 //false indicates they have not moved, mark true on a monement
mbavare 1:af3a896cd76d 203 bool king1 = false;
mbavare 1:af3a896cd76d 204 bool king2 = false;
mbavare 1:af3a896cd76d 205 bool rook11 = false;
mbavare 1:af3a896cd76d 206 bool rook12 = false;
mbavare 1:af3a896cd76d 207 bool rook21 = false;
mbavare 1:af3a896cd76d 208 bool rook22 = false;
mbavare 1:af3a896cd76d 209 bool castling = false; //set this flag high in validMove so we know in movePiece
mbavare 1:af3a896cd76d 210
mbavare 1:af3a896cd76d 211 //movePiece takes in a piece coordinate and moves it to a new spot
mbavare 0:a5f9535b6e3d 212 void movePiece(int ox, int oy, int dx, int dy, int player) {
mbavare 0:a5f9535b6e3d 213
mbavare 1:af3a896cd76d 214 //first clear the piece in the destination if a piece is being captured
mbavare 0:a5f9535b6e3d 215 if(board[dx][dy] !=0) {
mbavare 0:a5f9535b6e3d 216 if( (dx+dy)%2==0) { //moving to a white square
mbavare 0:a5f9535b6e3d 217 uLCD.filled_rectangle(dx*16,dy*16,(dx*16)+16,(dy*16)+16, 0xbcb6b8);
mbavare 0:a5f9535b6e3d 218
mbavare 0:a5f9535b6e3d 219 }
mbavare 1:af3a896cd76d 220 else { //moving to a dark square
mbavare 0:a5f9535b6e3d 221 uLCD.filled_rectangle(dx*16,dy*16,(dx*16)+16,(dy*16)+16, 0x645659);
mbavare 0:a5f9535b6e3d 222 }
mbavare 0:a5f9535b6e3d 223 }
mbavare 0:a5f9535b6e3d 224
mbavare 0:a5f9535b6e3d 225 //blank out the old square
mbavare 0:a5f9535b6e3d 226 if( (ox+oy)%2==0) { //moving from a white square
mbavare 0:a5f9535b6e3d 227 uLCD.filled_rectangle(ox*16,oy*16,(ox*16)+16,(oy*16)+16, 0xbcb6b8);
mbavare 0:a5f9535b6e3d 228
mbavare 0:a5f9535b6e3d 229 }
mbavare 1:af3a896cd76d 230 else { //moving from a dark square
mbavare 0:a5f9535b6e3d 231 uLCD.filled_rectangle(ox*16,oy*16,(ox*16)+16,(oy*16)+16, 0x645659);
mbavare 0:a5f9535b6e3d 232 }
mbavare 0:a5f9535b6e3d 233
mbavare 1:af3a896cd76d 234 //draw the piece in the new square
mbavare 1:af3a896cd76d 235 switch (abs(board[ox][oy])) { //switch based on the piece type
mbavare 0:a5f9535b6e3d 236 case pawn:
mbavare 1:af3a896cd76d 237 //if a pawn reaches the end of the line then promote it to a queen
mbavare 1:af3a896cd76d 238 if(current_player == 1 && dy == 0) { //white pawn reaches end of file
mbavare 1:af3a896cd76d 239 board[ox][oy] = queen;
mbavare 1:af3a896cd76d 240 drawQueen(dx,dy,player);
mbavare 1:af3a896cd76d 241 }
mbavare 1:af3a896cd76d 242
mbavare 1:af3a896cd76d 243 else if(current_player == 2 && dy == 7) { //black pawn reaches end of file
mbavare 1:af3a896cd76d 244 board[ox][oy] = -queen;
mbavare 1:af3a896cd76d 245 drawQueen(dx,dy,player);
mbavare 1:af3a896cd76d 246 }
mbavare 1:af3a896cd76d 247 else
mbavare 1:af3a896cd76d 248 drawPawn(dx,dy,player);
mbavare 0:a5f9535b6e3d 249 break;
mbavare 0:a5f9535b6e3d 250 case rook:
mbavare 0:a5f9535b6e3d 251 drawRook(dx,dy,player);
mbavare 1:af3a896cd76d 252 //this marks if rooks have moved or not (can only castle if false)
mbavare 1:af3a896cd76d 253 if(oy == 0) {
mbavare 1:af3a896cd76d 254 if(ox == 0) //black left rook
mbavare 1:af3a896cd76d 255 rook21 = true;
mbavare 1:af3a896cd76d 256 else if(ox==7) //black right rook
mbavare 1:af3a896cd76d 257 rook22 = true;
mbavare 1:af3a896cd76d 258 }
mbavare 1:af3a896cd76d 259 else if(oy == 7) {
mbavare 1:af3a896cd76d 260 if(ox == 0) //white rook 1
mbavare 1:af3a896cd76d 261 rook11 = true;
mbavare 1:af3a896cd76d 262 else if(ox==7) //white rook 2
mbavare 1:af3a896cd76d 263 rook12 = true;
mbavare 1:af3a896cd76d 264 }
mbavare 0:a5f9535b6e3d 265 break;
mbavare 0:a5f9535b6e3d 266
mbavare 0:a5f9535b6e3d 267 case knight:
mbavare 0:a5f9535b6e3d 268 drawKnight(dx,dy,player);
mbavare 0:a5f9535b6e3d 269 break;
mbavare 0:a5f9535b6e3d 270
mbavare 0:a5f9535b6e3d 271 case bishop:
mbavare 0:a5f9535b6e3d 272 drawBishop(dx,dy,player);
mbavare 0:a5f9535b6e3d 273 break;
mbavare 0:a5f9535b6e3d 274
mbavare 0:a5f9535b6e3d 275 case queen:
mbavare 0:a5f9535b6e3d 276 drawQueen(dx,dy,player);
mbavare 0:a5f9535b6e3d 277 break;
mbavare 0:a5f9535b6e3d 278
mbavare 1:af3a896cd76d 279 case king: //for king we also need to mark the king as moved
mbavare 1:af3a896cd76d 280 if(current_player == 1)
mbavare 1:af3a896cd76d 281 king1 = true;
mbavare 1:af3a896cd76d 282 else
mbavare 1:af3a896cd76d 283 king2 = true;
mbavare 0:a5f9535b6e3d 284 drawKing(dx,dy,player);
mbavare 0:a5f9535b6e3d 285 break;
mbavare 0:a5f9535b6e3d 286 }
mbavare 1:af3a896cd76d 287
mbavare 1:af3a896cd76d 288 //play two notes for a piece capture or one for a regular move
mbavare 0:a5f9535b6e3d 289 if(board[dx][dy] !=0)
mbavare 0:a5f9535b6e3d 290 {
mbavare 0:a5f9535b6e3d 291 mySpeaker.PlayNote(500.0,0.1,0.05);
mbavare 0:a5f9535b6e3d 292 mySpeaker.PlayNote(700.0,0.1,0.05);
mbavare 0:a5f9535b6e3d 293 }
mbavare 0:a5f9535b6e3d 294 else
mbavare 0:a5f9535b6e3d 295 mySpeaker.PlayNote(600.0,0.1,0.05);
mbavare 0:a5f9535b6e3d 296
mbavare 1:af3a896cd76d 297 //if the king is captured then mark then mark the correct player as winning
mbavare 0:a5f9535b6e3d 298 if(board[dx][dy] == 6)
mbavare 0:a5f9535b6e3d 299 winner = 2;
mbavare 0:a5f9535b6e3d 300 else if(board[dx][dy] == -6)
mbavare 0:a5f9535b6e3d 301 winner=1;
mbavare 1:af3a896cd76d 302
mbavare 1:af3a896cd76d 303 //adjust the board array for the piece movement
mbavare 0:a5f9535b6e3d 304 board[dx][dy] = board[ox][oy];
mbavare 0:a5f9535b6e3d 305 board[ox][oy] = 0;
mbavare 1:af3a896cd76d 306
mbavare 1:af3a896cd76d 307 //if we're castling we also need to move the rook
mbavare 1:af3a896cd76d 308 //first mark castling false then make a recursive call to the movePiece function to move the rook
mbavare 1:af3a896cd76d 309 if(castling) {
mbavare 1:af3a896cd76d 310 castling = false;
mbavare 1:af3a896cd76d 311 if(dx<ox) { //castling left
mbavare 1:af3a896cd76d 312 movePiece(0,oy,3,oy, player);
mbavare 1:af3a896cd76d 313 }
mbavare 1:af3a896cd76d 314 else { //castling right
mbavare 1:af3a896cd76d 315 movePiece(7,oy,5,oy, player);
mbavare 1:af3a896cd76d 316 }
mbavare 1:af3a896cd76d 317 }
mbavare 0:a5f9535b6e3d 318 }
mbavare 0:a5f9535b6e3d 319
mbavare 1:af3a896cd76d 320 //this function takes in the location of a piece and the destination and outputs whether or not it is a valid move
mbavare 1:af3a896cd76d 321 int validMove(int ox, int oy, int dx, int dy)
mbavare 1:af3a896cd76d 322 {
mbavare 0:a5f9535b6e3d 323 int source = board[ox][oy];
mbavare 0:a5f9535b6e3d 324 int target = board[dx][dy];
mbavare 0:a5f9535b6e3d 325 int typePiece = abs(source);
mbavare 1:af3a896cd76d 326 //taking one of your own pieces is not allowed
mbavare 0:a5f9535b6e3d 327 if (board[ox][oy] > 0 && board[dx][dy]>0 || board[ox][oy] < 0 && board[dx][dy]<0)
mbavare 0:a5f9535b6e3d 328 return 0;
mbavare 1:af3a896cd76d 329
mbavare 1:af3a896cd76d 330 //movement rules for pawns
mbavare 1:af3a896cd76d 331 if (typePiece == pawn) {
mbavare 1:af3a896cd76d 332 if(current_player == 2 && dx==ox && dy-oy==1 && target==0) return 1;
mbavare 1:af3a896cd76d 333 if(current_player == 1 && dx==ox && dy-oy==-1 && target==0) return 1;
mbavare 1:af3a896cd76d 334 if(abs(dx-ox)==1 && current_player == 2 && dy-oy==1 && target > 0) return 1;
mbavare 1:af3a896cd76d 335 if(abs(dx-ox)==1 && current_player == 1 && dy-oy==-1 && target < 0) return 1;
mbavare 1:af3a896cd76d 336 if(current_player == 2 && oy==1 && (abs(ox-dx)==0) && abs(oy-dy)==2 && target == 0) return 1;
mbavare 1:af3a896cd76d 337 if(current_player == 1 && oy==6 && (abs(ox-dx)==0) &&(abs(oy-dy)==2) && target == 0) return 1;
mbavare 1:af3a896cd76d 338
mbavare 1:af3a896cd76d 339 //movement rules for rooks
mbavare 1:af3a896cd76d 340 } else if (typePiece == rook) {
mbavare 1:af3a896cd76d 341 if(dx==ox){ // Moving vertically
mbavare 1:af3a896cd76d 342 if(dy>oy){ // Downards
mbavare 1:af3a896cd76d 343 for(size_t row = (unsigned)(oy+1); row < (unsigned)dy; ++row){
mbavare 1:af3a896cd76d 344 if(board[dx][row] != 0) return 0;
mbavare 1:af3a896cd76d 345 }
mbavare 1:af3a896cd76d 346 } else { // Upwards
mbavare 1:af3a896cd76d 347 for(size_t row = (unsigned)dy+1; row < (unsigned)(oy); ++row){
mbavare 1:af3a896cd76d 348 if(board[dx][row] != 0) return 0;
mbavare 1:af3a896cd76d 349 }
mbavare 1:af3a896cd76d 350 }
mbavare 1:af3a896cd76d 351 return 1;
mbavare 0:a5f9535b6e3d 352 }
mbavare 1:af3a896cd76d 353 if(dy==oy){ // Moving horizontally
mbavare 1:af3a896cd76d 354 if(dx>ox){ // Rightwards
mbavare 1:af3a896cd76d 355 for(size_t column = (unsigned)(ox+1); column < (unsigned)dx; ++column){
mbavare 1:af3a896cd76d 356 if(board[column][dy] != 0) return 0;
mbavare 1:af3a896cd76d 357 }
mbavare 1:af3a896cd76d 358 }
mbavare 1:af3a896cd76d 359 if(dx<ox){ // Leftwards
mbavare 1:af3a896cd76d 360 for(size_t column = (unsigned)dx+1; column < (unsigned)(ox); ++column){
mbavare 1:af3a896cd76d 361 if(board[column][dy] != 0) return 0;
mbavare 1:af3a896cd76d 362 }
mbavare 1:af3a896cd76d 363 }
mbavare 1:af3a896cd76d 364 return 1;
mbavare 0:a5f9535b6e3d 365 }
mbavare 0:a5f9535b6e3d 366 return 0;
mbavare 1:af3a896cd76d 367
mbavare 1:af3a896cd76d 368 //movement rules for the knight
mbavare 1:af3a896cd76d 369 } else if (typePiece == knight) {
mbavare 1:af3a896cd76d 370
mbavare 1:af3a896cd76d 371 if((abs(dy-oy)==2 && abs(dx-ox)==1) || (abs(dx-ox)==2 && abs(dy-oy)==1)){
mbavare 1:af3a896cd76d 372 return 1;
mbavare 1:af3a896cd76d 373 }
mbavare 1:af3a896cd76d 374 return 0;
mbavare 1:af3a896cd76d 375
mbavare 1:af3a896cd76d 376 //movement rules for bishops
mbavare 1:af3a896cd76d 377 } else if (typePiece == bishop) {
mbavare 1:af3a896cd76d 378 if (abs(dx-ox) != abs(dy-oy)) //must move diagonally
mbavare 0:a5f9535b6e3d 379 return 0;
mbavare 0:a5f9535b6e3d 380 int ymult = -1;
mbavare 0:a5f9535b6e3d 381 int xmult = -1;
mbavare 0:a5f9535b6e3d 382 if (dx>ox)
mbavare 0:a5f9535b6e3d 383 xmult = 1;
mbavare 0:a5f9535b6e3d 384 if (dy>oy)
mbavare 0:a5f9535b6e3d 385 ymult = 1;
mbavare 1:af3a896cd76d 386 //check all the spots between location and destination on the diagonal for pieces
mbavare 0:a5f9535b6e3d 387 for(int i=1; i < abs(dx-ox); ++i)
mbavare 0:a5f9535b6e3d 388 {
mbavare 0:a5f9535b6e3d 389 if(board[ox + i*xmult][oy+i*ymult] != 0) return 0;
mbavare 0:a5f9535b6e3d 390 }
mbavare 1:af3a896cd76d 391 return 1;
mbavare 1:af3a896cd76d 392
mbavare 1:af3a896cd76d 393 //movement rules for queens
mbavare 1:af3a896cd76d 394 } else if (typePiece ==queen) {
mbavare 1:af3a896cd76d 395 // Queen
mbavare 1:af3a896cd76d 396 if(abs(dx-ox) == abs(dy-oy)) { //diagonal movement
mbavare 1:af3a896cd76d 397 int ymult = -1;
mbavare 1:af3a896cd76d 398 int xmult = -1;
mbavare 1:af3a896cd76d 399 if (dx>ox)
mbavare 1:af3a896cd76d 400 xmult = 1;
mbavare 1:af3a896cd76d 401 if (dy>oy)
mbavare 1:af3a896cd76d 402 ymult = 1;
mbavare 1:af3a896cd76d 403
mbavare 1:af3a896cd76d 404 for(int i=1; i < abs(dx-ox); ++i)
mbavare 1:af3a896cd76d 405 {
mbavare 1:af3a896cd76d 406 if(board[ox + i*xmult][oy+i*ymult] != 0) return 0;
mbavare 1:af3a896cd76d 407 }
mbavare 0:a5f9535b6e3d 408 return 1;
mbavare 1:af3a896cd76d 409 }
mbavare 1:af3a896cd76d 410
mbavare 0:a5f9535b6e3d 411
mbavare 1:af3a896cd76d 412 if(dx==ox){ // Moving vertically
mbavare 1:af3a896cd76d 413 if(dy>oy){ // Downards
mbavare 1:af3a896cd76d 414 for(size_t row = (unsigned)(oy+1); row < (unsigned)dy; ++row){
mbavare 1:af3a896cd76d 415 if(board[dx][row] != 0) return 0;
mbavare 1:af3a896cd76d 416 }
mbavare 1:af3a896cd76d 417 } else { // Upwards
mbavare 1:af3a896cd76d 418 for(size_t row = (unsigned)dy+1; row < (unsigned)(oy); ++row){
mbavare 1:af3a896cd76d 419 if(board[dx][row] != 0) return 0;
mbavare 1:af3a896cd76d 420 }
mbavare 1:af3a896cd76d 421 }
mbavare 1:af3a896cd76d 422 return 1;
mbavare 1:af3a896cd76d 423 }
mbavare 1:af3a896cd76d 424 if(dy==oy){ // Moving horizontally
mbavare 1:af3a896cd76d 425 if(dx>ox){ // Rightwards
mbavare 1:af3a896cd76d 426 for(size_t column = (unsigned)(ox+1); column < (unsigned)dx; ++column){
mbavare 1:af3a896cd76d 427 if(board[column][dy] != 0) return 0;
mbavare 1:af3a896cd76d 428 }
mbavare 1:af3a896cd76d 429 }
mbavare 1:af3a896cd76d 430 if(dx<ox){ // Leftwards
mbavare 1:af3a896cd76d 431 for(size_t column = (unsigned)dx+1; column < (unsigned)(ox); ++column){
mbavare 1:af3a896cd76d 432 if(board[column][dy] != 0) return 0;
mbavare 1:af3a896cd76d 433 }
mbavare 1:af3a896cd76d 434 }
mbavare 1:af3a896cd76d 435 return 1;
mbavare 1:af3a896cd76d 436 }
mbavare 1:af3a896cd76d 437 return 0;
mbavare 1:af3a896cd76d 438
mbavare 1:af3a896cd76d 439 //movement rules for a king
mbavare 1:af3a896cd76d 440 } else if (typePiece ==king) {
mbavare 1:af3a896cd76d 441
mbavare 1:af3a896cd76d 442 //special exception for castling
mbavare 1:af3a896cd76d 443 if(dy == oy && ox-2 == dx && (!king1 && current_player == 1 && !rook11 || !king2 && current_player==2 && !rook21))
mbavare 1:af3a896cd76d 444 {
mbavare 1:af3a896cd76d 445 if(board[ox-1][oy] ==0 && board[ox-2][oy] ==0 && board[ox-3][oy]==0) {
mbavare 1:af3a896cd76d 446 castling = true;
mbavare 1:af3a896cd76d 447 return 1; //king can castle to the left
mbavare 1:af3a896cd76d 448 }
mbavare 1:af3a896cd76d 449 }
mbavare 1:af3a896cd76d 450 else if(dy == oy && ox + 2 == dx && (!king1 && current_player == 1 && !rook12 || !king2 && current_player==2 && !rook22))
mbavare 1:af3a896cd76d 451 {
mbavare 1:af3a896cd76d 452 if(board[ox+1][oy] ==0 && board[ox+2][oy] ==0){
mbavare 1:af3a896cd76d 453 castling = true;
mbavare 1:af3a896cd76d 454 return 1; //king can castle to the right
mbavare 1:af3a896cd76d 455 }
mbavare 1:af3a896cd76d 456 }
mbavare 1:af3a896cd76d 457
mbavare 1:af3a896cd76d 458 if(abs(dy-oy)<=1 && abs(dx-ox)<=1) return 1;
mbavare 1:af3a896cd76d 459 return 0;
mbavare 0:a5f9535b6e3d 460 }
mbavare 0:a5f9535b6e3d 461
mbavare 1:af3a896cd76d 462 return 0;
mbavare 0:a5f9535b6e3d 463 }
mbavare 0:a5f9535b6e3d 464
mbavare 1:af3a896cd76d 465 //naming the pins for the joystick
mbavare 0:a5f9535b6e3d 466 PinDetect up(p26);
mbavare 0:a5f9535b6e3d 467 PinDetect center(p25);
mbavare 0:a5f9535b6e3d 468 PinDetect left(p24);
mbavare 0:a5f9535b6e3d 469 PinDetect down(p23);
mbavare 0:a5f9535b6e3d 470 PinDetect right(p22);
mbavare 0:a5f9535b6e3d 471
mbavare 1:af3a896cd76d 472
mbavare 1:af3a896cd76d 473 //variables for the joystick interrupt functions
mbavare 0:a5f9535b6e3d 474 volatile int x = 4;
mbavare 0:a5f9535b6e3d 475 volatile int y = 6;
mbavare 0:a5f9535b6e3d 476 volatile int x2 = 4;
mbavare 0:a5f9535b6e3d 477 volatile int y2 = 2;
mbavare 0:a5f9535b6e3d 478 volatile bool center_hit = false;
mbavare 1:af3a896cd76d 479
mbavare 1:af3a896cd76d 480 //joystick interrupt functions that control which square is selected
mbavare 0:a5f9535b6e3d 481 void up_hit_callback(void) {
mbavare 0:a5f9535b6e3d 482 --y;
mbavare 0:a5f9535b6e3d 483 if(y<0)
mbavare 0:a5f9535b6e3d 484 y=7;
mbavare 1:af3a896cd76d 485 }
mbavare 0:a5f9535b6e3d 486 void down_hit_callback(void) {
mbavare 0:a5f9535b6e3d 487 y = (y+1)%8;
mbavare 1:af3a896cd76d 488 }
mbavare 0:a5f9535b6e3d 489 void left_hit_callback(void) {
mbavare 0:a5f9535b6e3d 490 --x;
mbavare 0:a5f9535b6e3d 491 if(x<0)
mbavare 0:a5f9535b6e3d 492 x=7;
mbavare 1:af3a896cd76d 493 }
mbavare 0:a5f9535b6e3d 494 void right_hit_callback(void) {
mbavare 0:a5f9535b6e3d 495 x = (x+1)%8;
mbavare 1:af3a896cd76d 496 }
mbavare 0:a5f9535b6e3d 497 void center_hit_callback(void) {
mbavare 0:a5f9535b6e3d 498 center_hit = true;
mbavare 1:af3a896cd76d 499 }
mbavare 0:a5f9535b6e3d 500
mbavare 0:a5f9535b6e3d 501 int main() {
mbavare 1:af3a896cd76d 502
mbavare 1:af3a896cd76d 503 //set up the interrupt functions for the joystick
mbavare 1:af3a896cd76d 504 center.attach_deasserted(&center_hit_callback);
mbavare 1:af3a896cd76d 505 left.attach_deasserted(&left_hit_callback);
mbavare 1:af3a896cd76d 506 right.attach_deasserted(&right_hit_callback);
mbavare 1:af3a896cd76d 507 up.attach_deasserted(&up_hit_callback);
mbavare 1:af3a896cd76d 508 down.attach_deasserted(&down_hit_callback);
mbavare 1:af3a896cd76d 509 center.setSampleFrequency();
mbavare 1:af3a896cd76d 510 left.setSampleFrequency();
mbavare 1:af3a896cd76d 511 right.setSampleFrequency();
mbavare 1:af3a896cd76d 512 down.setSampleFrequency();
mbavare 1:af3a896cd76d 513 up.setSampleFrequency();
mbavare 1:af3a896cd76d 514
mbavare 1:af3a896cd76d 515 //setup the board
mbavare 1:af3a896cd76d 516 display_board();
mbavare 0:a5f9535b6e3d 517
mbavare 1:af3a896cd76d 518 //set the default cursor locations
mbavare 1:af3a896cd76d 519 int oldx = 4;
mbavare 1:af3a896cd76d 520 int oldx2 = 4;
mbavare 1:af3a896cd76d 521 int oldy = 6;
mbavare 1:af3a896cd76d 522 int oldy2 = 1;
mbavare 1:af3a896cd76d 523
mbavare 1:af3a896cd76d 524 //control variables for p1 and p2
mbavare 1:af3a896cd76d 525 int selectedx;
mbavare 1:af3a896cd76d 526 int selectedy;
mbavare 1:af3a896cd76d 527 bool selected=false;
mbavare 1:af3a896cd76d 528 int selectedx2;
mbavare 1:af3a896cd76d 529 int selectedy2;
mbavare 1:af3a896cd76d 530 bool selected2 = false;
mbavare 1:af3a896cd76d 531
mbavare 1:af3a896cd76d 532 //draw the initial cursor
mbavare 1:af3a896cd76d 533 uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, GREEN);
mbavare 0:a5f9535b6e3d 534
mbavare 1:af3a896cd76d 535 //the overall game loop
mbavare 1:af3a896cd76d 536 while(1) {
mbavare 1:af3a896cd76d 537 //the loop for player one
mbavare 1:af3a896cd76d 538 while(current_player==1) {
mbavare 1:af3a896cd76d 539 myLed4 = 0; //this led indicates okayer
mbavare 1:af3a896cd76d 540 myLed1 = selected; //this led indicates whether or not a piece has been selected
mbavare 1:af3a896cd76d 541
mbavare 1:af3a896cd76d 542 //if the selected square has moved
mbavare 1:af3a896cd76d 543 if(x != oldx || y != oldy) {
mbavare 1:af3a896cd76d 544 mySpeaker.PlayNote(969.0,0.05,0.05); //play a noise for cursor movement
mbavare 1:af3a896cd76d 545
mbavare 1:af3a896cd76d 546 //delete the old selector
mbavare 1:af3a896cd76d 547 if(oldx % 2 == oldy %2)
mbavare 1:af3a896cd76d 548 uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0xbcb6b8);
mbavare 1:af3a896cd76d 549 else
mbavare 1:af3a896cd76d 550 uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0x645659);
mbavare 1:af3a896cd76d 551
mbavare 1:af3a896cd76d 552 //draw the new cursor
mbavare 1:af3a896cd76d 553 uLCD.rectangle(x*16,y*16,(x*16)+16,(y*16)+16, GREEN);
mbavare 1:af3a896cd76d 554
mbavare 1:af3a896cd76d 555 //record the old cursor location
mbavare 1:af3a896cd76d 556 oldx = x;
mbavare 1:af3a896cd76d 557 oldy = y;
mbavare 1:af3a896cd76d 558 }
mbavare 1:af3a896cd76d 559
mbavare 1:af3a896cd76d 560 if (center_hit) {
mbavare 1:af3a896cd76d 561 if(board[oldx][oldy] > 0 || selected) {
mbavare 1:af3a896cd76d 562 if(selected) { //if a piece has already been selected
mbavare 0:a5f9535b6e3d 563 //check move, make move and change turn if valid
mbavare 1:af3a896cd76d 564 if(selectedx == oldx && selectedy==oldy) { //deselect piece by clicking on it again
mbavare 1:af3a896cd76d 565 selected = false;
mbavare 1:af3a896cd76d 566 } else {
mbavare 1:af3a896cd76d 567 if (validMove(selectedx, selectedy, oldx, oldy) ==1) { //if the move is valid make the move and swith turns
mbavare 1:af3a896cd76d 568 movePiece(selectedx, selectedy, oldx, oldy, WHITE);
mbavare 0:a5f9535b6e3d 569 selected = false;
mbavare 1:af3a896cd76d 570 current_player = 2;
mbavare 1:af3a896cd76d 571
mbavare 1:af3a896cd76d 572 //erase the player one selector
mbavare 1:af3a896cd76d 573 if(oldx % 2 == oldy %2)
mbavare 1:af3a896cd76d 574 uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0xbcb6b8);
mbavare 1:af3a896cd76d 575 else
mbavare 1:af3a896cd76d 576 uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0x645659);
mbavare 1:af3a896cd76d 577
mbavare 1:af3a896cd76d 578 //draw the player two selector
mbavare 1:af3a896cd76d 579 uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, BLUE);
mbavare 0:a5f9535b6e3d 580 }
mbavare 0:a5f9535b6e3d 581 }
mbavare 1:af3a896cd76d 582 } else { //if no piece is selected select the piece being clicked on
mbavare 1:af3a896cd76d 583 selected = true;
mbavare 1:af3a896cd76d 584 selectedx = oldx;
mbavare 1:af3a896cd76d 585 selectedy = oldy;
mbavare 1:af3a896cd76d 586 }
mbavare 1:af3a896cd76d 587
mbavare 0:a5f9535b6e3d 588 }
mbavare 1:af3a896cd76d 589 center_hit =false; //set the center hit flag to false
mbavare 1:af3a896cd76d 590 }
mbavare 0:a5f9535b6e3d 591
mbavare 1:af3a896cd76d 592 }
mbavare 1:af3a896cd76d 593 //the loop for player two
mbavare 0:a5f9535b6e3d 594 while(current_player==2 && winner!=1)
mbavare 0:a5f9535b6e3d 595 {
mbavare 1:af3a896cd76d 596 myLed4 = 1; //this indicates that it is player twos turn
mbavare 1:af3a896cd76d 597 myLed1 = selected2; //shows whether or not a piece is selected
mbavare 1:af3a896cd76d 598 //variables for the bluetooth
mbavare 0:a5f9535b6e3d 599 char bnum=0;
mbavare 0:a5f9535b6e3d 600 char bhit=0;
mbavare 0:a5f9535b6e3d 601
mbavare 0:a5f9535b6e3d 602 bool one_hit = false;
mbavare 1:af3a896cd76d 603
mbavare 1:af3a896cd76d 604 //this reads input from the bluetooth and adjusts the location of the cursor or registers a selection
mbavare 0:a5f9535b6e3d 605 if (blue.getc()=='!') {
mbavare 0:a5f9535b6e3d 606 if (blue.getc()=='B') { //button data packet
mbavare 0:a5f9535b6e3d 607 bnum = blue.getc(); //button number
mbavare 0:a5f9535b6e3d 608 bhit = blue.getc(); //1=hit, 0=release
mbavare 0:a5f9535b6e3d 609 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
mbavare 0:a5f9535b6e3d 610 switch (bnum) {
mbavare 0:a5f9535b6e3d 611 case '1': //number button 1
mbavare 1:af3a896cd76d 612 if (bhit=='1') {
mbavare 1:af3a896cd76d 613 one_hit = true;
mbavare 1:af3a896cd76d 614 }
mbavare 0:a5f9535b6e3d 615 break;
mbavare 0:a5f9535b6e3d 616 case '5': //button 5 up arrow
mbavare 1:af3a896cd76d 617 if (bhit=='1') {
mbavare 0:a5f9535b6e3d 618 //y2 = (y2-1)%8;
mbavare 1:af3a896cd76d 619 --y2;
mbavare 1:af3a896cd76d 620 if(y2<0)
mbavare 1:af3a896cd76d 621 y2=7;
mbavare 1:af3a896cd76d 622 }
mbavare 0:a5f9535b6e3d 623 break;
mbavare 0:a5f9535b6e3d 624 case '6': //button 6 down arrow
mbavare 1:af3a896cd76d 625 if (bhit=='1') {
mbavare 1:af3a896cd76d 626 y2 = (y2+1)%8;
mbavare 1:af3a896cd76d 627 }
mbavare 0:a5f9535b6e3d 628 break;
mbavare 0:a5f9535b6e3d 629 case '7': //button 7 left arrow
mbavare 1:af3a896cd76d 630 if (bhit=='1') {
mbavare 0:a5f9535b6e3d 631 //x2 = (x2-1)%8;
mbavare 1:af3a896cd76d 632 --x2;
mbavare 1:af3a896cd76d 633 if(x2<0)
mbavare 1:af3a896cd76d 634 x2=7;
mbavare 1:af3a896cd76d 635 }
mbavare 0:a5f9535b6e3d 636 break;
mbavare 0:a5f9535b6e3d 637 case '8': //button 8 right arrow
mbavare 1:af3a896cd76d 638 if (bhit=='1') {
mbavare 1:af3a896cd76d 639 x2 = (x2+1)%8;
mbavare 1:af3a896cd76d 640 }
mbavare 0:a5f9535b6e3d 641 break;
mbavare 0:a5f9535b6e3d 642
mbavare 0:a5f9535b6e3d 643 }
mbavare 0:a5f9535b6e3d 644
mbavare 1:af3a896cd76d 645 //sames as in player 1, play a sound and move the selection box if necessary
mbavare 1:af3a896cd76d 646 if(x2 != oldx2 || y2 != oldy2)
mbavare 1:af3a896cd76d 647 {
mbavare 1:af3a896cd76d 648 mySpeaker.PlayNote(800.0,0.05,0.05);
mbavare 1:af3a896cd76d 649 if(oldx % 2 == oldy2 %2)
mbavare 1:af3a896cd76d 650 uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0xbcb6b8);
mbavare 1:af3a896cd76d 651 else
mbavare 1:af3a896cd76d 652 uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0x645659);
mbavare 1:af3a896cd76d 653
mbavare 1:af3a896cd76d 654 uLCD.rectangle(x2*16,y2*16,(x2*16)+16,(y2*16)+16, BLUE);
mbavare 1:af3a896cd76d 655 oldx2 = x2;
mbavare 1:af3a896cd76d 656 oldy2 = y2;
mbavare 0:a5f9535b6e3d 657 }
mbavare 1:af3a896cd76d 658
mbavare 1:af3a896cd76d 659 //if the selection button was pressed select/ deselect the piece or attempt to make a move
mbavare 1:af3a896cd76d 660 if (one_hit) {
mbavare 1:af3a896cd76d 661 if(board[oldx2][oldy2] < 0 || selected2) {
mbavare 1:af3a896cd76d 662 if(selected2) {
mbavare 1:af3a896cd76d 663 //check move, make move and change turn if valid
mbavare 1:af3a896cd76d 664 if(selectedx2 == oldx2 && selectedy2 == oldy2) {
mbavare 1:af3a896cd76d 665 selected2 = false;
mbavare 1:af3a896cd76d 666 }
mbavare 1:af3a896cd76d 667 else {
mbavare 1:af3a896cd76d 668 if(validMove(selectedx2, selectedy2, oldx2, oldy2)) {
mbavare 1:af3a896cd76d 669 movePiece(selectedx2, selectedy2, oldx2, oldy2, BLACK);
mbavare 1:af3a896cd76d 670 selected2 = false;
mbavare 1:af3a896cd76d 671 current_player = 1;
mbavare 1:af3a896cd76d 672 if(oldx % 2 == oldy2 %2)
mbavare 1:af3a896cd76d 673 uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0xbcb6b8);
mbavare 1:af3a896cd76d 674 else
mbavare 1:af3a896cd76d 675 uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0x645659);
mbavare 1:af3a896cd76d 676 uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, GREEN);
mbavare 1:af3a896cd76d 677 }
mbavare 1:af3a896cd76d 678 }
mbavare 1:af3a896cd76d 679 }
mbavare 1:af3a896cd76d 680 else
mbavare 1:af3a896cd76d 681 {
mbavare 1:af3a896cd76d 682 selected2 = true;
mbavare 1:af3a896cd76d 683 selectedx2 = oldx2;
mbavare 1:af3a896cd76d 684 selectedy2 = oldy2;
mbavare 1:af3a896cd76d 685 }
mbavare 1:af3a896cd76d 686 one_hit =false;
mbavare 1:af3a896cd76d 687 }
mbavare 1:af3a896cd76d 688 }
mbavare 0:a5f9535b6e3d 689 }
mbavare 1:af3a896cd76d 690 }
mbavare 0:a5f9535b6e3d 691 }
mbavare 0:a5f9535b6e3d 692 }
mbavare 1:af3a896cd76d 693 //if someone won the game then display the winner and play the video
mbavare 1:af3a896cd76d 694 if(winner) {
mbavare 1:af3a896cd76d 695 uLCD.cls();
mbavare 1:af3a896cd76d 696 uLCD.printf("Player %i wins", winner);
mbavare 1:af3a896cd76d 697 wait(1);
mbavare 1:af3a896cd76d 698 while(1) {
mbavare 0:a5f9535b6e3d 699
mbavare 1:af3a896cd76d 700 uLCD.media_init();
mbavare 1:af3a896cd76d 701 uLCD.set_sector_address(0x0000, 0x00);
mbavare 1:af3a896cd76d 702 uLCD.display_video(0,0);
mbavare 1:af3a896cd76d 703 }
mbavare 1:af3a896cd76d 704 }
mbavare 1:af3a896cd76d 705 }
mbavare 0:a5f9535b6e3d 706 }
mbavare 1:af3a896cd76d 707