This program simulates a game of Pac-Man that allows for multiplayer. One player controls Pac-Man, while two other players control a red and yellow ghost using different tactile switches.

Dependencies:   4DGL-uLCD-SE PinDetect mbed

Fork of Pac-Man by Eric Xu

Committer:
soapy12312
Date:
Mon Oct 19 17:51:14 2015 +0000
Revision:
1:839f59c6d021
Parent:
0:8b6686f2d4be
Multiplayer Pac-Man.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
soapy12312 0:8b6686f2d4be 1 /******************************************************
soapy12312 0:8b6686f2d4be 2 * Author: Yuanzhe Xu
soapy12312 0:8b6686f2d4be 3 * Institution: Georgia Institute of Technology
soapy12312 0:8b6686f2d4be 4 * Date: October 18, 2015
soapy12312 0:8b6686f2d4be 5 *
soapy12312 0:8b6686f2d4be 6 * This header file declares all the functions and
soapy12312 0:8b6686f2d4be 7 * variables needed for the Stage object.
soapy12312 0:8b6686f2d4be 8 ******************************************************/
soapy12312 0:8b6686f2d4be 9
soapy12312 0:8b6686f2d4be 10 #define YELLOW 0xFFFF00
soapy12312 0:8b6686f2d4be 11 #define PINK 0xFFB6C1
soapy12312 0:8b6686f2d4be 12
soapy12312 0:8b6686f2d4be 13 #define FACERIGHT 0
soapy12312 0:8b6686f2d4be 14 #define FACEDOWN 1
soapy12312 0:8b6686f2d4be 15 #define FACELEFT 2
soapy12312 0:8b6686f2d4be 16 #define FACEUP 3
soapy12312 0:8b6686f2d4be 17
soapy12312 0:8b6686f2d4be 18 // Stage class
soapy12312 0:8b6686f2d4be 19 class Stage {
soapy12312 0:8b6686f2d4be 20 public:
soapy12312 0:8b6686f2d4be 21 // Stage constructor
soapy12312 0:8b6686f2d4be 22 Stage(uLCD_4DGL& uLCD) : uLCD(uLCD) {
soapy12312 0:8b6686f2d4be 23 }
soapy12312 0:8b6686f2d4be 24
soapy12312 0:8b6686f2d4be 25 // Set up the stage
soapy12312 0:8b6686f2d4be 26 void initialize() {
soapy12312 0:8b6686f2d4be 27 printCounters();
soapy12312 0:8b6686f2d4be 28 drawStage();
soapy12312 0:8b6686f2d4be 29 setPositions();
soapy12312 0:8b6686f2d4be 30 }
soapy12312 0:8b6686f2d4be 31
soapy12312 0:8b6686f2d4be 32 // Check if the position is valid
soapy12312 0:8b6686f2d4be 33 bool checkValid(int xCoordinate, int yCoordinate) {
soapy12312 0:8b6686f2d4be 34 return (positions[xCoordinate][yCoordinate] != 0);
soapy12312 0:8b6686f2d4be 35 }
soapy12312 0:8b6686f2d4be 36
soapy12312 0:8b6686f2d4be 37 // Get the valid positions of the players
soapy12312 0:8b6686f2d4be 38 char* getPositions() {
soapy12312 0:8b6686f2d4be 39 return *positions;
soapy12312 0:8b6686f2d4be 40 }
soapy12312 0:8b6686f2d4be 41
soapy12312 0:8b6686f2d4be 42 // Get the number of pac dots
soapy12312 0:8b6686f2d4be 43 int getPacDots() {
soapy12312 0:8b6686f2d4be 44 return pacDots;
soapy12312 0:8b6686f2d4be 45 }
soapy12312 0:8b6686f2d4be 46
soapy12312 0:8b6686f2d4be 47 // Get the number of big pac dots
soapy12312 0:8b6686f2d4be 48 int getBigPacDots() {
soapy12312 0:8b6686f2d4be 49 return bigPacDots;
soapy12312 0:8b6686f2d4be 50 }
soapy12312 0:8b6686f2d4be 51
soapy12312 0:8b6686f2d4be 52
soapy12312 0:8b6686f2d4be 53 private:
soapy12312 0:8b6686f2d4be 54 // Total number of pac dots
soapy12312 0:8b6686f2d4be 55 int pacDots;
soapy12312 0:8b6686f2d4be 56 // Total number of big pac dots
soapy12312 0:8b6686f2d4be 57 int bigPacDots;
soapy12312 0:8b6686f2d4be 58 // Invalid = 0, valid = 1, pac dot = 2, big pac dot = 3
soapy12312 0:8b6686f2d4be 59 char positions[128][128];
soapy12312 0:8b6686f2d4be 60 // uLCD display
soapy12312 0:8b6686f2d4be 61 uLCD_4DGL& uLCD;
soapy12312 0:8b6686f2d4be 62 // Set Pacman as a friend class
soapy12312 0:8b6686f2d4be 63 friend class Pacman;
soapy12312 0:8b6686f2d4be 64 // Set Ghost as a friend class
soapy12312 0:8b6686f2d4be 65 friend class Ghost;
soapy12312 0:8b6686f2d4be 66
soapy12312 0:8b6686f2d4be 67 // Print score and power-up counters
soapy12312 0:8b6686f2d4be 68 void printCounters() {
soapy12312 0:8b6686f2d4be 69 uLCD.printf("Score Power-Up %%");
soapy12312 0:8b6686f2d4be 70 }
soapy12312 0:8b6686f2d4be 71
soapy12312 0:8b6686f2d4be 72 // Draw the bounds of the maze
soapy12312 0:8b6686f2d4be 73 void drawStage() {
soapy12312 0:8b6686f2d4be 74 uLCD.pixel(108, 64, BLUE);
soapy12312 0:8b6686f2d4be 75 uLCD.pixel(20, 64, BLUE);
soapy12312 0:8b6686f2d4be 76 uLCD.pixel(68, 24, BLUE);
soapy12312 0:8b6686f2d4be 77 uLCD.pixel(60, 120, BLUE);
soapy12312 0:8b6686f2d4be 78 uLCD.line(4, 16, 60, 16, BLUE);
soapy12312 0:8b6686f2d4be 79 uLCD.line(68, 16, 124, 16, BLUE);
soapy12312 0:8b6686f2d4be 80 uLCD.line(60, 16, 60, 24, BLUE);
soapy12312 0:8b6686f2d4be 81 uLCD.line(68, 16, 68, 24, BLUE);
soapy12312 0:8b6686f2d4be 82 uLCD.line(60, 24, 68, 24, BLUE);
soapy12312 0:8b6686f2d4be 83 uLCD.line(4, 16, 4, 40, BLUE);
soapy12312 0:8b6686f2d4be 84 uLCD.line(4, 40, 20, 40, BLUE);
soapy12312 0:8b6686f2d4be 85 uLCD.line(20, 40, 20, 64, BLUE);
soapy12312 0:8b6686f2d4be 86 uLCD.line(4, 64, 20, 64, BLUE);
soapy12312 0:8b6686f2d4be 87 uLCD.line(4, 72, 20, 72, BLUE);
soapy12312 0:8b6686f2d4be 88 uLCD.line(20, 72, 20, 96, BLUE);
soapy12312 0:8b6686f2d4be 89 uLCD.line(20, 96, 4, 96, BLUE);
soapy12312 0:8b6686f2d4be 90 uLCD.line(4, 96, 4, 120, BLUE);
soapy12312 0:8b6686f2d4be 91 uLCD.line(4, 120, 60, 120, BLUE);
soapy12312 0:8b6686f2d4be 92 uLCD.line(124, 16, 124, 40, BLUE);
soapy12312 0:8b6686f2d4be 93 uLCD.line(124, 40, 108, 40, BLUE);
soapy12312 0:8b6686f2d4be 94 uLCD.line(108, 40, 108, 64, BLUE);
soapy12312 0:8b6686f2d4be 95 uLCD.line(124, 64, 108, 64, BLUE);
soapy12312 0:8b6686f2d4be 96 uLCD.line(124, 72, 108, 72, BLUE);
soapy12312 0:8b6686f2d4be 97 uLCD.line(108, 72, 108, 96, BLUE);
soapy12312 0:8b6686f2d4be 98 uLCD.line(108, 96, 124, 96, BLUE);
soapy12312 0:8b6686f2d4be 99 uLCD.line(124, 96, 124, 120, BLUE);
soapy12312 0:8b6686f2d4be 100 uLCD.line(124, 120, 68, 120, BLUE);
soapy12312 0:8b6686f2d4be 101 uLCD.line(68, 120, 68, 112, BLUE);
soapy12312 0:8b6686f2d4be 102 uLCD.line(68, 112, 60, 112, BLUE);
soapy12312 0:8b6686f2d4be 103 uLCD.line(60, 112, 60, 120, BLUE);
soapy12312 0:8b6686f2d4be 104 uLCD.rectangle(12, 24, 20, 32, BLUE);
soapy12312 0:8b6686f2d4be 105 uLCD.rectangle(28, 24, 52, 40, BLUE);
soapy12312 0:8b6686f2d4be 106 uLCD.rectangle(76, 24, 100, 40, BLUE);
soapy12312 0:8b6686f2d4be 107 uLCD.rectangle(108, 24, 116, 32, BLUE);
soapy12312 0:8b6686f2d4be 108 uLCD.rectangle(28, 48, 44, 64, BLUE);
soapy12312 0:8b6686f2d4be 109 uLCD.rectangle(84, 48, 100, 64, BLUE);
soapy12312 0:8b6686f2d4be 110 uLCD.rectangle(28, 72, 44, 88, BLUE);
soapy12312 0:8b6686f2d4be 111 uLCD.rectangle(84, 72, 100, 88, BLUE);
soapy12312 0:8b6686f2d4be 112 uLCD.rectangle(52, 64, 76, 72, BLUE);
soapy12312 0:8b6686f2d4be 113 uLCD.line(61, 64, 68, 64, PINK);
soapy12312 0:8b6686f2d4be 114 uLCD.pixel(61, 64, PINK);
soapy12312 0:8b6686f2d4be 115 uLCD.pixel(68, 64, PINK);
soapy12312 0:8b6686f2d4be 116 uLCD.rectangle(12, 104, 20, 112, BLUE);
soapy12312 0:8b6686f2d4be 117 uLCD.rectangle(28, 96, 52, 112, BLUE);
soapy12312 0:8b6686f2d4be 118 uLCD.rectangle(76, 96, 100, 112, BLUE);
soapy12312 0:8b6686f2d4be 119 uLCD.rectangle(108, 104, 116, 112, BLUE);
soapy12312 0:8b6686f2d4be 120 uLCD.rectangle(60, 32, 68, 56, BLUE);
soapy12312 0:8b6686f2d4be 121 uLCD.rectangle(52, 48, 76, 56, BLUE);
soapy12312 0:8b6686f2d4be 122 uLCD.rectangle(60, 80, 68, 104, BLUE);
soapy12312 0:8b6686f2d4be 123 uLCD.rectangle(52, 80, 76, 88, BLUE);
soapy12312 0:8b6686f2d4be 124 uLCD.rectangle(60, 81, 68, 88, BLACK);
soapy12312 0:8b6686f2d4be 125 uLCD.rectangle(60, 48, 68, 55, BLACK);
soapy12312 0:8b6686f2d4be 126 uLCD.pixel(60, 48, BLUE);
soapy12312 0:8b6686f2d4be 127 uLCD.pixel(68, 48, BLUE);
soapy12312 0:8b6686f2d4be 128 uLCD.pixel(60, 88, BLUE);
soapy12312 0:8b6686f2d4be 129 uLCD.pixel(68, 88, BLUE);
soapy12312 0:8b6686f2d4be 130 }
soapy12312 0:8b6686f2d4be 131
soapy12312 0:8b6686f2d4be 132 // Set the positions of the players and pac dots
soapy12312 0:8b6686f2d4be 133 void setPositions() {
soapy12312 0:8b6686f2d4be 134 // Set the valid positions of the players
soapy12312 0:8b6686f2d4be 135 for (int i = 0; i < 128; i++) {
soapy12312 0:8b6686f2d4be 136 for (int j = 0; j < 128; j++) {
soapy12312 0:8b6686f2d4be 137 positions[i][j] = 0;
soapy12312 0:8b6686f2d4be 138 }
soapy12312 0:8b6686f2d4be 139 }
soapy12312 0:8b6686f2d4be 140
soapy12312 0:8b6686f2d4be 141 for (int i = 8; i <= 56; i++) {
soapy12312 0:8b6686f2d4be 142 positions[i][20] = 1;
soapy12312 0:8b6686f2d4be 143 positions[i][116] = 1;
soapy12312 0:8b6686f2d4be 144 }
soapy12312 0:8b6686f2d4be 145
soapy12312 0:8b6686f2d4be 146 for (int j = 20; j <= 36; j++) {
soapy12312 0:8b6686f2d4be 147 positions[8][j] = 1;
soapy12312 0:8b6686f2d4be 148 positions[120][j] = 1;
soapy12312 0:8b6686f2d4be 149 }
soapy12312 0:8b6686f2d4be 150
soapy12312 0:8b6686f2d4be 151 for (int i = 8; i <= 24; i++) {
soapy12312 0:8b6686f2d4be 152 positions[i][36] = 1;
soapy12312 0:8b6686f2d4be 153 positions[i][100] = 1;
soapy12312 0:8b6686f2d4be 154 }
soapy12312 0:8b6686f2d4be 155
soapy12312 0:8b6686f2d4be 156 for (int j = 20; j <= 116; j++) {
soapy12312 0:8b6686f2d4be 157 positions[24][j] = 1;
soapy12312 0:8b6686f2d4be 158 positions[104][j] = 1;
soapy12312 0:8b6686f2d4be 159 }
soapy12312 0:8b6686f2d4be 160
soapy12312 0:8b6686f2d4be 161 for (int j = 20; j <= 44; j++) {
soapy12312 0:8b6686f2d4be 162 positions[56][j] = 1;
soapy12312 0:8b6686f2d4be 163 positions[72][j] = 1;
soapy12312 0:8b6686f2d4be 164 }
soapy12312 0:8b6686f2d4be 165
soapy12312 0:8b6686f2d4be 166 for (int i = 24; i <= 56; i++) {
soapy12312 0:8b6686f2d4be 167 positions[i][44] = 1;
soapy12312 0:8b6686f2d4be 168 positions[i][92] = 1;
soapy12312 0:8b6686f2d4be 169 }
soapy12312 0:8b6686f2d4be 170
soapy12312 0:8b6686f2d4be 171 for (int j = 44; j <= 92; j++) {
soapy12312 0:8b6686f2d4be 172 positions[48][j] = 1;
soapy12312 0:8b6686f2d4be 173 positions[80][j] = 1;
soapy12312 0:8b6686f2d4be 174 }
soapy12312 0:8b6686f2d4be 175
soapy12312 0:8b6686f2d4be 176 for (int i = 4; i <= 48; i++) {
soapy12312 0:8b6686f2d4be 177 positions[i][68] = 1;
soapy12312 0:8b6686f2d4be 178 }
soapy12312 0:8b6686f2d4be 179
soapy12312 0:8b6686f2d4be 180 for (int i = 56; i <= 72; i++) {
soapy12312 0:8b6686f2d4be 181 positions[i][28] = 1;
soapy12312 0:8b6686f2d4be 182 positions[i][108] = 1;
soapy12312 0:8b6686f2d4be 183 }
soapy12312 0:8b6686f2d4be 184
soapy12312 0:8b6686f2d4be 185 for (int i = 72; i <= 120; i++) {
soapy12312 0:8b6686f2d4be 186 positions[i][20] = 1;
soapy12312 0:8b6686f2d4be 187 positions[i][116] = 1;
soapy12312 0:8b6686f2d4be 188 }
soapy12312 0:8b6686f2d4be 189
soapy12312 0:8b6686f2d4be 190 for (int i = 72; i <= 104; i++) {
soapy12312 0:8b6686f2d4be 191 positions[i][44] = 1;
soapy12312 0:8b6686f2d4be 192 positions[i][92] = 1;
soapy12312 0:8b6686f2d4be 193 }
soapy12312 0:8b6686f2d4be 194
soapy12312 0:8b6686f2d4be 195 for (int i = 104; i <= 120; i++) {
soapy12312 0:8b6686f2d4be 196 positions[i][36] = 1;
soapy12312 0:8b6686f2d4be 197 positions[i][100] = 1;
soapy12312 0:8b6686f2d4be 198 }
soapy12312 0:8b6686f2d4be 199
soapy12312 0:8b6686f2d4be 200 for (int i = 48; i <= 80; i++) {
soapy12312 0:8b6686f2d4be 201 positions[i][60] = 1;
soapy12312 0:8b6686f2d4be 202 positions[i][76] = 1;
soapy12312 0:8b6686f2d4be 203 }
soapy12312 0:8b6686f2d4be 204
soapy12312 0:8b6686f2d4be 205 for (int i = 80; i <= 124; i++) {
soapy12312 0:8b6686f2d4be 206 positions[i][68] = 1;
soapy12312 0:8b6686f2d4be 207 }
soapy12312 0:8b6686f2d4be 208
soapy12312 0:8b6686f2d4be 209 for (int j = 100; j <= 116; j++) {
soapy12312 0:8b6686f2d4be 210 positions[8][j] = 1;
soapy12312 0:8b6686f2d4be 211 positions[120][j] = 1;
soapy12312 0:8b6686f2d4be 212 }
soapy12312 0:8b6686f2d4be 213
soapy12312 0:8b6686f2d4be 214 for (int j = 92; j <= 116; j++) {
soapy12312 0:8b6686f2d4be 215 positions[56][j] = 1;
soapy12312 0:8b6686f2d4be 216 positions[72][j] = 1;
soapy12312 0:8b6686f2d4be 217 }
soapy12312 0:8b6686f2d4be 218
soapy12312 0:8b6686f2d4be 219 // Set valid positions of the pac dots
soapy12312 0:8b6686f2d4be 220 pacDots = -40;
soapy12312 0:8b6686f2d4be 221 bigPacDots = 4;
soapy12312 0:8b6686f2d4be 222
soapy12312 0:8b6686f2d4be 223 for (int i = 0; i < 128; i++) {
soapy12312 0:8b6686f2d4be 224 for (int j = 0; j < 128; j++) {
soapy12312 0:8b6686f2d4be 225 if (positions[i][j] == 1) {
soapy12312 0:8b6686f2d4be 226 if ((i % 4 == 0) && (j % 4 == 0)) {
soapy12312 0:8b6686f2d4be 227 uLCD.pixel(i, j, YELLOW);
soapy12312 0:8b6686f2d4be 228 pacDots++;
soapy12312 0:8b6686f2d4be 229 positions[i][j] = 2;
soapy12312 0:8b6686f2d4be 230 }
soapy12312 0:8b6686f2d4be 231 }
soapy12312 0:8b6686f2d4be 232 }
soapy12312 0:8b6686f2d4be 233 }
soapy12312 0:8b6686f2d4be 234
soapy12312 0:8b6686f2d4be 235 uLCD.rectangle(48, 60, 80, 76, BLACK);
soapy12312 0:8b6686f2d4be 236 uLCD.line(48, 46, 48, 91, BLACK);
soapy12312 0:8b6686f2d4be 237 uLCD.line(80, 46, 80, 91, BLACK);
soapy12312 0:8b6686f2d4be 238 uLCD.line(58, 108, 70, 108, BLACK);
soapy12312 0:8b6686f2d4be 239
soapy12312 0:8b6686f2d4be 240 for (int i = 48; i <= 80; i++) {
soapy12312 0:8b6686f2d4be 241 for (int j = 45; j < 91; j++) {
soapy12312 0:8b6686f2d4be 242 if (positions[i][j] == 2) {
soapy12312 0:8b6686f2d4be 243 positions[i][j] = 1;
soapy12312 0:8b6686f2d4be 244 }
soapy12312 0:8b6686f2d4be 245 }
soapy12312 0:8b6686f2d4be 246 }
soapy12312 0:8b6686f2d4be 247
soapy12312 0:8b6686f2d4be 248 uLCD.filled_circle(8, 100, 1, YELLOW);
soapy12312 0:8b6686f2d4be 249 positions[8][100] = 3;
soapy12312 0:8b6686f2d4be 250 uLCD.filled_circle(120, 100, 1, YELLOW);
soapy12312 0:8b6686f2d4be 251 positions[120][100] = 3;
soapy12312 0:8b6686f2d4be 252 uLCD.filled_circle(8, 36, 1, YELLOW);
soapy12312 0:8b6686f2d4be 253 positions[8][36] = 3;
soapy12312 0:8b6686f2d4be 254 uLCD.filled_circle(120, 36, 1, YELLOW);
soapy12312 0:8b6686f2d4be 255 positions[120][36] = 3;
soapy12312 0:8b6686f2d4be 256 }
soapy12312 0:8b6686f2d4be 257
soapy12312 0:8b6686f2d4be 258 // Redraw the current pac dot locations
soapy12312 0:8b6686f2d4be 259 void redrawPacDots() {
soapy12312 0:8b6686f2d4be 260 for (int i = 4; i <= 124; i++) {
soapy12312 0:8b6686f2d4be 261 for (int j = 20; j <= 116; j++) {
soapy12312 0:8b6686f2d4be 262 if (positions[i][j] == 2) {
soapy12312 0:8b6686f2d4be 263 uLCD.pixel(i, j, YELLOW);
soapy12312 0:8b6686f2d4be 264 } else if (positions[i][j] == 3) {
soapy12312 0:8b6686f2d4be 265 uLCD.filled_circle(i, j, 1, YELLOW);
soapy12312 0:8b6686f2d4be 266 }
soapy12312 0:8b6686f2d4be 267 }
soapy12312 0:8b6686f2d4be 268 }
soapy12312 0:8b6686f2d4be 269
soapy12312 0:8b6686f2d4be 270 uLCD.pixel(64, 108, BLACK);
soapy12312 0:8b6686f2d4be 271 }
soapy12312 0:8b6686f2d4be 272 };