This is a slight mod of the source code uploaded by Sam Thys - https://os.mbed.com/users/sammekevremde/code/Snake/ Please check out the original project, this fork is only a hack of some working code to fix a few playability issues. See https://youtu.be/mUqJvReB1lg for a listing
Dependencies: C12832_lcd LM75B MMA7660 mbed
Fork of Snake by
main.cpp@1:544cd84315a5, 2018-07-08 (annotated)
- Committer:
- zaphodikus
- Date:
- Sun Jul 08 15:09:34 2018 +0000
- Revision:
- 1:544cd84315a5
- Parent:
- 0:b4eddf41d75b
renamed most variables to englich names; uses accelerometer and thermometer to generate a random seed; draws the fruit as a larger box; cuts out some un-necessary draw code;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
zaphodikus | 1:544cd84315a5 | 1 | // original sources Sam Thys - https://os.mbed.com/users/sammekevremde/code/Snake/ |
zaphodikus | 1:544cd84315a5 | 2 | // modified by: zaphodikus Jul 2018 |
zaphodikus | 1:544cd84315a5 | 3 | // uses thermometer and accelerometer on the LPC7760 to generate random |
zaphodikus | 1:544cd84315a5 | 4 | // fruit positions |
sammekevremde | 0:b4eddf41d75b | 5 | #include "mbed.h" |
sammekevremde | 0:b4eddf41d75b | 6 | #include "C12832_lcd.h" |
zaphodikus | 1:544cd84315a5 | 7 | #include "LM75B.h" |
zaphodikus | 1:544cd84315a5 | 8 | #include "MMA7660.h" |
sammekevremde | 0:b4eddf41d75b | 9 | |
zaphodikus | 1:544cd84315a5 | 10 | MMA7660 MMA(p28,p27); // accelerometer |
sammekevremde | 0:b4eddf41d75b | 11 | C12832_LCD lcd; |
zaphodikus | 1:544cd84315a5 | 12 | Ticker gameticker; |
zaphodikus | 1:544cd84315a5 | 13 | LM75B tmp(p28,p27); // I2C Temperature Sensor |
zaphodikus | 1:544cd84315a5 | 14 | |
sammekevremde | 0:b4eddf41d75b | 15 | //-- Variable -- |
zaphodikus | 1:544cd84315a5 | 16 | enum direction { up, down, left, right, null}; |
zaphodikus | 1:544cd84315a5 | 17 | enum gamemode { start,stop,run,pause}; |
zaphodikus | 1:544cd84315a5 | 18 | direction currentdirection; |
zaphodikus | 1:544cd84315a5 | 19 | direction lastdirection; |
sammekevremde | 0:b4eddf41d75b | 20 | gamemode game; |
sammekevremde | 0:b4eddf41d75b | 21 | // -- Classes -- |
zaphodikus | 1:544cd84315a5 | 22 | struct point |
sammekevremde | 0:b4eddf41d75b | 23 | { |
sammekevremde | 0:b4eddf41d75b | 24 | int x; |
sammekevremde | 0:b4eddf41d75b | 25 | int y; |
sammekevremde | 0:b4eddf41d75b | 26 | }; |
sammekevremde | 0:b4eddf41d75b | 27 | //--------------------- |
zaphodikus | 1:544cd84315a5 | 28 | struct point snakeHead; |
zaphodikus | 1:544cd84315a5 | 29 | struct point fruit; |
zaphodikus | 1:544cd84315a5 | 30 | int countFruit=0; |
zaphodikus | 1:544cd84315a5 | 31 | float board_temp; |
sammekevremde | 0:b4eddf41d75b | 32 | |
zaphodikus | 1:544cd84315a5 | 33 | point* snakeBody=new point[countFruit+5]; |
sammekevremde | 0:b4eddf41d75b | 34 | // -- I/O setting -- |
zaphodikus | 1:544cd84315a5 | 35 | InterruptIn upHandler(p12); |
zaphodikus | 1:544cd84315a5 | 36 | InterruptIn downHandler(p15); |
zaphodikus | 1:544cd84315a5 | 37 | InterruptIn leftHandler(p13); |
zaphodikus | 1:544cd84315a5 | 38 | InterruptIn rightHandler(p16); |
zaphodikus | 1:544cd84315a5 | 39 | InterruptIn centerHandler(p14); |
zaphodikus | 1:544cd84315a5 | 40 | |
zaphodikus | 1:544cd84315a5 | 41 | // -- Functions -- |
sammekevremde | 0:b4eddf41d75b | 42 | |
zaphodikus | 1:544cd84315a5 | 43 | void placeFruit() |
sammekevremde | 0:b4eddf41d75b | 44 | { |
zaphodikus | 1:544cd84315a5 | 45 | board_temp = tmp; |
zaphodikus | 1:544cd84315a5 | 46 | |
zaphodikus | 1:544cd84315a5 | 47 | int data[3]; |
zaphodikus | 1:544cd84315a5 | 48 | MMA.readData((int*)&data); |
zaphodikus | 1:544cd84315a5 | 49 | srand(data[0]*192 + data[1]*192 + data[2]*192 + board_temp*2048); |
zaphodikus | 1:544cd84315a5 | 50 | fruit.x = rand() % 126 +1; |
zaphodikus | 1:544cd84315a5 | 51 | fruit.y = rand() % 30 +1; |
sammekevremde | 0:b4eddf41d75b | 52 | } |
sammekevremde | 0:b4eddf41d75b | 53 | |
zaphodikus | 1:544cd84315a5 | 54 | void direction_up() |
sammekevremde | 0:b4eddf41d75b | 55 | { |
zaphodikus | 1:544cd84315a5 | 56 | if ( currentdirection!=down) |
zaphodikus | 1:544cd84315a5 | 57 | currentdirection=up; |
sammekevremde | 0:b4eddf41d75b | 58 | } |
zaphodikus | 1:544cd84315a5 | 59 | void direction_down() |
sammekevremde | 0:b4eddf41d75b | 60 | { |
zaphodikus | 1:544cd84315a5 | 61 | if ( currentdirection!=up) |
zaphodikus | 1:544cd84315a5 | 62 | currentdirection=down; |
sammekevremde | 0:b4eddf41d75b | 63 | } |
zaphodikus | 1:544cd84315a5 | 64 | void direction_left() |
sammekevremde | 0:b4eddf41d75b | 65 | { |
zaphodikus | 1:544cd84315a5 | 66 | if ( currentdirection!=right) |
zaphodikus | 1:544cd84315a5 | 67 | currentdirection=left; |
sammekevremde | 0:b4eddf41d75b | 68 | } |
zaphodikus | 1:544cd84315a5 | 69 | void direction_right() |
sammekevremde | 0:b4eddf41d75b | 70 | { |
zaphodikus | 1:544cd84315a5 | 71 | if ( currentdirection!=left) |
zaphodikus | 1:544cd84315a5 | 72 | currentdirection=right; |
sammekevremde | 0:b4eddf41d75b | 73 | } |
zaphodikus | 1:544cd84315a5 | 74 | |
zaphodikus | 1:544cd84315a5 | 75 | void center_button() |
sammekevremde | 0:b4eddf41d75b | 76 | { |
zaphodikus | 1:544cd84315a5 | 77 | if (game==pause) |
zaphodikus | 1:544cd84315a5 | 78 | { |
zaphodikus | 1:544cd84315a5 | 79 | currentdirection=lastdirection; |
zaphodikus | 1:544cd84315a5 | 80 | game=run; |
zaphodikus | 1:544cd84315a5 | 81 | } |
zaphodikus | 1:544cd84315a5 | 82 | else if (game==run) |
zaphodikus | 1:544cd84315a5 | 83 | { |
zaphodikus | 1:544cd84315a5 | 84 | lastdirection=currentdirection; |
zaphodikus | 1:544cd84315a5 | 85 | currentdirection=null; |
zaphodikus | 1:544cd84315a5 | 86 | game=pause; |
zaphodikus | 1:544cd84315a5 | 87 | } |
zaphodikus | 1:544cd84315a5 | 88 | else if (game==stop) |
zaphodikus | 1:544cd84315a5 | 89 | { |
zaphodikus | 1:544cd84315a5 | 90 | for (int i=0;i<=4;i++) |
sammekevremde | 0:b4eddf41d75b | 91 | { |
zaphodikus | 1:544cd84315a5 | 92 | snakeBody[i].x=(snakeHead.x)-(i+1); |
zaphodikus | 1:544cd84315a5 | 93 | snakeBody[i].y=15; |
sammekevremde | 0:b4eddf41d75b | 94 | } |
zaphodikus | 1:544cd84315a5 | 95 | currentdirection=null; |
zaphodikus | 1:544cd84315a5 | 96 | game=run; |
zaphodikus | 1:544cd84315a5 | 97 | } |
sammekevremde | 0:b4eddf41d75b | 98 | } |
zaphodikus | 1:544cd84315a5 | 99 | |
zaphodikus | 1:544cd84315a5 | 100 | void tickHandler() |
sammekevremde | 0:b4eddf41d75b | 101 | { |
sammekevremde | 0:b4eddf41d75b | 102 | |
sammekevremde | 0:b4eddf41d75b | 103 | if (game==run) |
sammekevremde | 0:b4eddf41d75b | 104 | { |
zaphodikus | 1:544cd84315a5 | 105 | if (currentdirection!=null) |
sammekevremde | 0:b4eddf41d75b | 106 | { |
zaphodikus | 1:544cd84315a5 | 107 | for (int j=(countFruit+4);j>=1;j--) |
zaphodikus | 1:544cd84315a5 | 108 | { |
zaphodikus | 1:544cd84315a5 | 109 | snakeBody[j]=snakeBody[j-1]; |
zaphodikus | 1:544cd84315a5 | 110 | } |
sammekevremde | 0:b4eddf41d75b | 111 | snakeBody[0]=snakeHead; |
sammekevremde | 0:b4eddf41d75b | 112 | } |
sammekevremde | 0:b4eddf41d75b | 113 | |
zaphodikus | 1:544cd84315a5 | 114 | switch (currentdirection) |
sammekevremde | 0:b4eddf41d75b | 115 | { |
zaphodikus | 1:544cd84315a5 | 116 | case up: |
sammekevremde | 0:b4eddf41d75b | 117 | snakeHead.y+=1; |
sammekevremde | 0:b4eddf41d75b | 118 | break; |
zaphodikus | 1:544cd84315a5 | 119 | case down: |
sammekevremde | 0:b4eddf41d75b | 120 | snakeHead.y-=1; |
sammekevremde | 0:b4eddf41d75b | 121 | break; |
zaphodikus | 1:544cd84315a5 | 122 | case left: |
sammekevremde | 0:b4eddf41d75b | 123 | snakeHead.x-=1; |
sammekevremde | 0:b4eddf41d75b | 124 | break; |
zaphodikus | 1:544cd84315a5 | 125 | case right: |
sammekevremde | 0:b4eddf41d75b | 126 | snakeHead.x+=1; |
sammekevremde | 0:b4eddf41d75b | 127 | break; |
sammekevremde | 0:b4eddf41d75b | 128 | |
zaphodikus | 1:544cd84315a5 | 129 | } |
sammekevremde | 0:b4eddf41d75b | 130 | |
sammekevremde | 0:b4eddf41d75b | 131 | if ((snakeHead.y == 0 ||snakeHead.y == 31 ||snakeHead.x == 127 ||snakeHead.x == 0) ) |
sammekevremde | 0:b4eddf41d75b | 132 | { |
sammekevremde | 0:b4eddf41d75b | 133 | lcd.cls(); |
sammekevremde | 0:b4eddf41d75b | 134 | lcd.locate(25,5); |
sammekevremde | 0:b4eddf41d75b | 135 | lcd.printf("Game Over!!"); |
sammekevremde | 0:b4eddf41d75b | 136 | lcd.locate(25,15); |
zaphodikus | 1:544cd84315a5 | 137 | lcd.printf("Score > %d",countFruit); |
zaphodikus | 1:544cd84315a5 | 138 | currentdirection=null; |
sammekevremde | 0:b4eddf41d75b | 139 | snakeHead.x=15; |
sammekevremde | 0:b4eddf41d75b | 140 | snakeHead.y=15; |
sammekevremde | 0:b4eddf41d75b | 141 | game=stop; |
zaphodikus | 1:544cd84315a5 | 142 | countFruit=0; |
sammekevremde | 0:b4eddf41d75b | 143 | } |
sammekevremde | 0:b4eddf41d75b | 144 | else if ((snakeHead.y == fruit.y )&& (snakeHead.x == fruit.x) ) |
sammekevremde | 0:b4eddf41d75b | 145 | { |
zaphodikus | 1:544cd84315a5 | 146 | countFruit +=1; |
zaphodikus | 1:544cd84315a5 | 147 | placeFruit(); |
sammekevremde | 0:b4eddf41d75b | 148 | } |
sammekevremde | 0:b4eddf41d75b | 149 | else |
sammekevremde | 0:b4eddf41d75b | 150 | { |
sammekevremde | 0:b4eddf41d75b | 151 | lcd.cls(); |
zaphodikus | 1:544cd84315a5 | 152 | lcd.pixel(snakeHead.x,snakeHead.y,1); |
zaphodikus | 1:544cd84315a5 | 153 | lcd.copy_to_lcd(); |
zaphodikus | 1:544cd84315a5 | 154 | for(int k=0;k<=(countFruit +4);k++) |
zaphodikus | 1:544cd84315a5 | 155 | { |
zaphodikus | 1:544cd84315a5 | 156 | lcd.pixel(snakeBody[k].x,snakeBody[k].y,1); |
zaphodikus | 1:544cd84315a5 | 157 | } |
zaphodikus | 1:544cd84315a5 | 158 | lcd.pixel(fruit.x-1,fruit.y-1, 1); |
zaphodikus | 1:544cd84315a5 | 159 | lcd.pixel(fruit.x-1,fruit.y, 1); |
zaphodikus | 1:544cd84315a5 | 160 | lcd.pixel(fruit.x-1,fruit.y+1, 1); |
zaphodikus | 1:544cd84315a5 | 161 | lcd.pixel(fruit.x,fruit.y-1, 1); |
zaphodikus | 1:544cd84315a5 | 162 | lcd.pixel(fruit.x,fruit.y, 1); |
zaphodikus | 1:544cd84315a5 | 163 | lcd.pixel(fruit.x,fruit.y+1, 1); |
zaphodikus | 1:544cd84315a5 | 164 | lcd.pixel(fruit.x+1,fruit.y-1, 1); |
zaphodikus | 1:544cd84315a5 | 165 | lcd.pixel(fruit.x+1,fruit.y, 1); |
zaphodikus | 1:544cd84315a5 | 166 | lcd.pixel(fruit.x+1,fruit.y+1, 1); |
zaphodikus | 1:544cd84315a5 | 167 | lcd.rect(0,0, 127, 31, 1); |
zaphodikus | 1:544cd84315a5 | 168 | lcd.copy_to_lcd(); |
sammekevremde | 0:b4eddf41d75b | 169 | } |
sammekevremde | 0:b4eddf41d75b | 170 | |
zaphodikus | 1:544cd84315a5 | 171 | for (int a=0;a<=(countFruit +4);a++) |
zaphodikus | 1:544cd84315a5 | 172 | { |
sammekevremde | 0:b4eddf41d75b | 173 | if ( snakeBody[a].x==snakeHead.x && snakeBody[a].y==snakeHead.y) |
sammekevremde | 0:b4eddf41d75b | 174 | { |
sammekevremde | 0:b4eddf41d75b | 175 | lcd.cls(); |
sammekevremde | 0:b4eddf41d75b | 176 | lcd.locate(25,5); |
sammekevremde | 0:b4eddf41d75b | 177 | lcd.printf("Game Over!!"); |
sammekevremde | 0:b4eddf41d75b | 178 | lcd.locate(25,15); |
zaphodikus | 1:544cd84315a5 | 179 | lcd.printf("U score is %d",countFruit |
zaphodikus | 1:544cd84315a5 | 180 | ); |
zaphodikus | 1:544cd84315a5 | 181 | currentdirection=null; |
sammekevremde | 0:b4eddf41d75b | 182 | snakeHead.x=15; |
sammekevremde | 0:b4eddf41d75b | 183 | snakeHead.y=15; |
sammekevremde | 0:b4eddf41d75b | 184 | game=stop; |
zaphodikus | 1:544cd84315a5 | 185 | countFruit |
zaphodikus | 1:544cd84315a5 | 186 | =0; |
sammekevremde | 0:b4eddf41d75b | 187 | |
sammekevremde | 0:b4eddf41d75b | 188 | } |
zaphodikus | 1:544cd84315a5 | 189 | } |
sammekevremde | 0:b4eddf41d75b | 190 | } |
zaphodikus | 1:544cd84315a5 | 191 | else if (game==pause) |
zaphodikus | 1:544cd84315a5 | 192 | { |
zaphodikus | 1:544cd84315a5 | 193 | lcd.cls(); |
zaphodikus | 1:544cd84315a5 | 194 | lcd.locate(30,15); |
zaphodikus | 1:544cd84315a5 | 195 | lcd.printf("pause"); |
zaphodikus | 1:544cd84315a5 | 196 | } |
sammekevremde | 0:b4eddf41d75b | 197 | } |
sammekevremde | 0:b4eddf41d75b | 198 | |
sammekevremde | 0:b4eddf41d75b | 199 | |
sammekevremde | 0:b4eddf41d75b | 200 | //-------------------------------- |
sammekevremde | 0:b4eddf41d75b | 201 | int main() |
sammekevremde | 0:b4eddf41d75b | 202 | { |
zaphodikus | 1:544cd84315a5 | 203 | game=run; |
zaphodikus | 1:544cd84315a5 | 204 | lcd.rect(0, 0, 127, 31, 1); |
zaphodikus | 1:544cd84315a5 | 205 | lcd.copy_to_lcd(); |
zaphodikus | 1:544cd84315a5 | 206 | currentdirection=null; |
zaphodikus | 1:544cd84315a5 | 207 | snakeHead.x=15; |
zaphodikus | 1:544cd84315a5 | 208 | snakeHead.y=15; |
zaphodikus | 1:544cd84315a5 | 209 | for (int i=0;i<=4;i++) |
zaphodikus | 1:544cd84315a5 | 210 | { |
zaphodikus | 1:544cd84315a5 | 211 | snakeBody[i].x=(snakeHead.x)-(i+1); |
zaphodikus | 1:544cd84315a5 | 212 | snakeBody[i].y=15; |
zaphodikus | 1:544cd84315a5 | 213 | } |
zaphodikus | 1:544cd84315a5 | 214 | placeFruit(); |
zaphodikus | 1:544cd84315a5 | 215 | gameticker.attach(&tickHandler, 0.1); |
zaphodikus | 1:544cd84315a5 | 216 | // set interrupt handlers |
zaphodikus | 1:544cd84315a5 | 217 | upHandler.rise(&direction_up); |
zaphodikus | 1:544cd84315a5 | 218 | downHandler.rise(&direction_down); |
zaphodikus | 1:544cd84315a5 | 219 | leftHandler.rise(&direction_left); |
zaphodikus | 1:544cd84315a5 | 220 | rightHandler.rise(&direction_right); |
zaphodikus | 1:544cd84315a5 | 221 | centerHandler.rise(¢er_button); |
sammekevremde | 0:b4eddf41d75b | 222 | |
zaphodikus | 1:544cd84315a5 | 223 | while (1) |
zaphodikus | 1:544cd84315a5 | 224 | { |
sammekevremde | 0:b4eddf41d75b | 225 | |
zaphodikus | 1:544cd84315a5 | 226 | } |
sammekevremde | 0:b4eddf41d75b | 227 | } |