Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Game/Game.cpp@3:c61d0c70eda4, 2020-05-26 (annotated)
- Committer:
- ale_carb0ni
- Date:
- Tue May 26 16:52:17 2020 +0000
- Revision:
- 3:c61d0c70eda4
- Parent:
- 2:7fa08670b1fc
- Child:
- 4:17d5b53b8815
fast snake, working good
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ale_carb0ni | 2:7fa08670b1fc | 1 | #include "Game.h" |
ale_carb0ni | 2:7fa08670b1fc | 2 | #include "mbed.h" |
ale_carb0ni | 2:7fa08670b1fc | 3 | #include "Gamepad.h" |
ale_carb0ni | 2:7fa08670b1fc | 4 | #include "N5110.h" |
ale_carb0ni | 2:7fa08670b1fc | 5 | #include "Menu.h" |
ale_carb0ni | 2:7fa08670b1fc | 6 | |
ale_carb0ni | 2:7fa08670b1fc | 7 | |
ale_carb0ni | 2:7fa08670b1fc | 8 | Game::Game() |
ale_carb0ni | 2:7fa08670b1fc | 9 | { |
ale_carb0ni | 2:7fa08670b1fc | 10 | x = 4; |
ale_carb0ni | 2:7fa08670b1fc | 11 | y = 4; |
ale_carb0ni | 2:7fa08670b1fc | 12 | for (int i = 0; i < 16; i++) { |
ale_carb0ni | 2:7fa08670b1fc | 13 | fruitX[i] = 3 + i*5; |
ale_carb0ni | 2:7fa08670b1fc | 14 | } |
ale_carb0ni | 2:7fa08670b1fc | 15 | for (int i = 0; i < 9; i++) { |
ale_carb0ni | 2:7fa08670b1fc | 16 | fruitY[i] = 3 + i*5; |
ale_carb0ni | 2:7fa08670b1fc | 17 | } |
ale_carb0ni | 2:7fa08670b1fc | 18 | score = 0; |
ale_carb0ni | 2:7fa08670b1fc | 19 | a = 0; //used to select the direction based ont what button is pressed |
ale_carb0ni | 2:7fa08670b1fc | 20 | ntail = 0; //used to increase lenght of the tail |
ale_carb0ni | 2:7fa08670b1fc | 21 | k = 0; |
ale_carb0ni | 2:7fa08670b1fc | 22 | rx = rand() % 16; |
ale_carb0ni | 2:7fa08670b1fc | 23 | ry = rand() % 9; |
ale_carb0ni | 2:7fa08670b1fc | 24 | fruitX1 = fruitX[rx]+1; |
ale_carb0ni | 2:7fa08670b1fc | 25 | fruitY1 = fruitY[ry]+1; |
ale_carb0ni | 2:7fa08670b1fc | 26 | x_pos.push_back(4); |
ale_carb0ni | 2:7fa08670b1fc | 27 | y_pos.push_back(4); |
ale_carb0ni | 2:7fa08670b1fc | 28 | } |
ale_carb0ni | 2:7fa08670b1fc | 29 | |
ale_carb0ni | 2:7fa08670b1fc | 30 | void Game::movement(Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 31 | { |
ale_carb0ni | 2:7fa08670b1fc | 32 | if (pad.Y_held() && !(a == 2)) { |
ale_carb0ni | 2:7fa08670b1fc | 33 | a = 1; |
ale_carb0ni | 2:7fa08670b1fc | 34 | } |
ale_carb0ni | 2:7fa08670b1fc | 35 | if (pad.A_held() && !(a == 1)) { |
ale_carb0ni | 2:7fa08670b1fc | 36 | a = 2; |
ale_carb0ni | 2:7fa08670b1fc | 37 | } |
ale_carb0ni | 2:7fa08670b1fc | 38 | if (pad.X_held() && !(a == 4)) { |
ale_carb0ni | 2:7fa08670b1fc | 39 | a = 3; |
ale_carb0ni | 2:7fa08670b1fc | 40 | } |
ale_carb0ni | 2:7fa08670b1fc | 41 | if (pad.B_held() && !(a == 3)) { |
ale_carb0ni | 2:7fa08670b1fc | 42 | a = 4; |
ale_carb0ni | 2:7fa08670b1fc | 43 | } |
ale_carb0ni | 2:7fa08670b1fc | 44 | if (a == 1) { |
ale_carb0ni | 2:7fa08670b1fc | 45 | x += -5; |
ale_carb0ni | 2:7fa08670b1fc | 46 | //wait(0.25); |
ale_carb0ni | 2:7fa08670b1fc | 47 | } |
ale_carb0ni | 2:7fa08670b1fc | 48 | if (a == 2) { |
ale_carb0ni | 2:7fa08670b1fc | 49 | x += 5; |
ale_carb0ni | 2:7fa08670b1fc | 50 | //wait(0.25); |
ale_carb0ni | 2:7fa08670b1fc | 51 | } |
ale_carb0ni | 2:7fa08670b1fc | 52 | if (a == 3) { |
ale_carb0ni | 2:7fa08670b1fc | 53 | y += -5; |
ale_carb0ni | 2:7fa08670b1fc | 54 | //wait(0.25); |
ale_carb0ni | 2:7fa08670b1fc | 55 | } |
ale_carb0ni | 2:7fa08670b1fc | 56 | if (a == 4) { |
ale_carb0ni | 2:7fa08670b1fc | 57 | y += 5; |
ale_carb0ni | 2:7fa08670b1fc | 58 | //wait(0.25); |
ale_carb0ni | 2:7fa08670b1fc | 59 | } |
ale_carb0ni | 2:7fa08670b1fc | 60 | |
ale_carb0ni | 2:7fa08670b1fc | 61 | int prevX = x_pos[0]; |
ale_carb0ni | 2:7fa08670b1fc | 62 | int prevY = y_pos[0]; |
ale_carb0ni | 2:7fa08670b1fc | 63 | |
ale_carb0ni | 2:7fa08670b1fc | 64 | x_pos[0] = x; |
ale_carb0ni | 2:7fa08670b1fc | 65 | y_pos[0] = y; |
ale_carb0ni | 2:7fa08670b1fc | 66 | |
ale_carb0ni | 2:7fa08670b1fc | 67 | if (!(ntail + 1 == x_pos.size())) { |
ale_carb0ni | 2:7fa08670b1fc | 68 | x_pos.push_back(x_pos[ntail - 1]); |
ale_carb0ni | 2:7fa08670b1fc | 69 | y_pos.push_back(y_pos[ntail - 1]); |
ale_carb0ni | 2:7fa08670b1fc | 70 | } |
ale_carb0ni | 2:7fa08670b1fc | 71 | |
ale_carb0ni | 2:7fa08670b1fc | 72 | if (x_pos.size() > 0) { |
ale_carb0ni | 2:7fa08670b1fc | 73 | for (int i = 0; i < x_pos.size() - 1; i++) { |
ale_carb0ni | 2:7fa08670b1fc | 74 | x_pos[x_pos.size() - i - 1] = x_pos[x_pos.size() - i - 2]; |
ale_carb0ni | 2:7fa08670b1fc | 75 | y_pos[y_pos.size() - i - 1] = y_pos[y_pos.size() - i - 2]; |
ale_carb0ni | 2:7fa08670b1fc | 76 | } |
ale_carb0ni | 2:7fa08670b1fc | 77 | x_pos[1] = prevX; |
ale_carb0ni | 2:7fa08670b1fc | 78 | y_pos[1] = prevY; |
ale_carb0ni | 2:7fa08670b1fc | 79 | } |
ale_carb0ni | 2:7fa08670b1fc | 80 | } |
ale_carb0ni | 2:7fa08670b1fc | 81 | |
ale_carb0ni | 3:c61d0c70eda4 | 82 | int Game::death(N5110 &lcd,Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 83 | { |
ale_carb0ni | 2:7fa08670b1fc | 84 | if (x < 1 || x > WIDTH-2) { //if you hit the side walls you die |
ale_carb0ni | 2:7fa08670b1fc | 85 | while (1) { |
ale_carb0ni | 2:7fa08670b1fc | 86 | gameover(lcd, pad); |
ale_carb0ni | 2:7fa08670b1fc | 87 | if (pad.B_held()) { |
ale_carb0ni | 3:c61d0c70eda4 | 88 | return 2; |
ale_carb0ni | 2:7fa08670b1fc | 89 | } |
ale_carb0ni | 2:7fa08670b1fc | 90 | if (pad.start_held()) { |
ale_carb0ni | 3:c61d0c70eda4 | 91 | return 1; |
ale_carb0ni | 2:7fa08670b1fc | 92 | } |
ale_carb0ni | 2:7fa08670b1fc | 93 | } |
ale_carb0ni | 2:7fa08670b1fc | 94 | } |
ale_carb0ni | 2:7fa08670b1fc | 95 | |
ale_carb0ni | 2:7fa08670b1fc | 96 | if (y < 1 || y > HEIGHT) { //if you hit the top or bottom walls you die |
ale_carb0ni | 2:7fa08670b1fc | 97 | while (1) { |
ale_carb0ni | 2:7fa08670b1fc | 98 | gameover(lcd, pad); |
ale_carb0ni | 2:7fa08670b1fc | 99 | if (pad.B_held()) { |
ale_carb0ni | 3:c61d0c70eda4 | 100 | return 2; |
ale_carb0ni | 2:7fa08670b1fc | 101 | } |
ale_carb0ni | 2:7fa08670b1fc | 102 | if (pad.start_held()) { |
ale_carb0ni | 3:c61d0c70eda4 | 103 | return 1; |
ale_carb0ni | 2:7fa08670b1fc | 104 | } |
ale_carb0ni | 2:7fa08670b1fc | 105 | } |
ale_carb0ni | 2:7fa08670b1fc | 106 | } |
ale_carb0ni | 2:7fa08670b1fc | 107 | for (int i = 1; i < x_pos.size(); i++) { //if you hit your tail you die |
ale_carb0ni | 2:7fa08670b1fc | 108 | if (x_pos[0] == x_pos[i] && y_pos[0] == y_pos[i]) { |
ale_carb0ni | 2:7fa08670b1fc | 109 | while (1) { |
ale_carb0ni | 2:7fa08670b1fc | 110 | gameover(lcd, pad); |
ale_carb0ni | 2:7fa08670b1fc | 111 | if (pad.B_held()) { |
ale_carb0ni | 3:c61d0c70eda4 | 112 | return 2; |
ale_carb0ni | 2:7fa08670b1fc | 113 | } |
ale_carb0ni | 2:7fa08670b1fc | 114 | if (pad.start_held()) { |
ale_carb0ni | 3:c61d0c70eda4 | 115 | return 1; |
ale_carb0ni | 2:7fa08670b1fc | 116 | } |
ale_carb0ni | 2:7fa08670b1fc | 117 | } |
ale_carb0ni | 2:7fa08670b1fc | 118 | } |
ale_carb0ni | 2:7fa08670b1fc | 119 | } |
ale_carb0ni | 3:c61d0c70eda4 | 120 | return 0; |
ale_carb0ni | 2:7fa08670b1fc | 121 | } |
ale_carb0ni | 2:7fa08670b1fc | 122 | |
ale_carb0ni | 2:7fa08670b1fc | 123 | void Game::draw(N5110 &lcd,Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 124 | { |
ale_carb0ni | 2:7fa08670b1fc | 125 | lcd.clear(); |
ale_carb0ni | 2:7fa08670b1fc | 126 | lcd.drawRect(1,1,WIDTH-2,HEIGHT-1,FILL_TRANSPARENT); //rectangle around border of field |
ale_carb0ni | 2:7fa08670b1fc | 127 | lcd.drawRect(fruitX[rx],fruitY[ry],3,3,FILL_BLACK); //fruit on the field |
ale_carb0ni | 2:7fa08670b1fc | 128 | lcd.drawCircle(x,y,2,FILL_TRANSPARENT); //initial snake design |
ale_carb0ni | 2:7fa08670b1fc | 129 | //printf("size of vector %d\n", x_pos.size()); |
ale_carb0ni | 2:7fa08670b1fc | 130 | for (k = 1; k <= ntail; k++) { |
ale_carb0ni | 2:7fa08670b1fc | 131 | lcd.drawCircle(x_pos[k],y_pos[k],2,FILL_TRANSPARENT); |
ale_carb0ni | 2:7fa08670b1fc | 132 | //printf("draw \n"); |
ale_carb0ni | 2:7fa08670b1fc | 133 | } |
ale_carb0ni | 2:7fa08670b1fc | 134 | //printf("/////////////// \n"); |
ale_carb0ni | 2:7fa08670b1fc | 135 | //printf("Fruit x coordinate: %d\n", fruitX1); |
ale_carb0ni | 2:7fa08670b1fc | 136 | //printf("Fruit y coordinate: %d\n", fruitY1); |
ale_carb0ni | 2:7fa08670b1fc | 137 | //printf("Snake x: %d\n", x); |
ale_carb0ni | 2:7fa08670b1fc | 138 | //printf("Snake y: %d\n", y); |
ale_carb0ni | 2:7fa08670b1fc | 139 | //printf("seg1 x: %d\n", x_pos[1]); |
ale_carb0ni | 2:7fa08670b1fc | 140 | //printf("seg1 y: %d\n", y_pos[1]); |
ale_carb0ni | 2:7fa08670b1fc | 141 | lcd.refresh(); |
ale_carb0ni | 2:7fa08670b1fc | 142 | } |
ale_carb0ni | 2:7fa08670b1fc | 143 | |
ale_carb0ni | 2:7fa08670b1fc | 144 | void Game::gameover(N5110 &lcd,Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 145 | { |
ale_carb0ni | 2:7fa08670b1fc | 146 | lcd.clear(); |
ale_carb0ni | 2:7fa08670b1fc | 147 | //while (1) { |
ale_carb0ni | 2:7fa08670b1fc | 148 | lcd.printString("GAME OVER",WIDTH/2-25,0); |
ale_carb0ni | 2:7fa08670b1fc | 149 | sprintf (buffer, "Score: %d",score); |
ale_carb0ni | 2:7fa08670b1fc | 150 | lcd.printString(buffer,WIDTH/2-26,2); |
ale_carb0ni | 2:7fa08670b1fc | 151 | lcd.printString("TO PLAY AGAIN",3,4); |
ale_carb0ni | 2:7fa08670b1fc | 152 | lcd.printString("PRESS B",17,5); |
ale_carb0ni | 2:7fa08670b1fc | 153 | pad.leds_on(); |
ale_carb0ni | 2:7fa08670b1fc | 154 | wait(0.1); |
ale_carb0ni | 2:7fa08670b1fc | 155 | pad.leds_off(); |
ale_carb0ni | 2:7fa08670b1fc | 156 | wait(0.1); |
ale_carb0ni | 2:7fa08670b1fc | 157 | pad.tone(500.0,1); |
ale_carb0ni | 2:7fa08670b1fc | 158 | lcd.refresh(); |
ale_carb0ni | 2:7fa08670b1fc | 159 | wait(1/6); |
ale_carb0ni | 2:7fa08670b1fc | 160 | // if ( _pad.B_held()) { |
ale_carb0ni | 2:7fa08670b1fc | 161 | //break; |
ale_carb0ni | 2:7fa08670b1fc | 162 | //} |
ale_carb0ni | 2:7fa08670b1fc | 163 | //} |
ale_carb0ni | 2:7fa08670b1fc | 164 | /*wait(1/6); |
ale_carb0ni | 2:7fa08670b1fc | 165 | _lcd.clear(); |
ale_carb0ni | 2:7fa08670b1fc | 166 | //_menu.menu_screen(); |
ale_carb0ni | 2:7fa08670b1fc | 167 | _lcd.refresh(); |
ale_carb0ni | 2:7fa08670b1fc | 168 | wait(1/6);*/ |
ale_carb0ni | 2:7fa08670b1fc | 169 | } |
ale_carb0ni | 2:7fa08670b1fc | 170 | |
ale_carb0ni | 2:7fa08670b1fc | 171 | void Game::point(N5110 &lcd,Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 172 | { |
ale_carb0ni | 2:7fa08670b1fc | 173 | if (x == fruitX1 && y == fruitY1) { //if central coordinate of the snake head is equal to the central coordinate of the food: |
ale_carb0ni | 2:7fa08670b1fc | 174 | //printf("Snake x: %d\n", x); |
ale_carb0ni | 2:7fa08670b1fc | 175 | //printf("Snake y: %d\n", y); |
ale_carb0ni | 2:7fa08670b1fc | 176 | //printf("seg1 x: %d\n", x_pos[1]); |
ale_carb0ni | 2:7fa08670b1fc | 177 | //printf("seg1 y: %d\n", y_pos[1]); |
ale_carb0ni | 2:7fa08670b1fc | 178 | //printf("Fruit x coordinate: %d\n", fruitX1); |
ale_carb0ni | 2:7fa08670b1fc | 179 | //printf("Fruit y coordinate: %d\n", fruitY1); |
ale_carb0ni | 2:7fa08670b1fc | 180 | score = score + 10; |
ale_carb0ni | 2:7fa08670b1fc | 181 | pad.tone(750.0,1); |
ale_carb0ni | 2:7fa08670b1fc | 182 | rx = rand() % 16; //generates a new random coordinate for the food |
ale_carb0ni | 2:7fa08670b1fc | 183 | ry = rand() % 9; |
ale_carb0ni | 2:7fa08670b1fc | 184 | //printf("rx: %d\n", rx); |
ale_carb0ni | 2:7fa08670b1fc | 185 | //printf("ry: %d\n", ry); |
ale_carb0ni | 2:7fa08670b1fc | 186 | fruitX1 = fruitX[rx]+1; |
ale_carb0ni | 2:7fa08670b1fc | 187 | fruitY1 = fruitY[ry]+1; |
ale_carb0ni | 2:7fa08670b1fc | 188 | for (int i = 0; i < x_pos.size(); i++) { |
ale_carb0ni | 2:7fa08670b1fc | 189 | if (fruitX1 == x_pos[i] && fruitY1 == y_pos[i]) { |
ale_carb0ni | 2:7fa08670b1fc | 190 | rx = rand() % 16; |
ale_carb0ni | 2:7fa08670b1fc | 191 | ry = rand() % 9; |
ale_carb0ni | 2:7fa08670b1fc | 192 | fruitX1 = fruitX[rx]+1; |
ale_carb0ni | 2:7fa08670b1fc | 193 | fruitY1 = fruitY[ry]+1; |
ale_carb0ni | 2:7fa08670b1fc | 194 | } |
ale_carb0ni | 2:7fa08670b1fc | 195 | } |
ale_carb0ni | 2:7fa08670b1fc | 196 | ntail++; |
ale_carb0ni | 2:7fa08670b1fc | 197 | lcd.drawRect(fruitX[rx],fruitY[ry],3,3,FILL_BLACK); |
ale_carb0ni | 2:7fa08670b1fc | 198 | //_lcd.refresh(); |
ale_carb0ni | 2:7fa08670b1fc | 199 | //wait(1/6); |
ale_carb0ni | 2:7fa08670b1fc | 200 | } |
ale_carb0ni | 2:7fa08670b1fc | 201 | } |