Multi-game multiplayer arcade gaming system meant for the red X when playing Super Tic-Tac-Toe.

Dependencies:   uLCD_4DGL_SE PinDetect SDFileSystem mbed wave_player

Committer:
soapy12312
Date:
Fri Dec 04 23:03:08 2015 +0000
Revision:
2:d35fde2d82cd
Parent:
1:2a7e2f5aeda4
Multi-game multiplayer arcade gaming system meant for the red X when playing Super Tic-Tac-Toe.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
soapy12312 2:d35fde2d82cd 1 /*******************************************************
soapy12312 2:d35fde2d82cd 2 * This main program simulates a multi-game multiplayer
soapy12312 2:d35fde2d82cd 3 * arcade gaming system. The program allows the player
soapy12312 2:d35fde2d82cd 4 * to choose from four different games:
soapy12312 2:d35fde2d82cd 5 *
soapy12312 2:d35fde2d82cd 6 * 1) Simon
soapy12312 2:d35fde2d82cd 7 * 2) Super Tic-Tac-Toe (first player, the red X)
soapy12312 2:d35fde2d82cd 8 * 3) Pac-Man
soapy12312 2:d35fde2d82cd 9 * 4) Rock, Paper, Scissors, Lizard, Spock
soapy12312 2:d35fde2d82cd 10 *
soapy12312 2:d35fde2d82cd 11 * All games except Pac-Man communicate with another
soapy12312 2:d35fde2d82cd 12 * gaming system via an XBee module to simulate
soapy12312 2:d35fde2d82cd 13 * multiplayer. Pac-Man is multiplayer as well, but the
soapy12312 2:d35fde2d82cd 14 * characters in the game are controlled using the three
soapy12312 2:d35fde2d82cd 15 * tactile switches on one board.
soapy12312 2:d35fde2d82cd 16 *******************************************************/
soapy12312 2:d35fde2d82cd 17
soapy12312 2:d35fde2d82cd 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:d35fde2d82cd 26 #include "RedX.h"
soapy12312 2:d35fde2d82cd 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:d35fde2d82cd 54 int gameNumber = selectGame();
soapy12312 0:218d3fb75950 55
soapy12312 0:218d3fb75950 56 // Play Simon Says
soapy12312 2:d35fde2d82cd 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:d35fde2d82cd 67 Simon simon = Simon(noise, reset, button1, button2, button3, button4, sd, XBee, uLCD, waver);
soapy12312 2:d35fde2d82cd 68 simon.playSimon();
soapy12312 0:218d3fb75950 69 // Play Super Tic-Tac-Toe
soapy12312 2:d35fde2d82cd 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:d35fde2d82cd 75
soapy12312 1:2a7e2f5aeda4 76 // RGB LED
soapy12312 1:2a7e2f5aeda4 77 RGBLED RGB(p25, p23, p22);
soapy12312 0:218d3fb75950 78
soapy12312 2:d35fde2d82cd 79 RedX player = RedX(reset, input, MPR121, RGB, sd, XBee, uLCD, waver);
soapy12312 2:d35fde2d82cd 80 player.playSuperTicTacToe();
soapy12312 0:218d3fb75950 81 // Play Pac-Man
soapy12312 2:d35fde2d82cd 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:d35fde2d82cd 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:d35fde2d82cd 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:d35fde2d82cd 119
soapy12312 2:d35fde2d82cd 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:d35fde2d82cd 159 // Set up XBee
soapy12312 2:d35fde2d82cd 160 reset = 0;
soapy12312 2:d35fde2d82cd 161 wait(0.001);
soapy12312 2:d35fde2d82cd 162 reset = 1;
soapy12312 2:d35fde2d82cd 163 wait(0.001);
soapy12312 2:d35fde2d82cd 164
soapy12312 2:d35fde2d82cd 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:d35fde2d82cd 210 }
soapy12312 2:d35fde2d82cd 211
soapy12312 2:d35fde2d82cd 212 uLCD.cls();
soapy12312 2:d35fde2d82cd 213 XBee.putc(gameNumber);
soapy12312 2:d35fde2d82cd 214 int otherGame = -1;
soapy12312 2:d35fde2d82cd 215 bool print = true;
soapy12312 2:d35fde2d82cd 216
soapy12312 2:d35fde2d82cd 217 if ((gameNumber == 0) || (gameNumber == 1) || (gameNumber == 3)) {
soapy12312 2:d35fde2d82cd 218 while (otherGame == -1) {
soapy12312 2:d35fde2d82cd 219 if (XBee.readable() == true) {
soapy12312 2:d35fde2d82cd 220 otherGame = XBee.getc();
soapy12312 2:d35fde2d82cd 221 print = false;
soapy12312 2:d35fde2d82cd 222 }
soapy12312 2:d35fde2d82cd 223
soapy12312 2:d35fde2d82cd 224 if (print == true) {
soapy12312 2:d35fde2d82cd 225 uLCD.printf("Waiting for other player...");
soapy12312 2:d35fde2d82cd 226 print = false;
soapy12312 2:d35fde2d82cd 227 }
soapy12312 2:d35fde2d82cd 228 }
soapy12312 2:d35fde2d82cd 229
soapy12312 2:d35fde2d82cd 230 if (otherGame != gameNumber) {
soapy12312 2:d35fde2d82cd 231 uLCD.cls();
soapy12312 2:d35fde2d82cd 232 uLCD.printf("Sorry, but the ");
soapy12312 2:d35fde2d82cd 233 uLCD.printf("other player chose");
soapy12312 2:d35fde2d82cd 234 uLCD.printf("a different game. ");
soapy12312 2:d35fde2d82cd 235 uLCD.printf("Returning to game ");
soapy12312 2:d35fde2d82cd 236 uLCD.printf("selection menu.");
soapy12312 2:d35fde2d82cd 237 wait(2);
soapy12312 2:d35fde2d82cd 238 uLCD.cls();
soapy12312 2:d35fde2d82cd 239 goto selection;
soapy12312 2:d35fde2d82cd 240 }
soapy12312 2:d35fde2d82cd 241 }
soapy12312 0:218d3fb75950 242
soapy12312 0:218d3fb75950 243 uLCD.cls();
soapy12312 0:218d3fb75950 244 return gameNumber;
soapy12312 0:218d3fb75950 245 }