Classic Snake game for RETRO

Dependencies:   mbed

Committer:
Architect
Date:
Mon Jan 12 20:23:34 2015 +0000
Revision:
1:52a4c894086e
Parent:
0:5160597f3364
Removed USBDevice since it is not needed

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