Chess game on the mbed.

Dependencies:   4DGL-uLCD-SE PinDetect SDFileSystem mbed

Revision:
1:af3a896cd76d
Parent:
0:a5f9535b6e3d
--- a/main.cpp	Mon Mar 14 02:45:47 2016 +0000
+++ b/main.cpp	Mon Mar 14 16:37:51 2016 +0000
@@ -5,24 +5,18 @@
 #include "PinDetect.h"
 #include "Speaker.h"
 
-
 uLCD_4DGL uLCD(p28,p27,p29); // serial tx, serial rx, reset pin;
 
-//need bluetooth https://developer.mbed.org/users/4180_1/notebook/adafruit-bluefruit-le-uart-friend---bluetooth-low-/
+//bluetooth for the player two controller
 Serial blue(p13,p14); //serial tx, rx
 
-
-//joystick - declare pins and then have interrupt functions for each one
-
-//speaker - declare pins, may want to use it as pwm out instead of wav? 
+//Using the speaker as a pwm out
 Speaker mySpeaker(p21);
 
-//sd card - to hold the video file
-//SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card setup
+//set up the chess board as an int array
+int board[8][8]={0};
 
-int board[8][8]={0};
-int current_player = 1;
-//pieces
+//Set the pieces so we can refer to them by name
 const int pawn=1;
 const int rook=2;
 const int knight=3;
@@ -30,9 +24,11 @@
 const int queen=5;
 const int king=6;
 
+//global variables to keep track of the current player and the winner
 int winner = 0;
+int current_player = 1;
 
-
+//class declaration for the navswitch
 class Nav_Switch
 {
 public:
@@ -52,10 +48,10 @@
     };
 private:
     BusIn _pins;
- 
+
 };
 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
