Multi-game multiplayer arcade gaming system meant for the blue O when playing Super Tic-Tac-Toe.
Dependencies: 4DGL-uLCD-SE PinDetect SDFileSystem mbed wave_player
main.cpp@2:da0f01fbd25c, 2015-12-04 (annotated)
- Committer:
- soapy12312
- Date:
- Fri Dec 04 23:00:42 2015 +0000
- Revision:
- 2:da0f01fbd25c
- Parent:
- 1:2a7e2f5aeda4
Multi-game multiplayer arcade gaming system meant for the blue O when playing Super Tic-Tac-Toe.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
soapy12312 | 2:da0f01fbd25c | 1 | /******************************************************* |
soapy12312 | 2:da0f01fbd25c | 2 | * This main program simulates a multi-game multiplayer |
soapy12312 | 2:da0f01fbd25c | 3 | * arcade gaming system. The program allows the player |
soapy12312 | 2:da0f01fbd25c | 4 | * to choose from four different games: |
soapy12312 | 2:da0f01fbd25c | 5 | * |
soapy12312 | 2:da0f01fbd25c | 6 | * 1) Simon |
soapy12312 | 2:da0f01fbd25c | 7 | * 2) Super Tic-Tac-Toe (second player, the blue O) |
soapy12312 | 2:da0f01fbd25c | 8 | * 3) Pac-Man |
soapy12312 | 2:da0f01fbd25c | 9 | * 4) Rock, Paper, Scissors, Lizard, Spock |
soapy12312 | 2:da0f01fbd25c | 10 | * |
soapy12312 | 2:da0f01fbd25c | 11 | * All games except Pac-Man communicate with another |
soapy12312 | 2:da0f01fbd25c | 12 | * gaming system via an XBee module to simulate |
soapy12312 | 2:da0f01fbd25c | 13 | * multiplayer. Pac-Man is multiplayer as well, but the |
soapy12312 | 2:da0f01fbd25c | 14 | * characters in the game are controlled using the three |
soapy12312 | 2:da0f01fbd25c | 15 | * tactile switches on one board. |
soapy12312 | 2:da0f01fbd25c | 16 | *******************************************************/ |
soapy12312 | 2:da0f01fbd25c | 17 | |
soapy12312 | 2:da0f01fbd25c | 18 | |
soapy12312 | 0:218d3fb75950 | 19 | #include "mbed.h" |
soapy12312 | 0:218d3fb75950 | 20 | #include "PinDetect.h" |
soapy12312 | 0:218d3fb75950 | 21 | #include "SDFileSystem.h" |
soapy12312 | 0:218d3fb75950 | 22 | #include "uLCD_4DGL.h" |
soapy12312 | 0:218d3fb75950 | 23 | #include "wave_player.h" |
soapy12312 | 0:218d3fb75950 | 24 | #include <mpr121.h> |
soapy12312 | 0:218d3fb75950 | 25 | #include "RGBLED.h" |
soapy12312 | 2:da0f01fbd25c | 26 | #include "BlueO.h" |
soapy12312 | 2:da0f01fbd25c | 27 | #include "Simon.h" |
soapy12312 | 0:218d3fb75950 | 28 | #include "Stage.h" |
soapy12312 | 0:218d3fb75950 | 29 | #include "Pacman.h" |
soapy12312 | 0:218d3fb75950 | 30 | #include "Ghost.h" |
soapy12312 | 1:2a7e2f5aeda4 | 31 | #include "RPSLK.h" |
soapy12312 | 0:218d3fb75950 | 32 | |
soapy12312 | 0:218d3fb75950 | 33 | |
soapy12312 | 0:218d3fb75950 | 34 | // Speaker |
soapy12312 | 0:218d3fb75950 | 35 | AnalogOut DACout(p18); |
soapy12312 | 0:218d3fb75950 | 36 | wave_player waver(&DACout); |
soapy12312 | 0:218d3fb75950 | 37 | |
soapy12312 | 1:2a7e2f5aeda4 | 38 | // XBee module |
soapy12312 | 1:2a7e2f5aeda4 | 39 | DigitalOut reset(p12); |
soapy12312 | 1:2a7e2f5aeda4 | 40 | Serial XBee(p13, p14); |
soapy12312 | 1:2a7e2f5aeda4 | 41 | |
soapy12312 | 0:218d3fb75950 | 42 | // SD card |
soapy12312 | 0:218d3fb75950 | 43 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
soapy12312 | 0:218d3fb75950 | 44 | |
soapy12312 | 0:218d3fb75950 | 45 | // uLCD display |
soapy12312 | 0:218d3fb75950 | 46 | uLCD_4DGL uLCD(p28, p27, p30); |
soapy12312 | 0:218d3fb75950 | 47 | |
soapy12312 | 0:218d3fb75950 | 48 | |
soapy12312 | 0:218d3fb75950 | 49 | // Select game to play |
soapy12312 | 0:218d3fb75950 | 50 | int selectGame(); |
soapy12312 | 0:218d3fb75950 | 51 | |
soapy12312 | 0:218d3fb75950 | 52 | |
soapy12312 | 0:218d3fb75950 | 53 | int main() { |
soapy12312 | 2:da0f01fbd25c | 54 | int gameNumber = selectGame(); |
soapy12312 | 0:218d3fb75950 | 55 | |
soapy12312 | 0:218d3fb75950 | 56 | // Play Simon Says |
soapy12312 | 2:da0f01fbd25c | 57 | if (gameNumber == 0) { |
soapy12312 | 0:218d3fb75950 | 58 | // Analog noise |
soapy12312 | 0:218d3fb75950 | 59 | AnalogIn noise(p15); |
soapy12312 | 0:218d3fb75950 | 60 | |
soapy12312 | 0:218d3fb75950 | 61 | // Pushbutton interrupts |
soapy12312 | 0:218d3fb75950 | 62 | PinDetect button1(p17); |
soapy12312 | 0:218d3fb75950 | 63 | PinDetect button2(p19); |
soapy12312 | 0:218d3fb75950 | 64 | PinDetect button3(p20); |
soapy12312 | 0:218d3fb75950 | 65 | PinDetect button4(p16); |
soapy12312 | 0:218d3fb75950 | 66 | |
soapy12312 | 2:da0f01fbd25c | 67 | Simon simon = Simon(noise, reset, button1, button2, button3, button4, sd, XBee, uLCD, waver); |
soapy12312 | 2:da0f01fbd25c | 68 | simon.playSimon(); |
soapy12312 | 0:218d3fb75950 | 69 | // Play Super Tic-Tac-Toe |
soapy12312 | 2:da0f01fbd25c | 70 | } else if (gameNumber == 1) { |
soapy12312 | 0:218d3fb75950 | 71 | // Touch keypad |
soapy12312 | 0:218d3fb75950 | 72 | InterruptIn input(p21); |
soapy12312 | 0:218d3fb75950 | 73 | I2C i2c(p9, p10); |
soapy12312 | 0:218d3fb75950 | 74 | Mpr121 MPR121(&i2c, Mpr121::ADD_VSS); |
soapy12312 | 2:da0f01fbd25c | 75 | |
soapy12312 | 1:2a7e2f5aeda4 | 76 | // RGB LED |
soapy12312 | 1:2a7e2f5aeda4 | 77 | RGBLED RGB(p25, p23, p22); |
soapy12312 | 0:218d3fb75950 | 78 | |
soapy12312 | 2:da0f01fbd25c | 79 | BlueO player = BlueO(reset, input, MPR121, RGB, sd, XBee, uLCD, waver); |
soapy12312 | 2:da0f01fbd25c | 80 | player.playSuperTicTacToe(); |
soapy12312 | 0:218d3fb75950 | 81 | // Play Pac-Man |
soapy12312 | 2:da0f01fbd25c | 82 | } else if (gameNumber == 2) { |
soapy12312 | 0:218d3fb75950 | 83 | // Pac-Man controller |
soapy12312 | 0:218d3fb75950 | 84 | PinDetect PacmanRight(p9); |
soapy12312 | 0:218d3fb75950 | 85 | PinDetect PacmanDown(p10); |
soapy12312 | 0:218d3fb75950 | 86 | PinDetect PacmanLeft(p11); |
soapy12312 | 0:218d3fb75950 | 87 | PinDetect PacmanUp(p29); |
soapy12312 | 0:218d3fb75950 | 88 | |
soapy12312 | 0:218d3fb75950 | 89 | // Red ghost controller |
soapy12312 | 0:218d3fb75950 | 90 | PinDetect redGhostRight(p26); |
soapy12312 | 0:218d3fb75950 | 91 | PinDetect redGhostDown(p15); |
soapy12312 | 0:218d3fb75950 | 92 | PinDetect redGhostLeft(p16); |
soapy12312 | 0:218d3fb75950 | 93 | PinDetect redGhostUp(p19); |
soapy12312 | 0:218d3fb75950 | 94 | |
soapy12312 | 0:218d3fb75950 | 95 | // Yellow ghost controller |
soapy12312 | 0:218d3fb75950 | 96 | PinDetect yellowGhostRight(p25); |
soapy12312 | 0:218d3fb75950 | 97 | PinDetect yellowGhostDown(p24); |
soapy12312 | 0:218d3fb75950 | 98 | PinDetect yellowGhostLeft(p23); |
soapy12312 | 0:218d3fb75950 | 99 | PinDetect yellowGhostUp(p21); |
soapy12312 | 0:218d3fb75950 | 100 | |
soapy12312 | 0:218d3fb75950 | 101 | // Maximize the baud rate |
soapy12312 | 0:218d3fb75950 | 102 | uLCD.baudrate(MAXBAUDRATE); |
soapy12312 | 0:218d3fb75950 | 103 | |
soapy12312 | 0:218d3fb75950 | 104 | // Set up the stage |
soapy12312 | 0:218d3fb75950 | 105 | Stage stage(uLCD); |
soapy12312 | 0:218d3fb75950 | 106 | stage.initialize(); |
soapy12312 | 0:218d3fb75950 | 107 | |
soapy12312 | 0:218d3fb75950 | 108 | // Set up Pac-Man |
soapy12312 | 2:da0f01fbd25c | 109 | Pacman pacman(PacmanRight, PacmanDown, PacmanLeft, PacmanUp, stage, uLCD, waver); |
soapy12312 | 0:218d3fb75950 | 110 | pacman.initialize(); |
soapy12312 | 0:218d3fb75950 | 111 | |
soapy12312 | 0:218d3fb75950 | 112 | // Set up the red ghost |
soapy12312 | 0:218d3fb75950 | 113 | Ghost redGhost(RED, pacman, redGhostRight, redGhostDown, redGhostLeft, redGhostUp, stage, uLCD); |
soapy12312 | 0:218d3fb75950 | 114 | redGhost.initialize(60, 60, FACELEFT); |
soapy12312 | 2:da0f01fbd25c | 115 | |
soapy12312 | 0:218d3fb75950 | 116 | // Set up the yellow ghost |
soapy12312 | 0:218d3fb75950 | 117 | Ghost yellowGhost(YELLOW, pacman, yellowGhostRight, yellowGhostDown, yellowGhostLeft, yellowGhostUp, stage, uLCD); |
soapy12312 | 0:218d3fb75950 | 118 | yellowGhost.initialize(68, 60, FACERIGHT); |
soapy12312 | 2:da0f01fbd25c | 119 | |
soapy12312 | 2:da0f01fbd25c | 120 | pacman.playSound(THEME); |
soapy12312 | 0:218d3fb75950 | 121 | |
soapy12312 | 0:218d3fb75950 | 122 | // Checks to see whether the game is over |
soapy12312 | 0:218d3fb75950 | 123 | bool gameOver; |
soapy12312 | 0:218d3fb75950 | 124 | |
soapy12312 | 0:218d3fb75950 | 125 | // Loop through the game |
soapy12312 | 0:218d3fb75950 | 126 | while (1) { |
soapy12312 | 0:218d3fb75950 | 127 | pacman.displayStatus(); |
soapy12312 | 0:218d3fb75950 | 128 | gameOver = pacman.move(); |
soapy12312 | 0:218d3fb75950 | 129 | |
soapy12312 | 0:218d3fb75950 | 130 | // If all pac dots are eaten or Pac-Man runs out of lives |
soapy12312 | 0:218d3fb75950 | 131 | if (gameOver == true) { |
soapy12312 | 0:218d3fb75950 | 132 | // Break out of the loop |
soapy12312 | 0:218d3fb75950 | 133 | break; |
soapy12312 | 0:218d3fb75950 | 134 | } |
soapy12312 | 0:218d3fb75950 | 135 | |
soapy12312 | 0:218d3fb75950 | 136 | redGhost.move(); |
soapy12312 | 0:218d3fb75950 | 137 | |
soapy12312 | 0:218d3fb75950 | 138 | yellowGhost.move(); |
soapy12312 | 0:218d3fb75950 | 139 | } |
soapy12312 | 0:218d3fb75950 | 140 | |
soapy12312 | 0:218d3fb75950 | 141 | // Game over display |
soapy12312 | 0:218d3fb75950 | 142 | pacman.gameOver(); |
soapy12312 | 0:218d3fb75950 | 143 | } else { |
soapy12312 | 1:2a7e2f5aeda4 | 144 | // Tactile switch interrupts |
soapy12312 | 1:2a7e2f5aeda4 | 145 | PinDetect rock(p21); |
soapy12312 | 1:2a7e2f5aeda4 | 146 | PinDetect paper(p22); |
soapy12312 | 1:2a7e2f5aeda4 | 147 | PinDetect scissors(p23); |
soapy12312 | 1:2a7e2f5aeda4 | 148 | PinDetect lizard(p24); |
soapy12312 | 1:2a7e2f5aeda4 | 149 | PinDetect spock(p25); |
soapy12312 | 1:2a7e2f5aeda4 | 150 | |
soapy12312 | 1:2a7e2f5aeda4 | 151 | RPSLK rpslk = RPSLK(reset, rock, paper, scissors, lizard, spock, sd, XBee, uLCD, waver); |
soapy12312 | 1:2a7e2f5aeda4 | 152 | rpslk.playRPSLK(); |
soapy12312 | 0:218d3fb75950 | 153 | } |
soapy12312 | 0:218d3fb75950 | 154 | } |
soapy12312 | 0:218d3fb75950 | 155 | |
soapy12312 | 0:218d3fb75950 | 156 | |
soapy12312 | 0:218d3fb75950 | 157 | // Select game to play |
soapy12312 | 0:218d3fb75950 | 158 | int selectGame() { |
soapy12312 | 2:da0f01fbd25c | 159 | // Set up XBee |
soapy12312 | 2:da0f01fbd25c | 160 | reset = 0; |
soapy12312 | 2:da0f01fbd25c | 161 | wait(0.001); |
soapy12312 | 2:da0f01fbd25c | 162 | reset = 1; |
soapy12312 | 2:da0f01fbd25c | 163 | wait(0.001); |
soapy12312 | 2:da0f01fbd25c | 164 | |
soapy12312 | 2:da0f01fbd25c | 165 | selection: |
soapy12312 | 0:218d3fb75950 | 166 | DigitalIn button1(p17); |
soapy12312 | 0:218d3fb75950 | 167 | DigitalIn button2(p19); |
soapy12312 | 0:218d3fb75950 | 168 | DigitalIn button3(p20); |
soapy12312 | 0:218d3fb75950 | 169 | DigitalIn button4(p16); |
soapy12312 | 0:218d3fb75950 | 170 | |
soapy12312 | 0:218d3fb75950 | 171 | button1.mode(PullUp); |
soapy12312 | 0:218d3fb75950 | 172 | button2.mode(PullUp); |
soapy12312 | 0:218d3fb75950 | 173 | button3.mode(PullUp); |
soapy12312 | 0:218d3fb75950 | 174 | button4.mode(PullUp); |
soapy12312 | 0:218d3fb75950 | 175 | wait(0.01); |
soapy12312 | 0:218d3fb75950 | 176 | |
soapy12312 | 0:218d3fb75950 | 177 | uLCD.baudrate(MAXBAUDRATE); |
soapy12312 | 0:218d3fb75950 | 178 | |
soapy12312 | 0:218d3fb75950 | 179 | uLCD.text_width(1); |
soapy12312 | 0:218d3fb75950 | 180 | uLCD.text_height(1); |
soapy12312 | 0:218d3fb75950 | 181 | uLCD.textbackground_color(BLACK); |
soapy12312 | 0:218d3fb75950 | 182 | uLCD.filled_rectangle(0, 0, 127, 127, BLACK); |
soapy12312 | 0:218d3fb75950 | 183 | uLCD.background_color(BLACK); |
soapy12312 | 0:218d3fb75950 | 184 | uLCD.color(GREEN); |
soapy12312 | 0:218d3fb75950 | 185 | uLCD.locate(0, 0); |
soapy12312 | 0:218d3fb75950 | 186 | |
soapy12312 | 0:218d3fb75950 | 187 | uLCD.printf("Select game:\n\n"); |
soapy12312 | 0:218d3fb75950 | 188 | uLCD.printf("pb1: Simon Says\n"); |
soapy12312 | 0:218d3fb75950 | 189 | uLCD.printf("pb2: Super Tic-\n Tac-Toe\n"); |
soapy12312 | 0:218d3fb75950 | 190 | uLCD.printf("pb3: Pac-Man\n"); |
soapy12312 | 0:218d3fb75950 | 191 | uLCD.printf("pb4: Rock, Paper,\n Scissors,\n Lizard, Spock"); |
soapy12312 | 0:218d3fb75950 | 192 | wait(0.1); |
soapy12312 | 0:218d3fb75950 | 193 | |
soapy12312 | 0:218d3fb75950 | 194 | int gameNumber = -1; |
soapy12312 | 0:218d3fb75950 | 195 | |
soapy12312 | 0:218d3fb75950 | 196 | while (1) { |
soapy12312 | 0:218d3fb75950 | 197 | if (button1 != 1) { |
soapy12312 | 0:218d3fb75950 | 198 | gameNumber = 0; |
soapy12312 | 0:218d3fb75950 | 199 | break; |
soapy12312 | 0:218d3fb75950 | 200 | } else if (button2 != 1) { |
soapy12312 | 0:218d3fb75950 | 201 | gameNumber = 1; |
soapy12312 | 0:218d3fb75950 | 202 | break; |
soapy12312 | 0:218d3fb75950 | 203 | } else if (button3 != 1) { |
soapy12312 | 0:218d3fb75950 | 204 | gameNumber = 2; |
soapy12312 | 0:218d3fb75950 | 205 | break; |
soapy12312 | 0:218d3fb75950 | 206 | } else if (button4 != 1) { |
soapy12312 | 0:218d3fb75950 | 207 | gameNumber = 3; |
soapy12312 | 0:218d3fb75950 | 208 | break; |
soapy12312 | 0:218d3fb75950 | 209 | } |
soapy12312 | 2:da0f01fbd25c | 210 | } |
soapy12312 | 2:da0f01fbd25c | 211 | |
soapy12312 | 2:da0f01fbd25c | 212 | uLCD.cls(); |
soapy12312 | 2:da0f01fbd25c | 213 | XBee.putc(gameNumber); |
soapy12312 | 2:da0f01fbd25c | 214 | int otherGame = -1; |
soapy12312 | 2:da0f01fbd25c | 215 | bool print = true; |
soapy12312 | 2:da0f01fbd25c | 216 | |
soapy12312 | 2:da0f01fbd25c | 217 | if ((gameNumber == 0) || (gameNumber == 1) || (gameNumber == 3)) { |
soapy12312 | 2:da0f01fbd25c | 218 | while (otherGame == -1) { |
soapy12312 | 2:da0f01fbd25c | 219 | if (XBee.readable() == true) { |
soapy12312 | 2:da0f01fbd25c | 220 | otherGame = XBee.getc(); |
soapy12312 | 2:da0f01fbd25c | 221 | print = false; |
soapy12312 | 2:da0f01fbd25c | 222 | } |
soapy12312 | 2:da0f01fbd25c | 223 | |
soapy12312 | 2:da0f01fbd25c | 224 | if (print == true) { |
soapy12312 | 2:da0f01fbd25c | 225 | uLCD.printf("Waiting for other player..."); |
soapy12312 | 2:da0f01fbd25c | 226 | print = false; |
soapy12312 | 2:da0f01fbd25c | 227 | } |
soapy12312 | 2:da0f01fbd25c | 228 | } |
soapy12312 | 2:da0f01fbd25c | 229 | |
soapy12312 | 2:da0f01fbd25c | 230 | if (otherGame != gameNumber) { |
soapy12312 | 2:da0f01fbd25c | 231 | uLCD.cls(); |
soapy12312 | 2:da0f01fbd25c | 232 | uLCD.printf("Sorry, but the "); |
soapy12312 | 2:da0f01fbd25c | 233 | uLCD.printf("other player chose"); |
soapy12312 | 2:da0f01fbd25c | 234 | uLCD.printf("a different game. "); |
soapy12312 | 2:da0f01fbd25c | 235 | uLCD.printf("Returning to game "); |
soapy12312 | 2:da0f01fbd25c | 236 | uLCD.printf("selection menu."); |
soapy12312 | 2:da0f01fbd25c | 237 | wait(2); |
soapy12312 | 2:da0f01fbd25c | 238 | uLCD.cls(); |
soapy12312 | 2:da0f01fbd25c | 239 | goto selection; |
soapy12312 | 2:da0f01fbd25c | 240 | } |
soapy12312 | 2:da0f01fbd25c | 241 | } |
soapy12312 | 0:218d3fb75950 | 242 | |
soapy12312 | 0:218d3fb75950 | 243 | uLCD.cls(); |
soapy12312 | 0:218d3fb75950 | 244 | return gameNumber; |
soapy12312 | 0:218d3fb75950 | 245 | } |