Lab 4 for ECE4180, final verison

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

Fork of Lab4-Reversi-v2 by Emeril Huang

Overview

For our project, we created the 2 player game “Reversi”, otherwise known as Othello using the uLCD-144-G2, a Sparkfun 5-way Tactile Switch Joystick, a speaker with a Class D audio amp breakout board, and SD card reader. The program begins with the dark player’s turn, and the joystick is used to move the red cursor box around. Pressing down on the joystick will attempt to put a piece down, resulting in a flipping sound, and will show an X on the screen for invalid moves. The game will finish when the board is filled, and go to a result screen, playing a victory sound. The result screen allows for a play again option. /media/uploads/EvolutionOfWar/reversimbed.jpg

Components

Wiring

mbedCableuLCD
P28TXRX
P27RXTX
P29RESRESET
VU+5V+5V
GNDGNDGND
mbedSD Card Reader
P5DI
P6DO
P7SCK
P8CS
GNDGND
VoutVCC
mbedAmpliferSpeaker
P18In +
GNDGND
VUPWR +
Out ++
Out --
GNDPWR -
mbedJoystick
P14Up
P13Center
P12Left
P11Down
P10Right
GND-
Vout+

Program

Import programLab4-Reversi-Final

Lab 4 for ECE4180, final verison

Files at this revision

API Documentation at this revision

Comitter:
aolmenki
Date:
Tue Nov 01 23:30:44 2016 +0000
Parent:
2:1f7c6cc19a9a
Commit message:
Final

Changed in this revision

Reversi.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Reversi.cpp	Tue Nov 01 13:59:02 2016 +0000
+++ b/Reversi.cpp	Tue Nov 01 23:30:44 2016 +0000
@@ -8,7 +8,7 @@
 PwmOut Speaker(p21);
 AnalogOut DACout(p18);
 
-DigitalIn pb(p10);
+DigitalIn pb(p15);
 
 wave_player waver(&DACout);
 