-    _pins(up, down, left, right, fire)
+_pins(up, down, left, right, fire)
 {
     _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
     wait(0.001); //delays just a bit for pullups to pull inputs high
@@ -88,15 +84,16 @@
 {
     return _pins.read();
 }
- 
+
 Nav_Switch p1( p9, p6, p7, p5, p8); //pin order on Sparkfun breakout
+
+//set the MBED leds up to signal information
 DigitalOut myLed1(LED1);
 DigitalOut myLed2(LED2);
 DigitalOut myLed3(LED3);
 DigitalOut myLed4(LED4);
 
-//I guess these need a color arguement too
-
+//functions for drawing the different chess pieces using uLCD member functions
 void drawPawn(int x, int y, int Color) {
     uLCD.filled_circle(x*16+8,y*16+5,2,Color);
     uLCD.triangle(x*16+8,y*16+5,x*16+4,y*16+12,x*16+12,y*16+12,Color);    
@@ -112,12 +109,10 @@
     uLCD.filled_rectangle(x*16+4,y*16+6,x*16+12,y*16+8,Color);    
 }
 void drawKnight(int x, int y, int Color) {
-    //uLCD.filled_rectangle(x+3, y+2, x+8,y+4, RED);
     uLCD.triangle(x*16+8,y*16+2,x*16+4,y*16+4,x*16+8,y*16+4,Color);
     uLCD.filled_rectangle(x*16+7, y*16+2, x*16+9, y*16+10, Color);
     uLCD.filled_rectangle(x*16+4, y*16+10, x*16+12, y*16+ 12, Color);
 }
-
 void drawRook(int x, int y, int Color) {
     uLCD.filled_rectangle(x*16+2, y*16+4, x*16+ 14, y*16+6,Color);
     uLCD.filled_rectangle(x*16+5, y*16+6, x*16+11, y*16+12, Color);
@@ -131,27 +126,29 @@
     uLCD.filled_rectangle(x*16+7, y*16+4,x*16+9,y*16+10,Color);
     uLCD.triangle(x*16+5,y*16+4,x*16+11,y*16+4,x*16+8,y*16,Color);    
 }
+
+//display_board sets up the board in the beginning of the game
 void display_board(void)
 {
-    //uLCD.filled_rectangle(0, 0 , 127, 127, 0xefded1) ;
+    //this loop draws the board squares, alternating color 
     bool alternator = true;
     for(int i=0; i<8; i++)//This loop will be executed for each row once
     {
         for(int j=0; j<8; j++) //This loop will be executed 7 times for each row
         {
             if (alternator) {
-                uLCD.filled_rectangle(j*16,i*16,(j*16)+16,(i*16)+16, 0xbcb6b8);
+                uLCD.filled_rectangle(j*16,i*16,(j*16)+16,(i*16)+16, 0xbcb6b8); //draws a light tan (white) square
                 alternator = false;
             } else {
-                uLCD.filled_rectangle(j*16,i*16,(j*16)+16,(i*16)+16, 0x645659);
+                uLCD.filled_rectangle(j*16,i*16,(j*16)+16,(i*16)+16, 0x645659); //draws a dark brown (black) square
                 alternator = true;
             }
         }
         alternator = !alternator;
     }
     
-    //pawns
-    for(int i=0;i<8;i++)
+    //draw the pieces in their initial placement and update the board array
+    for(int i=0;i<8;i++) //set the pawns up in a for loop
     {
         drawPawn(i,1,BLACK);
         board[i][1]= -pawn;
@@ -163,12 +160,12 @@
     drawRook(7,0,BLACK);
     board[0][0]=-rook;
     board[7][0]=-rook;
-    
+
     drawRook(0,7,WHITE);
     drawRook(7,7,WHITE);
     board[0][7]=rook;
     board[7][7]=rook;
-  
+
     drawKnight(1,0,BLACK);
     drawKnight(6,0,BLACK);
     board[1][0]=-knight;
@@ -201,15 +198,26 @@
     drawKing(4,7,WHITE);
     board[4][7]=king;    
 }
-//take in a piece coordinate and move it to the new spot
+//globals for castling - keep track of if the pieces have moved 
+//false indicates they have not moved, mark true on a monement
+bool king1 = false;
+bool king2 = false;
+bool rook11 = false;
+bool rook12 = false;
+bool rook21 = false;
+bool rook22 = false;
+bool castling = false; //set this flag high in validMove so we know in movePiece
+
+//movePiece takes in a piece coordinate and moves it to a new spot
 void movePiece(int ox, int oy, int dx, int dy, int player) {
 
+    //first clear the piece in the destination if a piece is being captured
     if(board[dx][dy] !=0) {
         if( (dx+dy)%2==0) { //moving to a white square
             uLCD.filled_rectangle(dx*16,dy*16,(dx*16)+16,(dy*16)+16, 0xbcb6b8);
 
         }
-        else { //dark square
+        else { //moving to a dark square
             uLCD.filled_rectangle(dx*16,dy*16,(dx*16)+16,(dy*16)+16, 0x645659);
         }
     }
@@ -219,19 +227,41 @@
         uLCD.filled_rectangle(ox*16,oy*16,(ox*16)+16,(oy*16)+16, 0xbcb6b8);
 
     }
-    else { //dark square
+    else { //moving from a dark square
         uLCD.filled_rectangle(ox*16,oy*16,(ox*16)+16,(oy*16)+16, 0x645659);
     }   
     
-    //draw piece in the new square
-    switch (abs(board[ox][oy])) {
+    //draw the piece in the new square
+    switch (abs(board[ox][oy])) {  //switch based on the piece type
         case pawn:
-            drawPawn(dx,dy,player);
+            //if a pawn reaches the end of the line then promote it to a queen
+            if(current_player == 1 && dy == 0) { //white pawn reaches end of file
+                board[ox][oy] = queen;
+                drawQueen(dx,dy,player);
+            }
+            
+            else if(current_player == 2 && dy == 7) { //black pawn reaches end of file
+                board[ox][oy] = -queen;
+                drawQueen(dx,dy,player);
+            }
+            else
+                drawPawn(dx,dy,player);
         break;
-
         case rook:
             drawRook(dx,dy,player);
-       
+            //this marks if rooks have moved or not (can only castle if false)
+            if(oy == 0) {
+                if(ox == 0)  //black left rook
+                    rook21 = true;
+                else if(ox==7) //black right rook
+                    rook22 = true;
+            }
+            else if(oy == 7) {
+                if(ox == 0)  //white rook 1
+                    rook11 = true;
+                else if(ox==7) //white rook 2
+                    rook12 = true; 
+            }
         break;    
         
         case knight:
@@ -246,10 +276,16 @@
             drawQueen(dx,dy,player);
         break; 
         
-        case king:
+        case king:  //for king we also need to mark the king as moved 
+            if(current_player == 1) 
+                king1 = true; 
+            else
+                king2 = true;
             drawKing(dx,dy,player);
         break;         
     }
+
+    //play two notes for a piece capture or one for a regular move
     if(board[dx][dy] !=0)
     {
         mySpeaker.PlayNote(500.0,0.1,0.05);
@@ -258,257 +294,314 @@
     else
         mySpeaker.PlayNote(600.0,0.1,0.05);
 
- 
+    //if the king is captured then mark then mark the correct player as winning
     if(board[dx][dy] == 6)
         winner = 2;
     else if(board[dx][dy] == -6)
         winner=1;
+
+    //adjust the board array for the piece movement
     board[dx][dy] = board[ox][oy];
     board[ox][oy] = 0;
+
+    //if we're castling we also need to move the rook
+    //first mark castling false then make a recursive call to the movePiece function to move the rook
+    if(castling) { 
+        castling = false; 
+        if(dx<ox) { //castling left
+            movePiece(0,oy,3,oy, player); 
+        }   
+        else { //castling right
+            movePiece(7,oy,5,oy, player);
+        }
+    }
 }
 
-
-//should look at what piece is in old spot, redraw the square there and then draw piece in new spot
-int validMove(int ox, int oy, int dx, int dy){
+//this function takes in the location of a piece and the destination and outputs whether or not it is a valid move
+int validMove(int ox, int oy, int dx, int dy)
+{
   int source = board[ox][oy];
   int target = board[dx][dy];
   int typePiece = abs(source);
+  //taking one of your own pieces is not allowed
   if (board[ox][oy] > 0 && board[dx][dy]>0 || board[ox][oy] < 0 && board[dx][dy]<0)
     return 0;
-  if (typePiece == pawn){
-    if(current_player == 2 && dx==ox && dy-oy==1 && target==0) return 1;
-    if(current_player == 1 && dx==ox && dy-oy==-1 && target==0) return 1;
-    if(abs(dx-ox)==1 && current_player == 2 && dy-oy==1 && target > 0) return 1;
-    if(abs(dx-ox)==1 && current_player == 1 && dy-oy==-1 && target < 0) return 1;
-    if(current_player == 2 && oy==1 && (abs(ox-dx)==0) && abs(oy-dy)==2 && target == 0) return 1;
-    if(current_player == 1 && oy==6 && (abs(ox-dx)==0) &&(abs(oy-dy)==2) && target == 0) return 1;
-    
-  } else if (typePiece == rook) {
-    if(dx==ox){ // Moving vertically
-      if(dy>oy){ // Downards
-        for(size_t row = (unsigned)(oy+1); row < (unsigned)dy; ++row){
-          if(board[dx][row] != 0) return 0;
-        }
-      } else { // Upwards
-        for(size_t row = (unsigned)dy+1; row < (unsigned)(oy); ++row){
-          if(board[dx][row] != 0) return 0;
+
+    //movement rules for pawns
+    if (typePiece == pawn) {
+        if(current_player == 2 && dx==ox && dy-oy==1 && target==0) return 1;
+        if(current_player == 1 && dx==ox && dy-oy==-1 && target==0) return 1;
+        if(abs(dx-ox)==1 && current_player == 2 && dy-oy==1 && target > 0) return 1;
+        if(abs(dx-ox)==1 && current_player == 1 && dy-oy==-1 && target < 0) return 1;
+        if(current_player == 2 && oy==1 && (abs(ox-dx)==0) && abs(oy-dy)==2 && target == 0) return 1;
+        if(current_player == 1 && oy==6 && (abs(ox-dx)==0) &&(abs(oy-dy)==2) && target == 0) return 1;
+ 
+    //movement rules for rooks    
+    } else if (typePiece == rook) {
+        if(dx==ox){ // Moving vertically
+            if(dy>oy){ // Downards
+                for(size_t row = (unsigned)(oy+1); row < (unsigned)dy; ++row){
+                    if(board[dx][row] != 0) return 0;
+                }
+            } else { // Upwards
+                for(size_t row = (unsigned)dy+1; row < (unsigned)(oy); ++row){
+                if(board[dx][row] != 0) return 0;
+                } 
+            } 
+            return 1;
         }
-      }
-      return 1;
-    }
-    if(dy==oy){ // Moving horizontally
-      if(dx>ox){ // Rightwards
-        for(size_t column = (unsigned)(ox+1); column < (unsigned)dx; ++column){
-          if(board[column][dy] != 0) return 0;
-        }
-      }
-      if(dx<ox){ // Leftwards
-        for(size_t column = (unsigned)dx+1; column < (unsigned)(ox); ++column){
-          if(board[column][dy] != 0) return 0;
-        }
-      }
-      return 1;
-    }
-    return 0;
-    } else if (typePiece == knight) {
- 
-        if((abs(dy-oy)==2 && abs(dx-ox)==1) || (abs(dx-ox)==2 && abs(dy-oy)==1)){
-          return 1;
+        if(dy==oy){ // Moving horizontally
+            if(dx>ox){ // Rightwards
+                for(size_t column = (unsigned)(ox+1); column < (unsigned)dx; ++column){
+                    if(board[column][dy] != 0) return 0;
+                }
+            }
+            if(dx<ox){ // Leftwards
+                for(size_t column = (unsigned)dx+1; column < (unsigned)(ox); ++column){
+                    if(board[column][dy] != 0) return 0;
+                }
+            }
+            return 1;
         }
         return 0;
-    } else if (typePiece ==bishop) {
-    // Bishop
-        if (abs(dx-ox) != abs(dy-oy))
+
+    //movement rules for the knight
+    } else if (typePiece == knight) {
+
+        if((abs(dy-oy)==2 && abs(dx-ox)==1) || (abs(dx-ox)==2 && abs(dy-oy)==1)){
+            return 1;
+        }
+        return 0;
+
+    //movement rules for bishops    
+    } else if (typePiece == bishop) {
+        if (abs(dx-ox) != abs(dy-oy)) //must move diagonally
             return 0;
-    
-        int ymult = -1;
-        int xmult = -1;
-        if (dx>ox)
-            xmult = 1;
-        if (dy>oy)
-            ymult = 1;
-   
-        for(int i=1; i < abs(dx-ox); ++i)
-        {
-            if(board[ox + i*xmult][oy+i*ymult] != 0) return 0;
-        }
-        return 1;
-
-    } else if (typePiece ==queen) {
- 
-    // Queen
-    if(abs(dx-ox) == abs(dy-oy)) {
         int ymult = -1;
         int xmult = -1;
         if (dx>ox)
             xmult = 1;
         if (dy>oy)
             ymult = 1;
-   
+        //check all the spots between location and destination on the diagonal for pieces
         for(int i=1; i < abs(dx-ox); ++i)
         {
             if(board[ox + i*xmult][oy+i*ymult] != 0) return 0;
         }
+        return 1;
+
+    //movement rules for queens
+    } else if (typePiece ==queen) {
+        // Queen
+        if(abs(dx-ox) == abs(dy-oy)) { //diagonal movement
+            int ymult = -1;
+            int xmult = -1;
+            if (dx>ox)
+                xmult = 1;
+            if (dy>oy)
+                ymult = 1;
+
+            for(int i=1; i < abs(dx-ox); ++i)
+            {
+                if(board[ox + i*xmult][oy+i*ymult] != 0) return 0;
+            }
         return 1;             
+        }
+
         
+        if(dx==ox){ // Moving vertically
+            if(dy>oy){ // Downards
+                for(size_t row = (unsigned)(oy+1); row < (unsigned)dy; ++row){
+                    if(board[dx][row] != 0) return 0;
+                }
+            } else { // Upwards
+                for(size_t row = (unsigned)dy+1; row < (unsigned)(oy); ++row){
+                    if(board[dx][row] != 0) return 0;
+                }
+            }
+            return 1;
+        }
+        if(dy==oy){ // Moving horizontally
+            if(dx>ox){ // Rightwards
+                for(size_t column = (unsigned)(ox+1); column < (unsigned)dx; ++column){
+                    if(board[column][dy] != 0) return 0;
+                }
+            }
+            if(dx<ox){ // Leftwards
+                for(size_t column = (unsigned)dx+1; column < (unsigned)(ox); ++column){
+                    if(board[column][dy] != 0) return 0;
+                }
+            }
+            return 1;
+        }
+        return 0;
+
+    //movement rules for a king
+    } else if (typePiece ==king) {
+
+        //special exception for castling
+        if(dy == oy && ox-2 == dx && (!king1 && current_player == 1 && !rook11 || !king2 && current_player==2 && !rook21))
+        {
+            if(board[ox-1][oy] ==0 && board[ox-2][oy] ==0 && board[ox-3][oy]==0) {
+                castling = true;
+                return 1; //king can castle to the left
+            }
+        }
+        else if(dy == oy && ox + 2 == dx && (!king1 && current_player == 1 && !rook12 || !king2 && current_player==2 && !rook22))
+        {
+            if(board[ox+1][oy] ==0 && board[ox+2][oy] ==0){
+                castling = true;
+                return 1; //king can castle to the right
+            }
+        }
+
+        if(abs(dy-oy)<=1 && abs(dx-ox)<=1) return 1;
+        return 0;
     }
 
-    if(dx==ox){ // Moving vertically
-      if(dy>oy){ // Downards
-        for(size_t row = (unsigned)(oy+1); row < (unsigned)dy; ++row){
-          if(board[dx][row] != 0) return 0;
-        }
-      } else { // Upwards
-        for(size_t row = (unsigned)dy+1; row < (unsigned)(oy); ++row){
-          if(board[dx][row] != 0) return 0;
-        }
-      }
-      return 1;
-    }
-    if(dy==oy){ // Moving horizontally
-      if(dx>ox){ // Rightwards
-        for(size_t column = (unsigned)(ox+1); column < (unsigned)dx; ++column){
-          if(board[column][dy] != 0) return 0;
-        }
-      }
-      if(dx<ox){ // Leftwards
-        for(size_t column = (unsigned)dx+1; column < (unsigned)(ox); ++column){
-          if(board[column][dy] != 0) return 0;
-        }
-      }
-      return 1;
-    }
-    return 0;
-    
-    } else if (typePiece ==king) {
-    if(abs(dy-oy)<=1 && abs(dx-ox)<=1) return 1;
-    return 0;
-    }
-  
-  return 0;
+    return 0; 
 }
- 
 
+//naming the pins for the joystick
 PinDetect up(p26);
 PinDetect center(p25);
 PinDetect left(p24);
 PinDetect down(p23);
 PinDetect right(p22);
 
+
+//variables for the joystick interrupt functions
 volatile int x = 4;
 volatile int y = 6;
 volatile int x2 = 4;
 volatile int y2 = 2;
 volatile bool center_hit = false;
+
+//joystick interrupt functions that control which square is selected
 void up_hit_callback(void) {
     --y;
     if(y<0)
         y=7;
-    }  
+}  
 void down_hit_callback(void) {
     y = (y+1)%8;
-    }
+}
 void left_hit_callback(void) {
     --x;
     if(x<0)
         x=7;
-    }
+}
 void right_hit_callback(void) {
     x = (x+1)%8;
-    }
+}
 void center_hit_callback(void) {
     center_hit = true;
-    }
-
-
+}
 
 int main() {
-       
-       center.attach_deasserted(&center_hit_callback);
-       left.attach_deasserted(&left_hit_callback);
-       right.attach_deasserted(&right_hit_callback);
-       up.attach_deasserted(&up_hit_callback);
-       down.attach_deasserted(&down_hit_callback);
-    
-       center.setSampleFrequency();
-       left.setSampleFrequency();
-       right.setSampleFrequency();
-       down.setSampleFrequency();
-       up.setSampleFrequency();
+
+    //set up the interrupt functions for the joystick
+    center.attach_deasserted(&center_hit_callback);
+    left.attach_deasserted(&left_hit_callback);
+    right.attach_deasserted(&right_hit_callback);
+    up.attach_deasserted(&up_hit_callback);
+    down.attach_deasserted(&down_hit_callback);
+    center.setSampleFrequency();
+    left.setSampleFrequency();
+    right.setSampleFrequency();
+    down.setSampleFrequency();
+    up.setSampleFrequency();
+
+    //setup the board
+    display_board();
 
-       
-       display_board();
-       int oldx = 4;
-       int oldx2 = 4;
-       int oldy = 6;
-       int oldy2 = 1;
-       int selectedx;
-       int selectedy;
-       bool selected=false;
-       int selectedx2;
-       int selectedy2;
-       bool selected2 = false;
-       uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, GREEN);
+    //set the default cursor locations
+    int oldx = 4;
+    int oldx2 = 4;
+    int oldy = 6;
+    int oldy2 = 1;
+
+    //control variables for p1 and p2
+    int selectedx;
+    int selectedy;
+    bool selected=false;
+    int selectedx2;
+    int selectedy2;
+    bool selected2 = false;
+
+    //draw the initial cursor
+    uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, GREEN);
     
-        while(1) {
-            while(current_player==1) {
-                //put a border around selected square
-                myLed4 = 0;
-                myLed1 = selected; 
-                if(x != oldx || y != oldy) {
-                    mySpeaker.PlayNote(969.0,0.05,0.05);
-                    if(oldx % 2 == oldy %2)
-                        uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0xbcb6b8); 
-                    else
-                        uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0x645659); 
-                    
-                    uLCD.rectangle(x*16,y*16,(x*16)+16,(y*16)+16, GREEN);
-                    oldx = x;
-                    oldy = y;  
-                }
-                    
-                if (center_hit) {
-                    if(board[oldx][oldy] > 0 || selected)
-                    {
-                       if(selected) {
+    //the overall game loop
+    while(1) {
+        //the loop for player one
+        while(current_player==1) {
+            myLed4 = 0; //this led indicates okayer
+            myLed1 = selected; //this led indicates whether or not a piece has been selected
+            
+            //if the selected square has moved
+            if(x != oldx || y != oldy) {
+                mySpeaker.PlayNote(969.0,0.05,0.05); //play a noise for cursor movement
+
+                //delete the old selector
+                if(oldx % 2 == oldy %2)
+                    uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0xbcb6b8); 
+                else
+                    uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0x645659); 
+
+                //draw the new cursor
+                uLCD.rectangle(x*16,y*16,(x*16)+16,(y*16)+16, GREEN);
+                
+                //record the old cursor location
+                oldx = x;
+                oldy = y;  
+            }
+
+            if (center_hit) {
+                if(board[oldx][oldy] > 0 || selected) {
+                    if(selected) { //if a piece has already been selected
                         //check move, make move and change turn if valid
-                            if(selectedx == oldx && selectedy==oldy) { //deselect piece by clicking on it again
+                        if(selectedx == oldx && selectedy==oldy) { //deselect piece by clicking on it again
+                            selected = false;
+                        } else { 
+                            if (validMove(selectedx, selectedy, oldx, oldy) ==1) { //if the move is valid make the move and swith turns
+                                movePiece(selectedx, selectedy, oldx, oldy, WHITE); 
                                 selected = false;
-                            }
-                            else {
-                                if(validMove(selectedx, selectedy, oldx, oldy) ==1) {
-                                    movePiece(selectedx, selectedy, oldx, oldy, WHITE); 
-                                    selected = false;
-                                    current_player = 2;
-                                    if(oldx % 2 == oldy %2)
-                                        uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0xbcb6b8); 
-                                    else
-                                        uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0x645659); 
-                                    
-                                    uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, BLUE);
-                                }
+                                current_player = 2;
+                                
+                                //erase the player one selector
+                                if(oldx % 2 == oldy %2)
+                                    uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0xbcb6b8); 
+                                else
+                                    uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, 0x645659); 
+                                 
+                                //draw the player two selector    
+                                uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, BLUE);
                             }
                         }
-                        else
-                        {
-                            selected = true;
-                            selectedx =  oldx;
-                            selectedy = oldy;
-                        }
-                           
-                    }    
-                    center_hit =false;
+                    } else { //if no piece is selected select the piece being clicked on
+                        selected = true;
+                        selectedx =  oldx;
+                        selectedy = oldy;
+                    }
+
                 }    
+                center_hit =false; //set the center hit flag to false
+            }    
                 
