ECE 2035 AgarIO MiniProject

Dependencies:   4DGL-uLCD-SE ECE2035_Agar_Shell EthernetInterface Game_Synchronizer MMA8452 SDFileSystem Sound USBDevice mbed-rtos mbed wave_player

Fork of ECE2035_Agar_Shell by ECE2035 Spring 2015 TA

This program is a MiniProject given in ECE 2035. This is to design and program the multiplayer ethernet based AGAR.IO mbed game. Starting code is given by the instructor to aid student to complete the project. It utilize uLCD, Accelerometer, pushbuttons, sdFileSystem, ethernetBreakoutBoard, speaker in mBED LPC1768. It uses the similar concept to the Game http://agar.io/

Committer:
pkoirala3
Date:
Sat Mar 18 14:55:51 2017 +0000
Revision:
1:e487713a5231
Parent:
0:9d6ea88b6d14
EC 2035 MiniProject AGARIO

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jford38 0:9d6ea88b6d14 1 // Student Side Shell Code
pkoirala3 1:e487713a5231 2 // By: Prana Koirala
pkoirala3 1:e487713a5231 3 // ECE 2035
pkoirala3 1:e487713a5231 4 // AGAR.GT Game
jford38 0:9d6ea88b6d14 5 // For the baseline, anywhere you see ***, you have code to write.
jford38 0:9d6ea88b6d14 6
jford38 0:9d6ea88b6d14 7 #include "mbed.h"
jford38 0:9d6ea88b6d14 8 #include "SDFileSystem.h"
jford38 0:9d6ea88b6d14 9 #include "wave_player.h"
jford38 0:9d6ea88b6d14 10 #include "game_synchronizer.h"
jford38 0:9d6ea88b6d14 11 #include "misc.h"
jford38 0:9d6ea88b6d14 12 #include "blob.h"
pkoirala3 1:e487713a5231 13 #include "playSound.h"
pkoirala3 1:e487713a5231 14 #include "uLCD_4DGL.h"
pkoirala3 1:e487713a5231 15 #include "TMP36.h"
pkoirala3 1:e487713a5231 16
jford38 0:9d6ea88b6d14 17
jford38 0:9d6ea88b6d14 18 #define NUM_BLOBS 22
jford38 0:9d6ea88b6d14 19
jford38 0:9d6ea88b6d14 20 DigitalOut led1(LED1);
jford38 0:9d6ea88b6d14 21 DigitalOut led2(LED2);
jford38 0:9d6ea88b6d14 22 DigitalOut led3(LED3);
jford38 0:9d6ea88b6d14 23 DigitalOut led4(LED4);
jford38 0:9d6ea88b6d14 24
pkoirala3 1:e487713a5231 25 DigitalOut RedLED(p15);
pkoirala3 1:e487713a5231 26 DigitalOut GreenLED(p14);
pkoirala3 1:e487713a5231 27 DigitalOut BlueLED(p13);
pkoirala3 1:e487713a5231 28
jford38 0:9d6ea88b6d14 29 DigitalIn pb_u(p21); // Up Button
jford38 0:9d6ea88b6d14 30 DigitalIn pb_r(p22); // Right Button
jford38 0:9d6ea88b6d14 31 DigitalIn pb_d(p23); // Down Button
jford38 0:9d6ea88b6d14 32 DigitalIn pb_l(p24); // Left Button
pkoirala3 1:e487713a5231 33 TMP36 TEMP(p15);
pkoirala3 1:e487713a5231 34 char hitTune[] = "/sd/score.wav"; // identifies a blob being eaten
jford38 0:9d6ea88b6d14 35
jford38 0:9d6ea88b6d14 36 Serial pc(USBTX, USBRX); // Serial connection to PC. Useful for debugging!
jford38 0:9d6ea88b6d14 37 MMA8452 acc(p28, p27, 100000); // Accelerometer (SDA, SCL, Baudrate)
jford38 0:9d6ea88b6d14 38 uLCD_4DGL uLCD(p9,p10,p11); // LCD (tx, rx, reset)
jford38 0:9d6ea88b6d14 39 SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD (mosi, miso, sck, cs)
jford38 0:9d6ea88b6d14 40 AnalogOut DACout(p18); // speaker
jford38 0:9d6ea88b6d14 41 wave_player player(&DACout); // wav player
jford38 0:9d6ea88b6d14 42 GSYNC game_synchronizer; // Game_Synchronizer
jford38 0:9d6ea88b6d14 43 GSYNC* sync = &game_synchronizer; //
jford38 0:9d6ea88b6d14 44 Timer frame_timer; // Timer
jford38 0:9d6ea88b6d14 45
jford38 0:9d6ea88b6d14 46 int score1 = 0; // Player 1's score.
jford38 0:9d6ea88b6d14 47 int score2 = 0; // Player 2's score.
pkoirala3 1:e487713a5231 48 int num_player = 0;
pkoirala3 1:e487713a5231 49 int const time_unit = 1000; // time for screen refresh
jford38 0:9d6ea88b6d14 50
jford38 0:9d6ea88b6d14 51
pkoirala3 1:e487713a5231 52 void display_Temp(void)
pkoirala3 1:e487713a5231 53 {
pkoirala3 1:e487713a5231 54 float V = TEMP; // Displaying Temp of chip so that player can quit game and cool it.
pkoirala3 1:e487713a5231 55 uLCD.printf("\n\n\n\n\n\n\n\nTemp:%4.1F Deg F\n",V);
pkoirala3 1:e487713a5231 56 }
pkoirala3 1:e487713a5231 57
pkoirala3 1:e487713a5231 58
pkoirala3 1:e487713a5231 59 // This Display the game menu on the player 1 mbed to give option to play in single or multiplayer mode.
pkoirala3 1:e487713a5231 60 // They can use up and down button to make choice, some sound effect added.
pkoirala3 1:e487713a5231 61
pkoirala3 1:e487713a5231 62 int game_menu(void)
pkoirala3 1:e487713a5231 63 {
pkoirala3 1:e487713a5231 64 uLCD.set_font(FONT_8X12);
jford38 0:9d6ea88b6d14 65 uLCD.background_color(BGRD_COL);
jford38 0:9d6ea88b6d14 66 uLCD.textbackground_color(BGRD_COL);
jford38 0:9d6ea88b6d14 67 uLCD.cls();
jford38 0:9d6ea88b6d14 68 uLCD.locate(0,0);
pkoirala3 1:e487713a5231 69 uLCD.puts("Welcome to Agar");
pkoirala3 1:e487713a5231 70 uLCD.printf("\n\n");
pkoirala3 1:e487713a5231 71 wait(2.0);
pkoirala3 1:e487713a5231 72 uLCD.printf("Loading Game...");
pkoirala3 1:e487713a5231 73 uLCD.printf("\n\n\n\n\n\n");
pkoirala3 1:e487713a5231 74 wait(3.0);
pkoirala3 1:e487713a5231 75 display_Temp();
pkoirala3 1:e487713a5231 76 BlueLED = 1;
jford38 0:9d6ea88b6d14 77
pkoirala3 1:e487713a5231 78 uLCD.cls();
pkoirala3 1:e487713a5231 79
pkoirala3 1:e487713a5231 80 // Print single player or multiplayer mode. Depending which button is pressed, return either SINGLE_PLAYER or MULTI_PLAYER.
pkoirala3 1:e487713a5231 81 uLCD.set_font(FONT_7X8);
pkoirala3 1:e487713a5231 82 uLCD.printf("Select Mode:\n\n");
pkoirala3 1:e487713a5231 83 uLCD.printf("1P:Press up btn\n\n");
pkoirala3 1:e487713a5231 84 uLCD.printf("2P:Press down btn\n");
pkoirala3 1:e487713a5231 85 display_Temp();
pkoirala3 1:e487713a5231 86 int Mode = 0;
jford38 0:9d6ea88b6d14 87 while(1) {
pkoirala3 1:e487713a5231 88 if(!pb_u) {
pkoirala3 1:e487713a5231 89 Mode = SINGLE_PLAYER;
pkoirala3 1:e487713a5231 90 break;
pkoirala3 1:e487713a5231 91 }
pkoirala3 1:e487713a5231 92 if(!pb_d) {
pkoirala3 1:e487713a5231 93 Mode = MULTI_PLAYER;
pkoirala3 1:e487713a5231 94 break;
pkoirala3 1:e487713a5231 95 }
jford38 0:9d6ea88b6d14 96 }
pkoirala3 1:e487713a5231 97 return Mode;
jford38 0:9d6ea88b6d14 98 }
jford38 0:9d6ea88b6d14 99
pkoirala3 1:e487713a5231 100 // Initialize the game hardware.
pkoirala3 1:e487713a5231 101 // Call game_menu to find out which mode to play the game in (Single or MultiPlayer)
jford38 0:9d6ea88b6d14 102 // Initialize the game synchronizer.
pkoirala3 1:e487713a5231 103 void game_init(void)
pkoirala3 1:e487713a5231 104 {
pkoirala3 1:e487713a5231 105 led1 = 0;
pkoirala3 1:e487713a5231 106 led2 = 0;
pkoirala3 1:e487713a5231 107 led3 = 0;
pkoirala3 1:e487713a5231 108 led4 = 0;
pkoirala3 1:e487713a5231 109
jford38 0:9d6ea88b6d14 110 pb_u.mode(PullUp);
pkoirala3 1:e487713a5231 111 pb_r.mode(PullUp);
pkoirala3 1:e487713a5231 112 pb_d.mode(PullUp);
jford38 0:9d6ea88b6d14 113 pb_l.mode(PullUp);
pkoirala3 1:e487713a5231 114
jford38 0:9d6ea88b6d14 115 pc.printf("\033[2J\033[0;0H"); // Clear the terminal screen.
jford38 0:9d6ea88b6d14 116 pc.printf("I'm alive! Player 1\n"); // Let us know you made it this far
jford38 0:9d6ea88b6d14 117
jford38 0:9d6ea88b6d14 118 // game_menu MUST return either SINGLE_PLAYER or MULTI_PLAYER
pkoirala3 1:e487713a5231 119 int num_player = game_menu();
pkoirala3 1:e487713a5231 120
pkoirala3 1:e487713a5231 121 GS_init(sync, &uLCD, &acc, &pb_u, &pb_r, &pb_d, &pb_l, num_player, PLAYER1); // Connect to the other player.
pkoirala3 1:e487713a5231 122
jford38 0:9d6ea88b6d14 123 pc.printf("Initialized...\n"); // Let us know you finished initializing.
jford38 0:9d6ea88b6d14 124 srand(time(NULL)); // Seed the random number generator.
jford38 0:9d6ea88b6d14 125
jford38 0:9d6ea88b6d14 126 GS_cls(sync, SCREEN_BOTH);
jford38 0:9d6ea88b6d14 127 GS_update(sync);
jford38 0:9d6ea88b6d14 128 }
jford38 0:9d6ea88b6d14 129
pkoirala3 1:e487713a5231 130 // Function for displaying the string
pkoirala3 1:e487713a5231 131 void prints_string(char* text, int x, int y, int backgrnd, int foregrnd, bool clr)
pkoirala3 1:e487713a5231 132 {
pkoirala3 1:e487713a5231 133 uLCD.background_color(backgrnd);
pkoirala3 1:e487713a5231 134 uLCD.textbackground_color(foregrnd);
pkoirala3 1:e487713a5231 135 uLCD.set_font(FONT_7X8);
pkoirala3 1:e487713a5231 136 if (clr == 1) {
pkoirala3 1:e487713a5231 137 uLCD.cls();
pkoirala3 1:e487713a5231 138 }
pkoirala3 1:e487713a5231 139 uLCD.locate(x,y);
pkoirala3 1:e487713a5231 140 uLCD.puts(text);
pkoirala3 1:e487713a5231 141 uLCD.printf("\n\n\n\n\n\n");
pkoirala3 1:e487713a5231 142 display_Temp();
pkoirala3 1:e487713a5231 143 }
pkoirala3 1:e487713a5231 144
pkoirala3 1:e487713a5231 145
jford38 0:9d6ea88b6d14 146 // Display who won!
pkoirala3 1:e487713a5231 147 int game_over(int winner)
pkoirala3 1:e487713a5231 148 {
pkoirala3 1:e487713a5231 149 if (winner == WINNER_P1) { // P1 wins
pkoirala3 1:e487713a5231 150 char P1_WIN[10] = "P1 Won";
pkoirala3 1:e487713a5231 151 prints_string(P1_WIN, 0, 0, BGRD_COL, RED, 0);
pkoirala3 1:e487713a5231 152 char buzzer[] = "/sd/won.wav";
pkoirala3 1:e487713a5231 153 playSound(buzzer); // Play the sound in the board
pkoirala3 1:e487713a5231 154
pkoirala3 1:e487713a5231 155 } else if (winner == WINNER_P2) { // P2 OR AI wins
pkoirala3 1:e487713a5231 156 if (num_player == SINGLE_PLAYER) { // AI wins
pkoirala3 1:e487713a5231 157 char AI_WIN[10] = "PC Won";
pkoirala3 1:e487713a5231 158 prints_string(AI_WIN, 0, 0, BGRD_COL, RED, 0);
pkoirala3 1:e487713a5231 159 char buzzer[] = "/sd/won.wav";
pkoirala3 1:e487713a5231 160 playSound(buzzer); // Play the sound in the board
pkoirala3 1:e487713a5231 161
pkoirala3 1:e487713a5231 162
pkoirala3 1:e487713a5231 163 } else { // P2 wins
pkoirala3 1:e487713a5231 164 char P2_WIN[10] = "P2 Won";
pkoirala3 1:e487713a5231 165 prints_string(P2_WIN, 0, 0, BGRD_COL, RED, 0);
pkoirala3 1:e487713a5231 166 char buzzer[] = "/sd/won.wav";
pkoirala3 1:e487713a5231 167 playSound(buzzer); // Play the sound in the board
pkoirala3 1:e487713a5231 168 }
pkoirala3 1:e487713a5231 169
pkoirala3 1:e487713a5231 170 } else if (winner == WINNER_TIE) { // Tied game
pkoirala3 1:e487713a5231 171 char NO_WIN[10] = "TIE";
pkoirala3 1:e487713a5231 172 prints_string(NO_WIN, 0, 0, BGRD_COL, RED, 0);
pkoirala3 1:e487713a5231 173 char buzzer[] = "/sd/won.wav";
pkoirala3 1:e487713a5231 174 playSound(buzzer); // Play the sound in the board
pkoirala3 1:e487713a5231 175
pkoirala3 1:e487713a5231 176 }
pkoirala3 1:e487713a5231 177 while(1) {
pkoirala3 1:e487713a5231 178 RedLED = 0;
pkoirala3 1:e487713a5231 179 wait(0.75);
pkoirala3 1:e487713a5231 180 RedLED = 1;
pkoirala3 1:e487713a5231 181
pkoirala3 1:e487713a5231 182 if(!pb_r) {
pkoirala3 1:e487713a5231 183 uLCD.printf("Loading new Game");
pkoirala3 1:e487713a5231 184 wait(1.5);
pkoirala3 1:e487713a5231 185 uLCD.cls();
pkoirala3 1:e487713a5231 186 uLCD.printf("\n\n\n\n\n\n\n\n\n");
pkoirala3 1:e487713a5231 187 display_Temp();
pkoirala3 1:e487713a5231 188 return(1);
pkoirala3 1:e487713a5231 189 }
pkoirala3 1:e487713a5231 190 }
jford38 0:9d6ea88b6d14 191 }
jford38 0:9d6ea88b6d14 192
jford38 0:9d6ea88b6d14 193 // Take in a pointer to the blobs array. Iterate over the array
jford38 0:9d6ea88b6d14 194 // and initialize each blob with BLOB_init(). Set the first blob to (for example) blue
jford38 0:9d6ea88b6d14 195 // and the second blob to (for example) red. Set the color(s) of the food blobs however you like.
jford38 0:9d6ea88b6d14 196 // Make the radius of the "player blobs" equal and larger than the radius of the "food blobs".
pkoirala3 1:e487713a5231 197 void generate_blobs(BLOB* blobs)
pkoirala3 1:e487713a5231 198 {
pkoirala3 1:e487713a5231 199 int sizePlayer = 15;
pkoirala3 1:e487713a5231 200 int sizeFood = 8;
pkoirala3 1:e487713a5231 201 for (int i = 0; i < NUM_BLOBS; i++) {
pkoirala3 1:e487713a5231 202 int rad = (i == PLAYER1 || i == PLAYER2) ? sizePlayer : sizeFood; // get the radius
pkoirala3 1:e487713a5231 203 int col = (i == PLAYER1 || i == PLAYER2) ? ((i == PLAYER1) ? P1_COL : P2_COL) : FOOD_COL; // get the color
pkoirala3 1:e487713a5231 204 BLOB_init(&blobs[i], rad, col); //void BLOB_init(BLOB* b, int rad, int color)
pkoirala3 1:e487713a5231 205 BLOB_print(blobs[i]);
pkoirala3 1:e487713a5231 206 }
jford38 0:9d6ea88b6d14 207 }
jford38 0:9d6ea88b6d14 208
jford38 0:9d6ea88b6d14 209
jford38 0:9d6ea88b6d14 210
pkoirala3 1:e487713a5231 211 int main (void)
pkoirala3 1:e487713a5231 212 {
pkoirala3 1:e487713a5231 213
pkoirala3 1:e487713a5231 214 Play_again: // Option to play again
pkoirala3 1:e487713a5231 215 int score1 = 0; // Player 1's score reseting
pkoirala3 1:e487713a5231 216 int score2 = 0; // Player 2's score reseting
pkoirala3 1:e487713a5231 217
jford38 0:9d6ea88b6d14 218 int* p1_buttons;
jford38 0:9d6ea88b6d14 219 int* p2_buttons;
pkoirala3 1:e487713a5231 220
jford38 0:9d6ea88b6d14 221 float ax1, ay1, az1;
jford38 0:9d6ea88b6d14 222 float ax2, ay2, az2;
pkoirala3 1:e487713a5231 223
pkoirala3 1:e487713a5231 224 float time_step = .01;
pkoirala3 1:e487713a5231 225
pkoirala3 1:e487713a5231 226 int rect_bl_x, rect_bl_y, rect_ur_x, rect_ur_y; // rect. boundary, bottom-left, top-right (x,y)
pkoirala3 1:e487713a5231 227 float blob_x, blob_y; // pos (x,y) for a blob
pkoirala3 1:e487713a5231 228
pkoirala3 1:e487713a5231 229
jford38 0:9d6ea88b6d14 230 // Ask the user to choose (via pushbuttons)
jford38 0:9d6ea88b6d14 231 // to play in single- or multi-player mode.
jford38 0:9d6ea88b6d14 232 // Use their choice to correctly initialize the game synchronizer.
pkoirala3 1:e487713a5231 233 game_init();
pkoirala3 1:e487713a5231 234
jford38 0:9d6ea88b6d14 235 // Keep an array of blobs. Use blob 0 for player 1 and
jford38 0:9d6ea88b6d14 236 // blob 1 for player 2.
jford38 0:9d6ea88b6d14 237 BLOB blobs[NUM_BLOBS];
pkoirala3 1:e487713a5231 238
jford38 0:9d6ea88b6d14 239 // Pass in a pointer to the blobs array. Iterate over the array
jford38 0:9d6ea88b6d14 240 // and initialize each blob with BLOB_init(). Set the radii and colors
jford38 0:9d6ea88b6d14 241 // anyway you see fit.
jford38 0:9d6ea88b6d14 242 generate_blobs(blobs);
pkoirala3 1:e487713a5231 243
jford38 0:9d6ea88b6d14 244
jford38 0:9d6ea88b6d14 245 while(true) {
pkoirala3 1:e487713a5231 246 GS_background_color(sync, SCREEN_BOTH, BGRD_COL); // paint background colors
pkoirala3 1:e487713a5231 247
jford38 0:9d6ea88b6d14 248 // In single-player, check to see if the player has eaten all other blobs.
jford38 0:9d6ea88b6d14 249 // In multi-player mode, check to see if the players have tied by eating half the food each.
jford38 0:9d6ea88b6d14 250 // ***
pkoirala3 1:e487713a5231 251 // check based on food eaten
pkoirala3 1:e487713a5231 252 if ((score1 + score2) >= (NUM_BLOBS-2) ) {
pkoirala3 1:e487713a5231 253 if (score1 > score2 && blobs[PLAYER1].valid == 1) {
pkoirala3 1:e487713a5231 254 // P1 wins
pkoirala3 1:e487713a5231 255 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 256 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 257 goto Play_again; // To play again
pkoirala3 1:e487713a5231 258 } else if (score2 > score1 && blobs[PLAYER2].valid == 1) {
pkoirala3 1:e487713a5231 259 //P2 || AI wins
pkoirala3 1:e487713a5231 260 game_over(WINNER_P2);
pkoirala3 1:e487713a5231 261 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 262 goto Play_again; // To play again
pkoirala3 1:e487713a5231 263 } else if (score1 == score2) {
pkoirala3 1:e487713a5231 264 // Tie game
pkoirala3 1:e487713a5231 265 game_over(WINNER_TIE);
pkoirala3 1:e487713a5231 266 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 267 goto Play_again; // To play again
pkoirala3 1:e487713a5231 268 }
pkoirala3 1:e487713a5231 269 }
pkoirala3 1:e487713a5231 270 // check based on eating other player
pkoirala3 1:e487713a5231 271 if (blobs[PLAYER2].valid == 0) {
pkoirala3 1:e487713a5231 272 // P1 wins
pkoirala3 1:e487713a5231 273 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 274 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 275 goto Play_again; // To play again
pkoirala3 1:e487713a5231 276 } else if (blobs[PLAYER1].valid == 0) {
pkoirala3 1:e487713a5231 277 // P2 || AI wins
pkoirala3 1:e487713a5231 278 game_over(WINNER_P2);
pkoirala3 1:e487713a5231 279 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 280 goto Play_again; // To play again
pkoirala3 1:e487713a5231 281 }
pkoirala3 1:e487713a5231 282
pkoirala3 1:e487713a5231 283
jford38 0:9d6ea88b6d14 284 // In both single- and multi-player modes, display the score(s) in an appropriate manner.
jford38 0:9d6ea88b6d14 285 // ***
pkoirala3 1:e487713a5231 286 if (num_player == SINGLE_PLAYER) {
pkoirala3 1:e487713a5231 287 // disp score top right of screen
pkoirala3 1:e487713a5231 288 char scoreBanner[40];
pkoirala3 1:e487713a5231 289 sprintf(scoreBanner,"Score:%d ", score1);
pkoirala3 1:e487713a5231 290 uLCD.background_color(BGRD_COL);
pkoirala3 1:e487713a5231 291 uLCD.textbackground_color(RED);//BGRD_COL);
pkoirala3 1:e487713a5231 292 uLCD.locate(10,0);
pkoirala3 1:e487713a5231 293 uLCD.puts(scoreBanner);
pkoirala3 1:e487713a5231 294
pkoirala3 1:e487713a5231 295 //GS_locate(sync, SCREEN_P1, 12,0); // GS_locate(GSYNC* gs, char screen, int x, int y)
pkoirala3 1:e487713a5231 296 //GS_puts(sync, SCREEN_P1, bannerScore, strlen(bannerScore)); // void GS_puts(GSYNC* gs, char screen, char* str, int strlen)
pkoirala3 1:e487713a5231 297 } else if (num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 298 // disp score top right of screen
pkoirala3 1:e487713a5231 299 char bannerScore[40];
pkoirala3 1:e487713a5231 300 sprintf(bannerScore,"MS: P1: %2d \n P2: %2d ", score1, score2);
pkoirala3 1:e487713a5231 301 GS_locate(sync, SCREEN_BOTH, 9,0); // GS_locate(GSYNC* gs, char screen, int x, int y)
pkoirala3 1:e487713a5231 302 GS_puts(sync, SCREEN_BOTH, bannerScore, sizeof(bannerScore)); // void GS_puts(GSYNC* gs, char screen, char* str, int strlen)
pkoirala3 1:e487713a5231 303 }
pkoirala3 1:e487713a5231 304
jford38 0:9d6ea88b6d14 305 // Use the game synchronizer API to get the button values from both players' mbeds.
jford38 0:9d6ea88b6d14 306 p1_buttons = GS_get_p1_buttons(sync);
jford38 0:9d6ea88b6d14 307 p2_buttons = GS_get_p2_buttons(sync);
pkoirala3 1:e487713a5231 308
jford38 0:9d6ea88b6d14 309 // Use the game synchronizer API to get the accelerometer values from both players' mbeds.
jford38 0:9d6ea88b6d14 310 GS_get_p1_accel_data(sync, &ax1, &ay1, &az1);
jford38 0:9d6ea88b6d14 311 GS_get_p2_accel_data(sync, &ax2, &ay2, &az2);
pkoirala3 1:e487713a5231 312
pkoirala3 1:e487713a5231 313
jford38 0:9d6ea88b6d14 314 // If the magnitude of the p1 x and/or y accelerometer values exceed ACC_THRESHOLD,
jford38 0:9d6ea88b6d14 315 // set the blob 0 velocities to be proportional to the accelerometer values.
jford38 0:9d6ea88b6d14 316 // If in multi-player mode and the magnitude of the p2 x and/or y accelerometer values exceed ACC_THRESHOLD,
jford38 0:9d6ea88b6d14 317 // set the blob 0 velocities to be proportional to the accelerometer values.
pkoirala3 1:e487713a5231 318 // ****/
pkoirala3 1:e487713a5231 319 float scalFact = 1000*(5/3)/(blobs[PLAYER1].rad * 0.5);
pkoirala3 1:e487713a5231 320 if (abs(ax1) >= ACC_THRESHOLD)
pkoirala3 1:e487713a5231 321 blobs[PLAYER1].vx = ax1 * scalFact;
pkoirala3 1:e487713a5231 322 else
pkoirala3 1:e487713a5231 323 blobs[PLAYER1].vx = 0;
pkoirala3 1:e487713a5231 324
pkoirala3 1:e487713a5231 325 if (abs(ay1) >= ACC_THRESHOLD)
pkoirala3 1:e487713a5231 326 blobs[PLAYER1].vy = ay1 * scalFact;
pkoirala3 1:e487713a5231 327 else
pkoirala3 1:e487713a5231 328 blobs[PLAYER1].vy = 0;
pkoirala3 1:e487713a5231 329
pkoirala3 1:e487713a5231 330
jford38 0:9d6ea88b6d14 331 // Undraw the world bounding rectangle (use BGRD_COL).
jford38 0:9d6ea88b6d14 332 // ***
pkoirala3 1:e487713a5231 333 rect_bl_x = 0 - blobs[PLAYER1].old_x;
pkoirala3 1:e487713a5231 334 rect_bl_y = 0 - blobs[PLAYER1].old_y;
pkoirala3 1:e487713a5231 335 rect_ur_x = WORLD_WIDTH - blobs[PLAYER1].old_x;
pkoirala3 1:e487713a5231 336 rect_ur_y = WORLD_HEIGHT - blobs[PLAYER1].old_y;
pkoirala3 1:e487713a5231 337 GS_rectangle(sync, SCREEN_P1, rect_bl_x, rect_bl_y, rect_ur_x, rect_ur_y, BGRD_COL);
pkoirala3 1:e487713a5231 338 // multi-player mode
pkoirala3 1:e487713a5231 339 if (num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 340 rect_bl_x = 0 - blobs[PLAYER2].old_x;
pkoirala3 1:e487713a5231 341 rect_bl_y = 0 - blobs[PLAYER2].old_y;
pkoirala3 1:e487713a5231 342 rect_ur_x = WORLD_WIDTH - blobs[PLAYER2].old_x;
pkoirala3 1:e487713a5231 343 rect_ur_y = WORLD_HEIGHT - blobs[PLAYER2].old_y;
pkoirala3 1:e487713a5231 344 GS_rectangle(sync, SCREEN_P2, rect_bl_x, rect_bl_y, rect_ur_x, rect_ur_y, BGRD_COL);
pkoirala3 1:e487713a5231 345 }
pkoirala3 1:e487713a5231 346
pkoirala3 1:e487713a5231 347
jford38 0:9d6ea88b6d14 348 // Loop over all blobs
jford38 0:9d6ea88b6d14 349 // ***
pkoirala3 1:e487713a5231 350 for (int i = 0; i < NUM_BLOBS; i++) {
jford38 0:9d6ea88b6d14 351 // ***
pkoirala3 1:e487713a5231 352 if (blobs[i].delete_now == 1) {
pkoirala3 1:e487713a5231 353 blob_x = blobs[i].posx - blobs[PLAYER1].old_x;
pkoirala3 1:e487713a5231 354 blob_y = blobs[i].posy - blobs[PLAYER1].old_y;
pkoirala3 1:e487713a5231 355 GS_circle(sync, SCREEN_P1, blob_x, blob_y, blobs[i].rad, BGRD_COL);
pkoirala3 1:e487713a5231 356 if (num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 357 blob_x = blobs[i].posx - blobs[PLAYER2].old_x;
pkoirala3 1:e487713a5231 358 blob_y = blobs[i].posy - blobs[PLAYER2].old_y;
pkoirala3 1:e487713a5231 359 GS_circle(sync, SCREEN_P2, blob_x, blob_y, blobs[i].rad, BGRD_COL);
pkoirala3 1:e487713a5231 360 }
pkoirala3 1:e487713a5231 361 blobs[i].delete_now = 0;
pkoirala3 1:e487713a5231 362 }
pkoirala3 1:e487713a5231 363
pkoirala3 1:e487713a5231 364
jford38 0:9d6ea88b6d14 365 // Use the blob positions and velocities, as well as the time_step to compute the new position of the blob.
jford38 0:9d6ea88b6d14 366 // ***
pkoirala3 1:e487713a5231 367
pkoirala3 1:e487713a5231 368 blobs[i].old_x = blobs[i].posx;
pkoirala3 1:e487713a5231 369 blobs[i].old_y = blobs[i].posy;
pkoirala3 1:e487713a5231 370 blobs[i].posx += blobs[i].vx * time_step;
pkoirala3 1:e487713a5231 371 blobs[i].posy += blobs[i].vy * time_step;
pkoirala3 1:e487713a5231 372
pkoirala3 1:e487713a5231 373
pkoirala3 1:e487713a5231 374
pkoirala3 1:e487713a5231 375 // If the current blob is blob 0, iterate over all blobs and check if they are close enough to eat or be eaten.
pkoirala3 1:e487713a5231 376 // In multi-player mode, if the player 0 blob is eaten, player 1 wins and vise versa.
pkoirala3 1:e487713a5231 377 // If blob 0 eats some food, increment score1.
jford38 0:9d6ea88b6d14 378 // ***
pkoirala3 1:e487713a5231 379 if (i == PLAYER1) {
pkoirala3 1:e487713a5231 380 for (int j = 1; j < NUM_BLOBS; j++) {
pkoirala3 1:e487713a5231 381 if (j == PLAYER1) continue; // skip self
pkoirala3 1:e487713a5231 382 if (blobs[j].valid == 0) continue; // skip invalid blobs
pkoirala3 1:e487713a5231 383 // get dist between two blobs
pkoirala3 1:e487713a5231 384 float dist2 = BLOB_dist2(blobs[i], blobs[j]);
pkoirala3 1:e487713a5231 385 if (sqrt(dist2) < blobs[i].rad) {
pkoirala3 1:e487713a5231 386 // danger zone, eat or be eaten
pkoirala3 1:e487713a5231 387 if (blobs[i].rad > blobs[j].rad) {
pkoirala3 1:e487713a5231 388 // P1 is bigger, so P1 eats
pkoirala3 1:e487713a5231 389 blobs[j].valid = 0; // eaten blob is now invalid
pkoirala3 1:e487713a5231 390 blobs[i].rad = blobs[i].rad + 4; // P1 inc. size and score
pkoirala3 1:e487713a5231 391 score1++; // ...
pkoirala3 1:e487713a5231 392 playSound(hitTune);
pkoirala3 1:e487713a5231 393 // undraw smaller sized blob
pkoirala3 1:e487713a5231 394 // void GS_circle(GSYNC* gs, char screen, int x , int y , int radius, int color)
pkoirala3 1:e487713a5231 395 GS_circle(sync, SCREEN_P1, 0, 0, (blobs[i].rad-1), BGRD_COL);
pkoirala3 1:e487713a5231 396 if (num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 397 blob_x = blobs[i].posx - blobs[PLAYER2].old_x;
pkoirala3 1:e487713a5231 398 blob_y = blobs[i].posy - blobs[PLAYER2].old_y;
pkoirala3 1:e487713a5231 399 // void GS_circle(GSYNC* gs, char screen, int x , int y , int radius, int color)
pkoirala3 1:e487713a5231 400 GS_circle(sync, SCREEN_P2, blob_x, blob_y, (blobs[i].rad-1), BGRD_COL);
pkoirala3 1:e487713a5231 401 }
pkoirala3 1:e487713a5231 402
pkoirala3 1:e487713a5231 403 if (j == PLAYER2 && num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 404 pc.printf("NOT HERE\n");
pkoirala3 1:e487713a5231 405 game_over(WINNER_P1); // P2 loses
pkoirala3 1:e487713a5231 406 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 407 goto Play_again; // To play again
pkoirala3 1:e487713a5231 408 }
pkoirala3 1:e487713a5231 409 } else if (blobs[i].rad < blobs[j].rad) {
pkoirala3 1:e487713a5231 410 // P1 is smaller, so P1 is eaten
pkoirala3 1:e487713a5231 411 blobs[i].valid = 0; // eaten blob is now invalid
pkoirala3 1:e487713a5231 412 game_over(WINNER_P2); // P2 || AI wins
pkoirala3 1:e487713a5231 413 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 414 goto Play_again; // To play again
pkoirala3 1:e487713a5231 415 }
pkoirala3 1:e487713a5231 416 }
pkoirala3 1:e487713a5231 417 }
pkoirala3 1:e487713a5231 418 }
pkoirala3 1:e487713a5231 419
jford38 0:9d6ea88b6d14 420 // If the current blob is blob 1 and we are playing in multi-player mode, iterate over all blobs and check
jford38 0:9d6ea88b6d14 421 // if they are close enough to eat or be eaten. In multi-player mode, if the player 1 blob is eaten, player 0 wins and vise versa.
jford38 0:9d6ea88b6d14 422 // If blob1 eats some food, increment score 2.
jford38 0:9d6ea88b6d14 423 // ***
pkoirala3 1:e487713a5231 424 if (i == PLAYER2) {
pkoirala3 1:e487713a5231 425 for (int j = 0; j < NUM_BLOBS; j++) {
pkoirala3 1:e487713a5231 426 if (j == PLAYER2) continue; // skip self
pkoirala3 1:e487713a5231 427 if (blobs[j].valid == 0) continue; // skip invalid blobs
pkoirala3 1:e487713a5231 428 // get dist between two blobs
pkoirala3 1:e487713a5231 429 float dist2 = BLOB_dist2(blobs[i], blobs[j]);
pkoirala3 1:e487713a5231 430 if (sqrt(dist2) < blobs[i].rad) {
pkoirala3 1:e487713a5231 431 if (blobs[i].rad > blobs[j].rad) {
pkoirala3 1:e487713a5231 432 blobs[j].valid = 0;
pkoirala3 1:e487713a5231 433 blobs[i].rad = blobs[i].rad + 4;
pkoirala3 1:e487713a5231 434 score2++;
pkoirala3 1:e487713a5231 435 playSound(hitTune);
pkoirala3 1:e487713a5231 436 GS_circle(sync, SCREEN_P2, 0, 0, (blobs[i].rad-1), BGRD_COL);
pkoirala3 1:e487713a5231 437 if (num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 438 blob_x = blobs[i].posx - blobs[PLAYER1].old_x;
pkoirala3 1:e487713a5231 439 blob_y = blobs[i].posy - blobs[PLAYER1].old_y;
pkoirala3 1:e487713a5231 440 GS_circle(sync, SCREEN_P1, blob_x, blob_y, (blobs[i].rad-1), BGRD_COL);
pkoirala3 1:e487713a5231 441 }
pkoirala3 1:e487713a5231 442
pkoirala3 1:e487713a5231 443 if (j == PLAYER1 && num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 444 game_over(WINNER_P2);
pkoirala3 1:e487713a5231 445 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 446 goto Play_again; // To play again
pkoirala3 1:e487713a5231 447 }
pkoirala3 1:e487713a5231 448 } else if (blobs[i].rad < blobs[j].rad) {
pkoirala3 1:e487713a5231 449 blobs[i].valid = 0;
pkoirala3 1:e487713a5231 450 if (j == PLAYER1 && num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 451 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 452 game_over(WINNER_P1);
pkoirala3 1:e487713a5231 453 goto Play_again; // To play again
pkoirala3 1:e487713a5231 454 }
pkoirala3 1:e487713a5231 455 }
pkoirala3 1:e487713a5231 456 }
pkoirala3 1:e487713a5231 457 }
pkoirala3 1:e487713a5231 458 }
pkoirala3 1:e487713a5231 459
pkoirala3 1:e487713a5231 460 BLOB_constrain2world(&blobs[i]);
pkoirala3 1:e487713a5231 461 }
pkoirala3 1:e487713a5231 462
jford38 0:9d6ea88b6d14 463 // Iterate over all blobs and draw them at their newly computed positions. Reference their positions to the player blobs.
jford38 0:9d6ea88b6d14 464 // That is, on screen 1, center the world on blob 0 and reference all blobs' position to that of blob 0.
jford38 0:9d6ea88b6d14 465 // On screen 2, center the world on blob 1 and reference all blobs' position tho that of blob 1.
jford38 0:9d6ea88b6d14 466 // ***
pkoirala3 1:e487713a5231 467 for (int i = 0; i < NUM_BLOBS; i++) {
pkoirala3 1:e487713a5231 468 if (blobs[i].valid == 1) {
pkoirala3 1:e487713a5231 469 blob_x = blobs[i].posx - blobs[PLAYER1].posx;
pkoirala3 1:e487713a5231 470 blob_y = blobs[i].posy - blobs[PLAYER1].posy;
pkoirala3 1:e487713a5231 471 GS_circle(sync, SCREEN_P1, blob_x, blob_y, blobs[i].rad, blobs[i].color);
pkoirala3 1:e487713a5231 472 if (num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 473 blob_x = blobs[i].posx - blobs[PLAYER2].posx;
pkoirala3 1:e487713a5231 474 blob_y = blobs[i].posy - blobs[PLAYER2].posy;
pkoirala3 1:e487713a5231 475 GS_circle(sync, SCREEN_P2, blob_x, blob_y, blobs[i].rad, blobs[i].color);
pkoirala3 1:e487713a5231 476 }
pkoirala3 1:e487713a5231 477 }
pkoirala3 1:e487713a5231 478 blobs[i].delete_now = 1;
pkoirala3 1:e487713a5231 479 }
pkoirala3 1:e487713a5231 480
pkoirala3 1:e487713a5231 481
jford38 0:9d6ea88b6d14 482 // Redraw the world boundary rectangle.
jford38 0:9d6ea88b6d14 483 // ***
pkoirala3 1:e487713a5231 484 rect_bl_x = 0 - blobs[PLAYER1].old_x;
pkoirala3 1:e487713a5231 485 rect_bl_y = 0 - blobs[PLAYER1].old_y;
pkoirala3 1:e487713a5231 486 rect_ur_x = WORLD_WIDTH - blobs[PLAYER1].old_x;
pkoirala3 1:e487713a5231 487 rect_ur_y = WORLD_HEIGHT - blobs[PLAYER1].old_y;
pkoirala3 1:e487713a5231 488 GS_rectangle(sync, SCREEN_P1, rect_bl_x, rect_bl_y, rect_ur_x, rect_ur_y, BORDER_COL);
pkoirala3 1:e487713a5231 489 // multi-player mode
pkoirala3 1:e487713a5231 490 if (num_player == MULTI_PLAYER) {
pkoirala3 1:e487713a5231 491 rect_bl_x = 0 - blobs[PLAYER2].posx;
pkoirala3 1:e487713a5231 492 rect_bl_y = 0 - blobs[PLAYER2].posy;
pkoirala3 1:e487713a5231 493 rect_ur_x = WORLD_WIDTH - blobs[PLAYER2].posx;
pkoirala3 1:e487713a5231 494 rect_ur_y = WORLD_HEIGHT - blobs[PLAYER2].posy;
pkoirala3 1:e487713a5231 495 GS_rectangle(sync, SCREEN_P2, rect_bl_x, rect_bl_y, rect_ur_x, rect_ur_y, BORDER_COL);
pkoirala3 1:e487713a5231 496 }
pkoirala3 1:e487713a5231 497
jford38 0:9d6ea88b6d14 498 // Update the screens by calling GS_update.
jford38 0:9d6ea88b6d14 499 GS_update(sync);
pkoirala3 1:e487713a5231 500
jford38 0:9d6ea88b6d14 501 led1 = p1_buttons[0] ^ p2_buttons[0];
jford38 0:9d6ea88b6d14 502 led2 = p1_buttons[1] ^ p2_buttons[1];
jford38 0:9d6ea88b6d14 503 led3 = p1_buttons[2] ^ p2_buttons[2];
jford38 0:9d6ea88b6d14 504 led4 = p1_buttons[3] ^ p2_buttons[3];
pkoirala3 1:e487713a5231 505 }
pkoirala3 1:e487713a5231 506
jford38 0:9d6ea88b6d14 507 }