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 Sam Thys

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?

UserRevisionLine numberNew 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(&center_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 }