-            }
+        }
+            //the loop for player two
             while(current_player==2 && winner!=1)
             {
-                myLed4 = 1; 
+                myLed4 = 1; //this indicates that it is player twos turn
+                myLed1 = selected2;  //shows whether or not a piece is selected
+                //variables for the bluetooth 
                 char bnum=0;
                 char bhit=0;
-                myLed1 = selected2; 
 
                 bool one_hit = false; 
+
+                //this reads input from the bluetooth and adjusts the location of the cursor or registers a selection
                 if (blue.getc()=='!') {
                     if (blue.getc()=='B') { //button data packet
                         bnum = blue.getc(); //button number
@@ -516,103 +609,99 @@
                         if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
                             switch (bnum) {
                                 case '1': //number button 1
-                                    if (bhit=='1') {
-                                        one_hit = true; 
-                                    } 
+                                if (bhit=='1') {
+                                    one_hit = true; 
+                                } 
                                 break;
                                 case '5': //button 5 up arrow
-                                    if (bhit=='1') {
+                                if (bhit=='1') {
                                        //y2 = (y2-1)%8;
-                                        --y2;
-                                        if(y2<0)
-                                            y2=7;
-                                    }
+                                    --y2;
+                                    if(y2<0)
+                                        y2=7;
+                                }
                                 break;
                                 case '6': //button 6 down arrow
-                                    if (bhit=='1') {
-                                        y2 = (y2+1)%8;
-                                    } 
+                                if (bhit=='1') {
+                                    y2 = (y2+1)%8;
+                                } 
                                 break;
                                 case '7': //button 7 left arrow
-                                    if (bhit=='1') {
+                                if (bhit=='1') {
                                         //x2 = (x2-1)%8;
-                                        --x2;
-                                        if(x2<0)
-                                            x2=7;
-                                    } 
+                                    --x2;
+                                    if(x2<0)
+                                        x2=7;
+                                } 
                                 break;
                                 case '8': //button 8 right arrow
-                                    if (bhit=='1') {
-                                        x2 = (x2+1)%8;
-                                    } 
+                                if (bhit=='1') {
+                                    x2 = (x2+1)%8;
+                                } 
                                 break;
 
                             }
 
-                                   
-                if(x2 != oldx2 || y2 != oldy2)
-                {
-                    mySpeaker.PlayNote(800.0,0.05,0.05);
-                    if(oldx % 2 == oldy2 %2)
-                        uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0xbcb6b8); 
-                    else
-                        uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0x645659); 
-                    
-                    uLCD.rectangle(x2*16,y2*16,(x2*16)+16,(y2*16)+16, BLUE);
-                    oldx2 = x2;
-                    oldy2 = y2;  
-                }
-                    
-                    if (one_hit) {
-                        if(board[oldx2][oldy2] < 0 || selected2) {
-                            if(selected2) {
-                                //check move, make move and change turn if valid
-                                if(selectedx2 == oldx2 && selectedy2 == oldy2) {
-                                    selected2 = false; 
-                                }
-                                else {
-                                    if(validMove(selectedx2, selectedy2, oldx2, oldy2)) {
-                                        movePiece(selectedx2, selectedy2, oldx2, oldy2, BLACK); 
-                                        selected2 = false;
-                                        current_player = 1;
-                                        if(oldx % 2 == oldy2 %2)
-                                            uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0xbcb6b8); 
-                                        else
-                                            uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0x645659); 
-                                        uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, GREEN);
-                                    }
-                                }
+                            //sames as in player 1, play a sound and move the selection box if necessary
+                            if(x2 != oldx2 || y2 != oldy2)
+                            {
+                                mySpeaker.PlayNote(800.0,0.05,0.05);
+                                if(oldx % 2 == oldy2 %2)
+                                    uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0xbcb6b8); 
+                                else
+                                    uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0x645659); 
+
+                                uLCD.rectangle(x2*16,y2*16,(x2*16)+16,(y2*16)+16, BLUE);
+                                oldx2 = x2;
+                                oldy2 = y2;  
                             }
