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.
Snake/Snake.cpp@0:bc1d36f5f772, 2019-05-05 (annotated)
- Committer:
- VivianDu
- Date:
- Sun May 05 14:06:00 2019 +0000
- Revision:
- 0:bc1d36f5f772
- Child:
- 1:b34f1b9b2b62
version_change
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| VivianDu | 0:bc1d36f5f772 | 1 | #include "Snake.h" |
| VivianDu | 0:bc1d36f5f772 | 2 | |
| VivianDu | 0:bc1d36f5f772 | 3 | #define HEIGHT 48 |
| VivianDu | 0:bc1d36f5f772 | 4 | #define CEILING 8 |
| VivianDu | 0:bc1d36f5f772 | 5 | #define FLOOR 48 |
| VivianDu | 0:bc1d36f5f772 | 6 | #define WIDTH 84 |
| VivianDu | 0:bc1d36f5f772 | 7 | |
| VivianDu | 0:bc1d36f5f772 | 8 | |
| VivianDu | 0:bc1d36f5f772 | 9 | snakePart snek; |
| VivianDu | 0:bc1d36f5f772 | 10 | |
| VivianDu | 0:bc1d36f5f772 | 11 | |
| VivianDu | 0:bc1d36f5f772 | 12 | |
| VivianDu | 0:bc1d36f5f772 | 13 | Snake::Snake() |
| VivianDu | 0:bc1d36f5f772 | 14 | { |
| VivianDu | 0:bc1d36f5f772 | 15 | |
| VivianDu | 0:bc1d36f5f772 | 16 | } |
| VivianDu | 0:bc1d36f5f772 | 17 | Snake::~Snake() |
| VivianDu | 0:bc1d36f5f772 | 18 | { |
| VivianDu | 0:bc1d36f5f772 | 19 | |
| VivianDu | 0:bc1d36f5f772 | 20 | } |
| VivianDu | 0:bc1d36f5f772 | 21 | |
| VivianDu | 0:bc1d36f5f772 | 22 | |
| VivianDu | 0:bc1d36f5f772 | 23 | void Snake::init(int x, int y, int lenght, int _live){ |
| VivianDu | 0:bc1d36f5f772 | 24 | |
| VivianDu | 0:bc1d36f5f772 | 25 | startx=x; |
| VivianDu | 0:bc1d36f5f772 | 26 | starty=y; |
| VivianDu | 0:bc1d36f5f772 | 27 | |
| VivianDu | 0:bc1d36f5f772 | 28 | startl=lenght; |
| VivianDu | 0:bc1d36f5f772 | 29 | live=_live; |
| VivianDu | 0:bc1d36f5f772 | 30 | _length = lenght; |
| VivianDu | 0:bc1d36f5f772 | 31 | _food.init(); |
| VivianDu | 0:bc1d36f5f772 | 32 | |
| VivianDu | 0:bc1d36f5f772 | 33 | int lowerBound=_length; |
| VivianDu | 0:bc1d36f5f772 | 34 | for (int i=0;lowerBound>i;i++) |
| VivianDu | 0:bc1d36f5f772 | 35 | { |
| VivianDu | 0:bc1d36f5f772 | 36 | snek._x[i]=x+i; |
| VivianDu | 0:bc1d36f5f772 | 37 | snek._y[i]=y; |
| VivianDu | 0:bc1d36f5f772 | 38 | snek._dir[i]=1; |
| VivianDu | 0:bc1d36f5f772 | 39 | } |
| VivianDu | 0:bc1d36f5f772 | 40 | |
| VivianDu | 0:bc1d36f5f772 | 41 | snek._x[_length]=x+_length; |
| VivianDu | 0:bc1d36f5f772 | 42 | snek._x[_length+1]=x+_length+1; |
| VivianDu | 0:bc1d36f5f772 | 43 | snek._y[_length]=y; |
| VivianDu | 0:bc1d36f5f772 | 44 | snek._dir[_length]=1; |
| VivianDu | 0:bc1d36f5f772 | 45 | printf("xog is %d ", snek._x[_length-1]); |
| VivianDu | 0:bc1d36f5f772 | 46 | |
| VivianDu | 0:bc1d36f5f772 | 47 | } |
| VivianDu | 0:bc1d36f5f772 | 48 | |
| VivianDu | 0:bc1d36f5f772 | 49 | void Snake::draw(N5110 &lcd){ |
| VivianDu | 0:bc1d36f5f772 | 50 | |
| VivianDu | 0:bc1d36f5f772 | 51 | checkWallCollision(lcd); |
| VivianDu | 0:bc1d36f5f772 | 52 | checkTailCollision(lcd); |
| VivianDu | 0:bc1d36f5f772 | 53 | |
| VivianDu | 0:bc1d36f5f772 | 54 | if (live!=0){ |
| VivianDu | 0:bc1d36f5f772 | 55 | lcd.clear(); |
| VivianDu | 0:bc1d36f5f772 | 56 | waitCount=((float)_length/3)+5; |
| VivianDu | 0:bc1d36f5f772 | 57 | waitTime=(1/waitCount); |
| VivianDu | 0:bc1d36f5f772 | 58 | wait(waitTime); |
| VivianDu | 0:bc1d36f5f772 | 59 | _food.draw(lcd); |
| VivianDu | 0:bc1d36f5f772 | 60 | lcd.drawRect(0,7,80,48-8,FILL_TRANSPARENT); |
| VivianDu | 0:bc1d36f5f772 | 61 | drawScore(lcd); |
| VivianDu | 0:bc1d36f5f772 | 62 | |
| VivianDu | 0:bc1d36f5f772 | 63 | int lowerBound=_length; |
| VivianDu | 0:bc1d36f5f772 | 64 | for (int i=0; lowerBound>i;i++){ |
| VivianDu | 0:bc1d36f5f772 | 65 | |
| VivianDu | 0:bc1d36f5f772 | 66 | bool ifcondition(snek._x!=0); |
| VivianDu | 0:bc1d36f5f772 | 67 | if (ifcondition) |
| VivianDu | 0:bc1d36f5f772 | 68 | { |
| VivianDu | 0:bc1d36f5f772 | 69 | bool ifcondition(snek._y!=0); |
| VivianDu | 0:bc1d36f5f772 | 70 | if (ifcondition) |
| VivianDu | 0:bc1d36f5f772 | 71 | { |
| VivianDu | 0:bc1d36f5f772 | 72 | lcd.setPixel(snek._x[i],snek._y[i]); |
| VivianDu | 0:bc1d36f5f772 | 73 | } |
| VivianDu | 0:bc1d36f5f772 | 74 | } |
| VivianDu | 0:bc1d36f5f772 | 75 | |
| VivianDu | 0:bc1d36f5f772 | 76 | lcd.refresh(); |
| VivianDu | 0:bc1d36f5f772 | 77 | |
| VivianDu | 0:bc1d36f5f772 | 78 | } |
| VivianDu | 0:bc1d36f5f772 | 79 | } |
| VivianDu | 0:bc1d36f5f772 | 80 | |
| VivianDu | 0:bc1d36f5f772 | 81 | } |
| VivianDu | 0:bc1d36f5f772 | 82 | void Snake::update(Gamepad &pad){ |
| VivianDu | 0:bc1d36f5f772 | 83 | bool ifcondition(live!=0); |
| VivianDu | 0:bc1d36f5f772 | 84 | if (ifcondition){ |
| VivianDu | 0:bc1d36f5f772 | 85 | |
| VivianDu | 0:bc1d36f5f772 | 86 | d=pad.get_direction(); |
| VivianDu | 0:bc1d36f5f772 | 87 | printf("x+1 is %d", snek._x[_length+1]); |
| VivianDu | 0:bc1d36f5f772 | 88 | printf("y+1 is %d", snek._y[_length+1]); |
| VivianDu | 0:bc1d36f5f772 | 89 | printf("dir+1 is %d", snek._dir[_length+1]); |
| VivianDu | 0:bc1d36f5f772 | 90 | printf("length is %d", _length); |
| VivianDu | 0:bc1d36f5f772 | 91 | |
| VivianDu | 0:bc1d36f5f772 | 92 | bool ifcondition(snek._dir[_length-1]==1); |
| VivianDu | 0:bc1d36f5f772 | 93 | if (ifcondition) |
| VivianDu | 0:bc1d36f5f772 | 94 | { |
| VivianDu | 0:bc1d36f5f772 | 95 | snek._x[_length]++; |
| VivianDu | 0:bc1d36f5f772 | 96 | } |
| VivianDu | 0:bc1d36f5f772 | 97 | |
| VivianDu | 0:bc1d36f5f772 | 98 | if (snek._dir[_length-1]==2) |
| VivianDu | 0:bc1d36f5f772 | 99 | { |
| VivianDu | 0:bc1d36f5f772 | 100 | snek._y[_length]--; |
| VivianDu | 0:bc1d36f5f772 | 101 | |
| VivianDu | 0:bc1d36f5f772 | 102 | } |
| VivianDu | 0:bc1d36f5f772 | 103 | |
| VivianDu | 0:bc1d36f5f772 | 104 | if (snek._dir[_length-1]==3) |
| VivianDu | 0:bc1d36f5f772 | 105 | { |
| VivianDu | 0:bc1d36f5f772 | 106 | snek._x[_length]--; |
| VivianDu | 0:bc1d36f5f772 | 107 | } |
| VivianDu | 0:bc1d36f5f772 | 108 | |
| VivianDu | 0:bc1d36f5f772 | 109 | if (snek._dir[_length-1]==4) |
| VivianDu | 0:bc1d36f5f772 | 110 | { |
| VivianDu | 0:bc1d36f5f772 | 111 | snek._y[_length]++; |
| VivianDu | 0:bc1d36f5f772 | 112 | } |
| VivianDu | 0:bc1d36f5f772 | 113 | |
| VivianDu | 0:bc1d36f5f772 | 114 | for (int i=0 ;_length<i ;i++) |
| VivianDu | 0:bc1d36f5f772 | 115 | { |
| VivianDu | 0:bc1d36f5f772 | 116 | snek._x[i]=snek._x[i+1]; |
| VivianDu | 0:bc1d36f5f772 | 117 | snek._y[i]=snek._y[i+1]; |
| VivianDu | 0:bc1d36f5f772 | 118 | |
| VivianDu | 0:bc1d36f5f772 | 119 | } |
| VivianDu | 0:bc1d36f5f772 | 120 | |
| VivianDu | 0:bc1d36f5f772 | 121 | if (d==N){ |
| VivianDu | 0:bc1d36f5f772 | 122 | |
| VivianDu | 0:bc1d36f5f772 | 123 | if (snek._dir[_length-1]!=4) |
| VivianDu | 0:bc1d36f5f772 | 124 | { |
| VivianDu | 0:bc1d36f5f772 | 125 | snek._dir[_length-1] = 2; |
| VivianDu | 0:bc1d36f5f772 | 126 | } |
| VivianDu | 0:bc1d36f5f772 | 127 | |
| VivianDu | 0:bc1d36f5f772 | 128 | } |
| VivianDu | 0:bc1d36f5f772 | 129 | |
| VivianDu | 0:bc1d36f5f772 | 130 | if (d==E){ |
| VivianDu | 0:bc1d36f5f772 | 131 | |
| VivianDu | 0:bc1d36f5f772 | 132 | if (snek._dir[_length-1]!=3) |
| VivianDu | 0:bc1d36f5f772 | 133 | { |
| VivianDu | 0:bc1d36f5f772 | 134 | snek._dir[_length-1] = 1; |
| VivianDu | 0:bc1d36f5f772 | 135 | } |
| VivianDu | 0:bc1d36f5f772 | 136 | |
| VivianDu | 0:bc1d36f5f772 | 137 | } |
| VivianDu | 0:bc1d36f5f772 | 138 | |
| VivianDu | 0:bc1d36f5f772 | 139 | if (d==W){ |
| VivianDu | 0:bc1d36f5f772 | 140 | |
| VivianDu | 0:bc1d36f5f772 | 141 | if (snek._dir[_length-1]!=1) |
| VivianDu | 0:bc1d36f5f772 | 142 | { |
| VivianDu | 0:bc1d36f5f772 | 143 | snek._dir[_length-1] = 3; |
| VivianDu | 0:bc1d36f5f772 | 144 | } |
| VivianDu | 0:bc1d36f5f772 | 145 | |
| VivianDu | 0:bc1d36f5f772 | 146 | |
| VivianDu | 0:bc1d36f5f772 | 147 | } |
| VivianDu | 0:bc1d36f5f772 | 148 | |
| VivianDu | 0:bc1d36f5f772 | 149 | if (d==S){ |
| VivianDu | 0:bc1d36f5f772 | 150 | |
| VivianDu | 0:bc1d36f5f772 | 151 | if (snek._dir[_length-1]!=2) |
| VivianDu | 0:bc1d36f5f772 | 152 | { |
| VivianDu | 0:bc1d36f5f772 | 153 | snek._dir[_length-1] = 4; |
| VivianDu | 0:bc1d36f5f772 | 154 | } |
| VivianDu | 0:bc1d36f5f772 | 155 | |
| VivianDu | 0:bc1d36f5f772 | 156 | |
| VivianDu | 0:bc1d36f5f772 | 157 | } |
| VivianDu | 0:bc1d36f5f772 | 158 | |
| VivianDu | 0:bc1d36f5f772 | 159 | printf("updated "); |
| VivianDu | 0:bc1d36f5f772 | 160 | addPoint(); |
| VivianDu | 0:bc1d36f5f772 | 161 | } |
| VivianDu | 0:bc1d36f5f772 | 162 | } |
| VivianDu | 0:bc1d36f5f772 | 163 | |
| VivianDu | 0:bc1d36f5f772 | 164 | void Snake::addPoint(){ |
| VivianDu | 0:bc1d36f5f772 | 165 | |
| VivianDu | 0:bc1d36f5f772 | 166 | pos foodPos = _food.returnPos(); |
| VivianDu | 0:bc1d36f5f772 | 167 | |
| VivianDu | 0:bc1d36f5f772 | 168 | bool ifcondition=(snek._x[_length-1]==foodPos.x && snek._y[_length-1]== foodPos.y); |
| VivianDu | 0:bc1d36f5f772 | 169 | if (ifcondition) |
| VivianDu | 0:bc1d36f5f772 | 170 | { |
| VivianDu | 0:bc1d36f5f772 | 171 | snek._x[_length+1]=snek._x[_length]; |
| VivianDu | 0:bc1d36f5f772 | 172 | snek._y[_length+1]=snek._y[_length]; |
| VivianDu | 0:bc1d36f5f772 | 173 | snek._dir[_length+1]=snek._dir[_length-1]; |
| VivianDu | 0:bc1d36f5f772 | 174 | _length=_length+1; |
| VivianDu | 0:bc1d36f5f772 | 175 | _food.response(); |
| VivianDu | 0:bc1d36f5f772 | 176 | } |
| VivianDu | 0:bc1d36f5f772 | 177 | } |
| VivianDu | 0:bc1d36f5f772 | 178 | |
| VivianDu | 0:bc1d36f5f772 | 179 | void Snake::deadSnake(N5110 &lcd){ |
| VivianDu | 0:bc1d36f5f772 | 180 | |
| VivianDu | 0:bc1d36f5f772 | 181 | |
| VivianDu | 0:bc1d36f5f772 | 182 | live--; |
| VivianDu | 0:bc1d36f5f772 | 183 | while (live==!1){ |
| VivianDu | 0:bc1d36f5f772 | 184 | lcd.clear(); |
| VivianDu | 0:bc1d36f5f772 | 185 | lcd.init(); |
| VivianDu | 0:bc1d36f5f772 | 186 | lcd.printString("Game Over",0,1); |
| VivianDu | 0:bc1d36f5f772 | 187 | lcd.printString("Press Reset",0,2); |
| VivianDu | 0:bc1d36f5f772 | 188 | lcd.printString("To restart",0,3); |
| VivianDu | 0:bc1d36f5f772 | 189 | lcd.refresh(); |
| VivianDu | 0:bc1d36f5f772 | 190 | |
| VivianDu | 0:bc1d36f5f772 | 191 | } |
| VivianDu | 0:bc1d36f5f772 | 192 | init(startx,starty,startl,live); |
| VivianDu | 0:bc1d36f5f772 | 193 | |
| VivianDu | 0:bc1d36f5f772 | 194 | } |
| VivianDu | 0:bc1d36f5f772 | 195 | |
| VivianDu | 0:bc1d36f5f772 | 196 | void Snake::checkWallCollision(N5110 &lcd){ |
| VivianDu | 0:bc1d36f5f772 | 197 | |
| VivianDu | 0:bc1d36f5f772 | 198 | bool ifcondition=(snek._x[_length]==WIDTH||snek._x[_length]==0); |
| VivianDu | 0:bc1d36f5f772 | 199 | if (ifcondition) |
| VivianDu | 0:bc1d36f5f772 | 200 | { |
| VivianDu | 0:bc1d36f5f772 | 201 | deadSnake(lcd); |
| VivianDu | 0:bc1d36f5f772 | 202 | } |
| VivianDu | 0:bc1d36f5f772 | 203 | |
| VivianDu | 0:bc1d36f5f772 | 204 | if (snek._y[_length]==CEILING||snek._y[_length]==FLOOR)//if snake hits top or bottom walls |
| VivianDu | 0:bc1d36f5f772 | 205 | { |
| VivianDu | 0:bc1d36f5f772 | 206 | deadSnake(lcd); |
| VivianDu | 0:bc1d36f5f772 | 207 | } |
| VivianDu | 0:bc1d36f5f772 | 208 | |
| VivianDu | 0:bc1d36f5f772 | 209 | } |
| VivianDu | 0:bc1d36f5f772 | 210 | |
| VivianDu | 0:bc1d36f5f772 | 211 | void Snake::checkTailCollision(N5110 &lcd){ |
| VivianDu | 0:bc1d36f5f772 | 212 | int upperBound=_length; |
| VivianDu | 0:bc1d36f5f772 | 213 | for (int i=0 ;upperBound<i ;i++){ |
| VivianDu | 0:bc1d36f5f772 | 214 | |
| VivianDu | 0:bc1d36f5f772 | 215 | bool ifcondition=(snek._x[_length-1]==snek._x[i] && snek._y[_length-1]==snek._y[i]); |
| VivianDu | 0:bc1d36f5f772 | 216 | if (ifcondition) |
| VivianDu | 0:bc1d36f5f772 | 217 | { |
| VivianDu | 0:bc1d36f5f772 | 218 | deadSnake(lcd); |
| VivianDu | 0:bc1d36f5f772 | 219 | } |
| VivianDu | 0:bc1d36f5f772 | 220 | } |
| VivianDu | 0:bc1d36f5f772 | 221 | |
| VivianDu | 0:bc1d36f5f772 | 222 | |
| VivianDu | 0:bc1d36f5f772 | 223 | } |
| VivianDu | 0:bc1d36f5f772 | 224 | |
| VivianDu | 0:bc1d36f5f772 | 225 | void Snake::drawScore(N5110 &lcd){ |
| VivianDu | 0:bc1d36f5f772 | 226 | char buffer1[14]; |
| VivianDu | 0:bc1d36f5f772 | 227 | char buffer2[14]; |
| VivianDu | 0:bc1d36f5f772 | 228 | sprintf(buffer1,"%2d",live); |
| VivianDu | 0:bc1d36f5f772 | 229 | sprintf(buffer2,"%2d",_length-4); |
| VivianDu | 0:bc1d36f5f772 | 230 | lcd.printString(buffer1,20,0); |
| VivianDu | 0:bc1d36f5f772 | 231 | lcd.printString(buffer2,60,0); |
| VivianDu | 0:bc1d36f5f772 | 232 | lcd.printString("Life:",0,0); |
| VivianDu | 0:bc1d36f5f772 | 233 | lcd.printString("Score:",42,0); |
| VivianDu | 0:bc1d36f5f772 | 234 | |
| VivianDu | 0:bc1d36f5f772 | 235 | } |