@@ -238,8 +238,8 @@
         for (int i = 0; i < 8; i++) { // check for opponent around emtpy space and fill
             if (i == 0) { // right
                 if (x + 1 < 7 && gb[x + 1][y] == opp) { //check to see if not beyond board and has to be next to the opponent
-                    for (int j = x + 2; j < 8; j++) {
-                        if (gb[j][y] == pl && !flipped) {
+                    for (int j = x + 2; j < 8  && !flipped; j++) {
+                        if (gb[j][y] == pl) {
                             for (int k = x + 1; k < j; k++) {
                                 flippingPiece(k, y);
                             }
@@ -258,8 +258,8 @@
                 }
             } else if (i == 1) { // down-right
                 if (x + 1 < 7 && y + 1 < 7 && gb[x + 1][y + 1] == opp) { // check if within margin and next to other color
-                    for (int j = 2; j < 8 - x && j < 8 - y; j++) { // start finding next same color
-                        if (gb[x + j][y + j] == pl && !flipped) { // if same color and not already been flipping
+                    for (int j = 2; j < 8 - x && j < 8 - y && !flipped; j++) { // start finding next same color
+                        if (gb[x + j][y + j] == pl) { // if same color and not already been flipping
                             for (int k = 1; k < j; k++) { // between other color to this same color
                                 flippingPiece(x + k, y + k); // flip
                             }
@@ -278,8 +278,8 @@
                 }
             } else if (i == 2) { // down
                 if (y + 1 < 7 && gb[x][y + 1] == opp) {
-                    for (int j = y + 2; j < 8; j++) {
-                        if (gb[x][j] == pl && !flipped) {
+                    for (int j = y + 2; j < 8 && !flipped; j++) {
+                        if (gb[x][j] == pl) {
                             for (int k = y + 1; k < j; k++) {
                                 flippingPiece(x, k);
                             }
@@ -298,8 +298,8 @@
                 }
             } else if (i == 3) { // down-left
                 if (x - 1 > 0 && y + 1 < 7 && gb[x - 1][y + 1] == opp) {
-                    for (int j = 2; j < x + 1 && j < 8 - y; j++) {
-                        if (gb[x - j][y + j] == pl && !flipped) {
+                    for (int j = 2; j < x + 1 && j < 8 - y && !flipped; j++) {
+                        if (gb[x - j][y + j] == pl) {
                             for (int k = 1; k < j; k++) {
                                 flippingPiece(x - k, y + k);
                             }
@@ -318,8 +318,8 @@
                 }
             } else if (i == 4) { // left
                 if (x - 1 > 0 && gb[x - 1][y] == opp) {
-                    for (int j = x - 2; j > -1; j--) {
-                        if (gb[j][y] == pl && !flipped) {
+                    for (int j = x - 2; j > -1 && !flipped; j--) {
+                        if (gb[j][y] == pl) {
                             for (int k = x - 1; k > j; k--) {
                                 flippingPiece(k, y);
                             }
@@ -338,14 +338,14 @@
                 }
             } else if (i == 5) { // up-left
                 if (x - 1 > 0 && y - 1 > 0 && gb[x - 1][y - 1] == opp) {
-                    for (int j = 2; j < x + 1 && j < y + 1; j++) {
-                        if (gb[x - j][y - j] == pl && !flipped) {
+                    for (int j = 2; j < x + 1 && j < y + 1 && !flipped; j++) {
+                        if (gb[x - j][y - j] == pl) {
                             for (int k = 1; k < j; k++) {
                                 flippingPiece(x - k, y - k);
                             }
                             flipped = true;
                         } else if (gb[x - j][y - j] == 0) {
-                            j = 8;
+                            j = x + 1;
                         }
                     }
                     if (flipped) {
@@ -358,8 +358,8 @@
                 }
             } else if (i == 6) { // up
                 if (y - 1 > 0 && gb[x][y - 1] == opp) {
-                    for (int j = y - 2; j > -1; j--) {
-                        if (gb[x][j] == pl && !flipped) {
+                    for (int j = y - 2; j > -1 && !flipped; j--) {
+                        if (gb[x][j] == pl) {
                             for (int k = y - 1; k > j; k--) {
                                 flippingPiece(x, k);
                             }
@@ -378,14 +378,14 @@
                 }
             } else if (i == 7) { // up-right
                 if (x + 1 < 7 && y - 1 > 0 && gb[x + 1][y - 1] == opp) {
-                    for (int j = 2; j < 8 - x && j < y + 1; j++) {
-                        if (gb[x + j][y - j] == pl && !flipped) {
+                    for (int j = 2; j < 8 - x && j < y + 1 && !flipped; j++) {
+                        if (gb[x + j][y - j] == pl) {
                             for (int k = 1; k < j; k++) {
                                 flippingPiece(x + k, y - k);
                             }
                             flipped = true;
                         } else if (gb[x + j][y - j] == 0) {
-                            j = 8;
+                            j = 8 - x;
                         }
                     }
                     if (flipped) {
@@ -445,17 +445,18 @@
     uLCD.filled_rectangle(0,0,127,127,0x007f00);
     
     FILE *fp1 = fopen("/sd/wavfiles/Victory.wav", "r");
-        if(fp1 == NULL) {
+    if(fp1 == NULL) {
         error("Could not open file for read\n");
-        }
-        Speaker.period(1.0/400000.0);
-        waver.play(fp1); //Plays *.wav audio file
-        fclose(fp1);
+    }
+    Speaker.period(1.0/400000.0);
+    waver.play(fp1); //Plays *.wav audio file
+    fclose(fp1);
     countPieces();
+    uLCD.textbackground_color(0x007f00);
     uLCD.color(RED);
     uLCD.printf("Score\n");
     uLCD.color(BLACK);
-    uLCD.printf("%D, numBlack");
+    uLCD.printf("%d", numBlack);
     uLCD.color(RED);
     uLCD.printf(" - ");
     uLCD.color(WHITE);
@@ -463,57 +464,30 @@
     uLCD.color(RED);
     uLCD.printf("\n Play again? \n");
     
-    uLCD.text_char('Y', 4, 9, BLUE);
-    uLCD.text_char('E', 5, 9, BLUE);
-    uLCD.text_char('S', 6, 9, BLUE);
-    uLCD.text_char('N', 11, 9, RED);
-    uLCD.text_char('O', 12, 9, RED);
+    uLCD.text_char('Y', 8, 9, BLUE);
+    uLCD.text_char('E', 9, 9, BLUE);
+    uLCD.text_char('S', 10, 9, BLUE);
     
-    uLCD.rectangle(20,90, 40, 110, 0xffff00); //Default over Yes
     bool optionSelected = false;
-    int choice = 1; //Default choice Yes
-    while(optionSelected ==false){
-        if(myNav[2] == 0 ){
-            uLCD.rectangle(20,90, 40, 110, 0xffff00);
-            uLCD.rectangle(80,90, 100, 110, 0x007F00);
-            choice = 1;
-            }
-        if(myNav[3] == 0 ){
-            uLCD.rectangle(20,90, 40, 110, 0x007F00);
-            uLCD.rectangle(80,90, 100, 110, 0xffff00);
-            choice = 2;
-            }
+    while(optionSelected == false){
         if(myNav[4] == 0){ //Joystick pressed to Select
-            if(choice == 1) {
-                //Restart and play again
-                initialize_game_board();
-                xCoor = 3;
-                yCoor = 4;
-                }
-            else{ //choice == 0
-                //Quit?
-            }
+            //Restart and play again
+            initialize_game_board();
+            drawPieces();
+            xCoor = 3;
+            yCoor = 4;
+            optionSelected = true;
         }       
     } 
 }
 
-//For Testing purposes
-void instantEnd(){
-    result();
-}
-
 int main() {
     pb.mode(PullUp);
-    
     while (1) {
        
         initialize_game_board();
         drawPieces();
         while(!gameover) { //active game, checks game over
-            if(pb == 1){
-                instantEnd();
-            }
-            // check inputs
             while (!moved) {
                 drawCursor(xCoor, yCoor);
                 wait(0.02);
@@ -526,11 +500,14 @@
                 if(myNav[3] == 0 && yCoor != 0){yCoor --;}
                 if(myNav.fire()) {valid_move(xCoor, yCoor);} // Press Down Joystick for Select
                 //or use - if(myNav[4]==0) mbedleds = 0x0F; //can index a switch bit like this
+                if (pb == 0) {
+                    result();
+                }
             }
             moved = false;
             // check game over
             countPieces();
-            gameover = numBlack + numWhite == 64;
+            gameover = (numBlack + numWhite == 64 || gameover);
         }
         result();
     }