Classic Snake game for RETRO

Dependencies:   mbed

Committer:
Architect
Date:
Mon Jan 12 20:18:06 2015 +0000
Revision:
0:5160597f3364
Child:
1:52a4c894086e
Initial check-in for the classic Snake game

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Architect 0:5160597f3364 1 #include "mbed.h"
Architect 0:5160597f3364 2 #include "DisplayN18.h"
Architect 0:5160597f3364 3 #include "Timer.h"
Architect 0:5160597f3364 4 #include "USBSerial.h"
Architect 0:5160597f3364 5
Architect 0:5160597f3364 6 //Display is 128x160
Architect 0:5160597f3364 7 #define SQUARE_SIZE 3
Architect 0:5160597f3364 8 #define COLUMNS 40
Architect 0:5160597f3364 9 #define ROWS 32
Architect 0:5160597f3364 10
Architect 0:5160597f3364 11 USBSerial serial;
Architect 0:5160597f3364 12
Architect 0:5160597f3364 13 DigitalIn left(P0_14, PullUp);
Architect 0:5160597f3364 14 DigitalIn right(P0_11, PullUp);
Architect 0:5160597f3364 15 DigitalIn down(P0_12, PullUp);
Architect 0:5160597f3364 16 DigitalIn up(P0_13, PullUp);
Architect 0:5160597f3364 17 DigitalIn square(P0_16, PullUp);
Architect 0:5160597f3364 18 DigitalIn circle(P0_1, PullUp);
Architect 0:5160597f3364 19
Architect 0:5160597f3364 20 DisplayN18 disp;
Architect 0:5160597f3364 21
Architect 0:5160597f3364 22 char width = 160;
Architect 0:5160597f3364 23 char height = 128;
Architect 0:5160597f3364 24
Architect 0:5160597f3364 25 short snake_body[256];
Architect 0:5160597f3364 26 short snake_length = 3;
Architect 0:5160597f3364 27
Architect 0:5160597f3364 28 char LEFT = 0;
Architect 0:5160597f3364 29 char RIGHT = 1;
Architect 0:5160597f3364 30 char UP = 2;
Architect 0:5160597f3364 31 char DOWN = 3;
Architect 0:5160597f3364 32
Architect 0:5160597f3364 33 char snake_direction = LEFT;
Architect 0:5160597f3364 34
Architect 0:5160597f3364 35 char bonus_x, bonus_y;
Architect 0:5160597f3364 36
Architect 0:5160597f3364 37 unsigned long loopStartTime = 0;
Architect 0:5160597f3364 38
Architect 0:5160597f3364 39 void checkButtons()
Architect 0:5160597f3364 40 {
Architect 0:5160597f3364 41 int buttonState = left.read();
Architect 0:5160597f3364 42
Architect 0:5160597f3364 43 if( buttonState == 0 )
Architect 0:5160597f3364 44 {
Architect 0:5160597f3364 45 snake_direction = LEFT;
Architect 0:5160597f3364 46
Architect 0:5160597f3364 47 return;
Architect 0:5160597f3364 48 }
Architect 0:5160597f3364 49
Architect 0:5160597f3364 50 buttonState = right.read();
Architect 0:5160597f3364 51
Architect 0:5160597f3364 52
Architect 0:5160597f3364 53 if( buttonState == 0 )
Architect 0:5160597f3364 54 {
Architect 0:5160597f3364 55 snake_direction = RIGHT;
Architect 0:5160597f3364 56
Architect 0:5160597f3364 57 return;
Architect 0:5160597f3364 58 }
Architect 0:5160597f3364 59
Architect 0:5160597f3364 60 buttonState = up.read();
Architect 0:5160597f3364 61
Architect 0:5160597f3364 62
Architect 0:5160597f3364 63 if( buttonState == 0 )
Architect 0:5160597f3364 64 {
Architect 0:5160597f3364 65 snake_direction = UP;
Architect 0:5160597f3364 66
Architect 0:5160597f3364 67 return;
Architect 0:5160597f3364 68 }
Architect 0:5160597f3364 69
Architect 0:5160597f3364 70 buttonState = down.read();
Architect 0:5160597f3364 71
Architect 0:5160597f3364 72
Architect 0:5160597f3364 73 if( buttonState == 0 )
Architect 0:5160597f3364 74 {
Architect 0:5160597f3364 75 snake_direction = DOWN;
Architect 0:5160597f3364 76
Architect 0:5160597f3364 77
Architect 0:5160597f3364 78 return;
Architect 0:5160597f3364 79 }
Architect 0:5160597f3364 80
Architect 0:5160597f3364 81 buttonState = square.read();
Architect 0:5160597f3364 82
Architect 0:5160597f3364 83 if( buttonState == 0 )
Architect 0:5160597f3364 84 {
Architect 0:5160597f3364 85
Architect 0:5160597f3364 86 }
Architect 0:5160597f3364 87
Architect 0:5160597f3364 88 }
Architect 0:5160597f3364 89
Architect 0:5160597f3364 90 bool move_snake()
Architect 0:5160597f3364 91 {
Architect 0:5160597f3364 92 //"Erase" tale here
Architect 0:5160597f3364 93 disp.fillRect( (snake_body[snake_length - 1] >> 8) * (SQUARE_SIZE + 1) , (snake_body[snake_length - 1] & 0x00FF)* (SQUARE_SIZE + 1) , SQUARE_SIZE, SQUARE_SIZE, DisplayN18::rgbToShort(0, 0, 0));
Architect 0:5160597f3364 94
Architect 0:5160597f3364 95 for (int i = snake_length - 1; i > 0; i--)
Architect 0:5160597f3364 96 snake_body[i] = snake_body[i-1];
Architect 0:5160597f3364 97
Architect 0:5160597f3364 98 int headX = snake_body[0]>>8;
Architect 0:5160597f3364 99 int headY = snake_body[0]&0x00FF;
Architect 0:5160597f3364 100
Architect 0:5160597f3364 101 switch (snake_direction)
Architect 0:5160597f3364 102 {
Architect 0:5160597f3364 103 case 0:
Architect 0:5160597f3364 104 headX -= 1;
Architect 0:5160597f3364 105 break;
Architect 0:5160597f3364 106 case 1:
Architect 0:5160597f3364 107 headX += 1;
Architect 0:5160597f3364 108 break;
Architect 0:5160597f3364 109 case 2:
Architect 0:5160597f3364 110 headY -= 1;
Architect 0:5160597f3364 111 break;
Architect 0:5160597f3364 112 case 3:
Architect 0:5160597f3364 113 headY += 1;
Architect 0:5160597f3364 114 break;
Architect 0:5160597f3364 115 }
Architect 0:5160597f3364 116
Architect 0:5160597f3364 117 if (headX < 0)
Architect 0:5160597f3364 118 headX = COLUMNS-1;
Architect 0:5160597f3364 119
Architect 0:5160597f3364 120 if (headX >= COLUMNS )
Architect 0:5160597f3364 121 headX = 0;
Architect 0:5160597f3364 122
Architect 0:5160597f3364 123 if (headY < 0)
Architect 0:5160597f3364 124 headY = ROWS-1;
Architect 0:5160597f3364 125
Architect 0:5160597f3364 126 if (headY >= ROWS)
Architect 0:5160597f3364 127 headY = 0;
Architect 0:5160597f3364 128
Architect 0:5160597f3364 129 snake_body[0] = headX<<8|headY;
Architect 0:5160597f3364 130
Architect 0:5160597f3364 131 for (int i = 1; i < snake_length - 1; i++)
Architect 0:5160597f3364 132 {
Architect 0:5160597f3364 133 if (headX == (snake_body[i]>>8) && headY == (snake_body[i] & 0x00FF))
Architect 0:5160597f3364 134 return true;
Architect 0:5160597f3364 135 }
Architect 0:5160597f3364 136
Architect 0:5160597f3364 137 return false;
Architect 0:5160597f3364 138 }
Architect 0:5160597f3364 139
Architect 0:5160597f3364 140 void new_bonus()
Architect 0:5160597f3364 141 {
Architect 0:5160597f3364 142 bonus_x = rand()%COLUMNS;
Architect 0:5160597f3364 143 bonus_y = rand()%ROWS;
Architect 0:5160597f3364 144 }
Architect 0:5160597f3364 145
Architect 0:5160597f3364 146 void draw_snake()
Architect 0:5160597f3364 147 {
Architect 0:5160597f3364 148 char x, y;
Architect 0:5160597f3364 149 for( int i = 0; i< snake_length; i++ )
Architect 0:5160597f3364 150 {
Architect 0:5160597f3364 151 x= (snake_body[i] >> 8) * (SQUARE_SIZE + 1);
Architect 0:5160597f3364 152 y= (snake_body[i] & 0x00FF)* (SQUARE_SIZE + 1);
Architect 0:5160597f3364 153 disp.fillRect( x , y , SQUARE_SIZE, SQUARE_SIZE, DisplayN18::Yellow);
Architect 0:5160597f3364 154 }
Architect 0:5160597f3364 155 }
Architect 0:5160597f3364 156
Architect 0:5160597f3364 157 void draw_bonus()
Architect 0:5160597f3364 158 {
Architect 0:5160597f3364 159 disp.fillRect( bonus_x*(SQUARE_SIZE+1) , bonus_y*(SQUARE_SIZE+1) , SQUARE_SIZE, SQUARE_SIZE, DisplayN18::rgbToShort(0, 0, 255));
Architect 0:5160597f3364 160 }
Architect 0:5160597f3364 161
Architect 0:5160597f3364 162 void render()
Architect 0:5160597f3364 163 {
Architect 0:5160597f3364 164 draw_snake();
Architect 0:5160597f3364 165 draw_bonus();
Architect 0:5160597f3364 166 }
Architect 0:5160597f3364 167
Architect 0:5160597f3364 168 void reset_game()
Architect 0:5160597f3364 169 {
Architect 0:5160597f3364 170 char startX = 15;
Architect 0:5160597f3364 171 char startY = 20;
Architect 0:5160597f3364 172
Architect 0:5160597f3364 173 snake_body[0] = startX << 8 | startY;
Architect 0:5160597f3364 174 snake_body[1] = (startX) << 8 | (startY+1);
Architect 0:5160597f3364 175 snake_body[2] = (startX) << 8 | (startY+2);
Architect 0:5160597f3364 176 snake_length = 3;
Architect 0:5160597f3364 177
Architect 0:5160597f3364 178 new_bonus();
Architect 0:5160597f3364 179
Architect 0:5160597f3364 180 loopStartTime = 0;
Architect 0:5160597f3364 181
Architect 0:5160597f3364 182 snake_direction = LEFT;
Architect 0:5160597f3364 183
Architect 0:5160597f3364 184 render();
Architect 0:5160597f3364 185 }
Architect 0:5160597f3364 186
Architect 0:5160597f3364 187
Architect 0:5160597f3364 188
Architect 0:5160597f3364 189 void clear_field()
Architect 0:5160597f3364 190 {
Architect 0:5160597f3364 191 char x, y;
Architect 0:5160597f3364 192 for( int i = 0; i< snake_length; i++ )
Architect 0:5160597f3364 193 {
Architect 0:5160597f3364 194 x= (snake_body[i] >> 8) * (SQUARE_SIZE + 1);
Architect 0:5160597f3364 195 y= (snake_body[i] & 0x00FF)* (SQUARE_SIZE + 1);
Architect 0:5160597f3364 196 disp.fillRect( x , y , SQUARE_SIZE, SQUARE_SIZE, DisplayN18::rgbToShort(0, 0, 0));
Architect 0:5160597f3364 197 }
Architect 0:5160597f3364 198
Architect 0:5160597f3364 199 disp.fillRect( bonus_x*(SQUARE_SIZE+1) , bonus_y*(SQUARE_SIZE+1) , SQUARE_SIZE, SQUARE_SIZE, DisplayN18::rgbToShort(0, 0, 0));
Architect 0:5160597f3364 200 }
Architect 0:5160597f3364 201
Architect 0:5160597f3364 202
Architect 0:5160597f3364 203 main()
Architect 0:5160597f3364 204 {
Architect 0:5160597f3364 205
Architect 0:5160597f3364 206
Architect 0:5160597f3364 207 AnalogIn ain(P0_15);
Architect 0:5160597f3364 208
Architect 0:5160597f3364 209 disp.clear();
Architect 0:5160597f3364 210
Architect 0:5160597f3364 211 DigitalOut led1(LED1, false);
Architect 0:5160597f3364 212
Architect 0:5160597f3364 213 srand(ain.read_u16());
Architect 0:5160597f3364 214
Architect 0:5160597f3364 215
Architect 0:5160597f3364 216 Timer timer;
Architect 0:5160597f3364 217
Architect 0:5160597f3364 218 timer.start();
Architect 0:5160597f3364 219
Architect 0:5160597f3364 220 int loopStartTime = timer.read_ms();
Architect 0:5160597f3364 221 while (true)
Architect 0:5160597f3364 222 {
Architect 0:5160597f3364 223 checkButtons();
Architect 0:5160597f3364 224 if( timer.read_ms() - loopStartTime > 200 )
Architect 0:5160597f3364 225 {
Architect 0:5160597f3364 226 if( move_snake() )
Architect 0:5160597f3364 227 {
Architect 0:5160597f3364 228 clear_field();
Architect 0:5160597f3364 229 reset_game();
Architect 0:5160597f3364 230 //return;
Architect 0:5160597f3364 231 }
Architect 0:5160597f3364 232
Architect 0:5160597f3364 233 int headX = snake_body[0]>>8;
Architect 0:5160597f3364 234 int headY = snake_body[0]&0x00FF;
Architect 0:5160597f3364 235
Architect 0:5160597f3364 236 if (headX == bonus_x && headY == bonus_y)
Architect 0:5160597f3364 237 {
Architect 0:5160597f3364 238 snake_body[snake_length++] = snake_body[snake_length-1];
Architect 0:5160597f3364 239 snake_body[snake_length++] = snake_body[snake_length-1];
Architect 0:5160597f3364 240
Architect 0:5160597f3364 241 new_bonus();
Architect 0:5160597f3364 242 }
Architect 0:5160597f3364 243 render();
Architect 0:5160597f3364 244
Architect 0:5160597f3364 245 loopStartTime = timer.read_ms();
Architect 0:5160597f3364 246 }
Architect 0:5160597f3364 247 }
Architect 0:5160597f3364 248 }
Architect 0:5160597f3364 249
Architect 0:5160597f3364 250