Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed
main.cpp@1:af3a896cd76d, 2016-03-14 (annotated)
- Committer:
- mbavare
- Date:
- Mon Mar 14 16:37:51 2016 +0000
- Revision:
- 1:af3a896cd76d
- Parent:
- 0:a5f9535b6e3d
...
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 | 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(¢er_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 |