-                            else
-                            {
-                                selected2 = true;
-                                selectedx2 =  oldx2;
-                                selectedy2 = oldy2;
-                            }
-                            one_hit =false;   
+
+                            //if the selection button was pressed select/ deselect the piece or attempt to make a move
+                            if (one_hit) {
+                                if(board[oldx2][oldy2] < 0 || selected2) {
+                                    if(selected2) {
+                                        //check move, make move and change turn if valid
+                                        if(selectedx2 == oldx2 && selectedy2 == oldy2) {
+                                            selected2 = false; 
+                                        }
+                                        else {
+                                            if(validMove(selectedx2, selectedy2, oldx2, oldy2)) {
+                                                movePiece(selectedx2, selectedy2, oldx2, oldy2, BLACK); 
+                                                selected2 = false;
+                                                current_player = 1;
+                                                if(oldx % 2 == oldy2 %2)
+                                                    uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0xbcb6b8); 
+                                                else
+                                                    uLCD.rectangle(oldx2*16,oldy2*16,(oldx2*16)+16,(oldy2*16)+16, 0x645659); 
+                                                uLCD.rectangle(oldx*16,oldy*16,(oldx*16)+16,(oldy*16)+16, GREEN);
+                                            }
+                                        }
+                                    }
+                                    else
+                                    {
+                                        selected2 = true;
+                                        selectedx2 =  oldx2;
+                                        selectedy2 = oldy2;
+                                    }
+                                    one_hit =false;   
+                                }
+                            } 
                         }
-                    } 
-
-                            
-                        
-                        }
-                    }
-                    
+                    }      
                 }
-               
             } 
-  while(winner) {
-                    uLCD.cls();
-                    uLCD.printf("Player %i wins", winner);
-                    while(1) {
+            //if someone won the game then display the winner and play the video
+            if(winner) {
+                uLCD.cls();
+                uLCD.printf("Player %i wins", winner);
+                wait(1);
+                while(1) {
 
-    uLCD.media_init();
-    uLCD.set_sector_address(0x0000, 0x00);
-    uLCD.display_video(0,0);
+                    uLCD.media_init();
+                    uLCD.set_sector_address(0x0000, 0x00);
+                    uLCD.display_video(0,0);
+                }
+            }           
+        }
     }
-                }     
-            
-
-            
-    }
-}
+    
\ No newline at end of file