An example of a simple snake game on the micro:bit. This example shows the use of the accelerometer and plotting pixels on the display. This is a one-way translation of the microbit-samples repository on GitHub. Please don't try to push changes here, instead push them to the source repo at https://github.com/lancaster-university/microbit-samples

Dependencies:   microbit

Committer:
LancasterUniversity
Date:
Wed Jul 13 16:06:37 2016 +0100
Revision:
0:3acbb255fa58
Update to git: v2.0.0-rc4-5-g115d5a8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
LancasterUniversity 0:3acbb255fa58 1 /*
LancasterUniversity 0:3acbb255fa58 2 The MIT License (MIT)
LancasterUniversity 0:3acbb255fa58 3
LancasterUniversity 0:3acbb255fa58 4 Copyright (c) 2016 British Broadcasting Corporation.
LancasterUniversity 0:3acbb255fa58 5 This software is provided by Lancaster University by arrangement with the BBC.
LancasterUniversity 0:3acbb255fa58 6
LancasterUniversity 0:3acbb255fa58 7 Permission is hereby granted, free of charge, to any person obtaining a
LancasterUniversity 0:3acbb255fa58 8 copy of this software and associated documentation files (the "Software"),
LancasterUniversity 0:3acbb255fa58 9 to deal in the Software without restriction, including without limitation
LancasterUniversity 0:3acbb255fa58 10 the rights to use, copy, modify, merge, publish, distribute, sublicense,
LancasterUniversity 0:3acbb255fa58 11 and/or sell copies of the Software, and to permit persons to whom the
LancasterUniversity 0:3acbb255fa58 12 Software is furnished to do so, subject to the following conditions:
LancasterUniversity 0:3acbb255fa58 13
LancasterUniversity 0:3acbb255fa58 14 The above copyright notice and this permission notice shall be included in
LancasterUniversity 0:3acbb255fa58 15 all copies or substantial portions of the Software.
LancasterUniversity 0:3acbb255fa58 16
LancasterUniversity 0:3acbb255fa58 17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
LancasterUniversity 0:3acbb255fa58 18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
LancasterUniversity 0:3acbb255fa58 19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
LancasterUniversity 0:3acbb255fa58 20 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LancasterUniversity 0:3acbb255fa58 21 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
LancasterUniversity 0:3acbb255fa58 22 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
LancasterUniversity 0:3acbb255fa58 23 DEALINGS IN THE SOFTWARE.
LancasterUniversity 0:3acbb255fa58 24 */
LancasterUniversity 0:3acbb255fa58 25
LancasterUniversity 0:3acbb255fa58 26 #include "MicroBit.h"
LancasterUniversity 0:3acbb255fa58 27
LancasterUniversity 0:3acbb255fa58 28 #define SNAKE_EMPTY 0
LancasterUniversity 0:3acbb255fa58 29 #define SNAKE_UP 1
LancasterUniversity 0:3acbb255fa58 30 #define SNAKE_LEFT 2
LancasterUniversity 0:3acbb255fa58 31 #define SNAKE_RIGHT 3
LancasterUniversity 0:3acbb255fa58 32 #define SNAKE_DOWN 4
LancasterUniversity 0:3acbb255fa58 33
LancasterUniversity 0:3acbb255fa58 34 #define SNAKE_FRAME_DELAY 350
LancasterUniversity 0:3acbb255fa58 35 #define GROWTH_SPEED 3
LancasterUniversity 0:3acbb255fa58 36
LancasterUniversity 0:3acbb255fa58 37 struct Point
LancasterUniversity 0:3acbb255fa58 38 {
LancasterUniversity 0:3acbb255fa58 39 int x;
LancasterUniversity 0:3acbb255fa58 40 int y;
LancasterUniversity 0:3acbb255fa58 41 };
LancasterUniversity 0:3acbb255fa58 42
LancasterUniversity 0:3acbb255fa58 43 MicroBit uBit;
LancasterUniversity 0:3acbb255fa58 44 Point head; // Location of the head of our snake.
LancasterUniversity 0:3acbb255fa58 45 Point tail; // Location of the tail of our snake.
LancasterUniversity 0:3acbb255fa58 46 Point food; // Location of food.
LancasterUniversity 0:3acbb255fa58 47 MicroBitImage map(5,5);
LancasterUniversity 0:3acbb255fa58 48
LancasterUniversity 0:3acbb255fa58 49 void place_food()
LancasterUniversity 0:3acbb255fa58 50 {
LancasterUniversity 0:3acbb255fa58 51 int r = uBit.random(24);
LancasterUniversity 0:3acbb255fa58 52 int x = 0; int y = 0;
LancasterUniversity 0:3acbb255fa58 53
LancasterUniversity 0:3acbb255fa58 54 while (r > 0)
LancasterUniversity 0:3acbb255fa58 55 {
LancasterUniversity 0:3acbb255fa58 56 x = (x+1) % 5;
LancasterUniversity 0:3acbb255fa58 57 if (x == 0)
LancasterUniversity 0:3acbb255fa58 58 y = (y+1) % 5;
LancasterUniversity 0:3acbb255fa58 59
LancasterUniversity 0:3acbb255fa58 60 if(map.getPixelValue(x,y) == SNAKE_EMPTY)
LancasterUniversity 0:3acbb255fa58 61 r--;
LancasterUniversity 0:3acbb255fa58 62 }
LancasterUniversity 0:3acbb255fa58 63
LancasterUniversity 0:3acbb255fa58 64 food.x = x;
LancasterUniversity 0:3acbb255fa58 65 food.y = y;
LancasterUniversity 0:3acbb255fa58 66 }
LancasterUniversity 0:3acbb255fa58 67
LancasterUniversity 0:3acbb255fa58 68 void snake()
LancasterUniversity 0:3acbb255fa58 69 {
LancasterUniversity 0:3acbb255fa58 70 Point newHead; // Calculated placement of new head position based on user input.
LancasterUniversity 0:3acbb255fa58 71 int hdirection; // Head's direction of travel
LancasterUniversity 0:3acbb255fa58 72 int tdirection; // Tail's direction of travel
LancasterUniversity 0:3acbb255fa58 73 int snakeLength; // number of segments in the snake.
LancasterUniversity 0:3acbb255fa58 74 int growing; // boolean state indicating if we've just eaten some food.
LancasterUniversity 0:3acbb255fa58 75 int score;
LancasterUniversity 0:3acbb255fa58 76
LancasterUniversity 0:3acbb255fa58 77 // Start in the middle of the screen.
LancasterUniversity 0:3acbb255fa58 78 tail.x = tail.y = 2;
LancasterUniversity 0:3acbb255fa58 79 head.x = head.y = 2;
LancasterUniversity 0:3acbb255fa58 80 snakeLength = 1;
LancasterUniversity 0:3acbb255fa58 81 growing = 0;
LancasterUniversity 0:3acbb255fa58 82 score = 0;
LancasterUniversity 0:3acbb255fa58 83 map.clear();
LancasterUniversity 0:3acbb255fa58 84
LancasterUniversity 0:3acbb255fa58 85 uBit.display.image.setPixelValue(head.x, head.y, 255);
LancasterUniversity 0:3acbb255fa58 86
LancasterUniversity 0:3acbb255fa58 87 // Add some random food.
LancasterUniversity 0:3acbb255fa58 88 place_food();
LancasterUniversity 0:3acbb255fa58 89
LancasterUniversity 0:3acbb255fa58 90 while (1)
LancasterUniversity 0:3acbb255fa58 91 {
LancasterUniversity 0:3acbb255fa58 92 // Flash the food is necessary;
LancasterUniversity 0:3acbb255fa58 93 uBit.display.image.setPixelValue(food.x, food.y, uBit.systemTime() % 1000 < 500 ? 0 : 255);
LancasterUniversity 0:3acbb255fa58 94
LancasterUniversity 0:3acbb255fa58 95 int dx = uBit.accelerometer.getX();
LancasterUniversity 0:3acbb255fa58 96 int dy = uBit.accelerometer.getY();
LancasterUniversity 0:3acbb255fa58 97
LancasterUniversity 0:3acbb255fa58 98 newHead.x = head.x;
LancasterUniversity 0:3acbb255fa58 99 newHead.y = head.y;
LancasterUniversity 0:3acbb255fa58 100
LancasterUniversity 0:3acbb255fa58 101 if (abs(dx) > abs(dy))
LancasterUniversity 0:3acbb255fa58 102 {
LancasterUniversity 0:3acbb255fa58 103 if(dx < 0)
LancasterUniversity 0:3acbb255fa58 104 {
LancasterUniversity 0:3acbb255fa58 105 hdirection = SNAKE_LEFT;
LancasterUniversity 0:3acbb255fa58 106 newHead.x = newHead.x == 0 ? 4 : newHead.x-1;
LancasterUniversity 0:3acbb255fa58 107 }
LancasterUniversity 0:3acbb255fa58 108 else
LancasterUniversity 0:3acbb255fa58 109 {
LancasterUniversity 0:3acbb255fa58 110 hdirection = SNAKE_RIGHT;
LancasterUniversity 0:3acbb255fa58 111 newHead.x = newHead.x == 4 ? 0 : newHead.x+1;
LancasterUniversity 0:3acbb255fa58 112 }
LancasterUniversity 0:3acbb255fa58 113 }
LancasterUniversity 0:3acbb255fa58 114 else
LancasterUniversity 0:3acbb255fa58 115 {
LancasterUniversity 0:3acbb255fa58 116 if(dy < 0)
LancasterUniversity 0:3acbb255fa58 117 {
LancasterUniversity 0:3acbb255fa58 118 hdirection = SNAKE_UP;
LancasterUniversity 0:3acbb255fa58 119 newHead.y = newHead.y == 0 ? 4 : newHead.y-1;
LancasterUniversity 0:3acbb255fa58 120 }
LancasterUniversity 0:3acbb255fa58 121 else
LancasterUniversity 0:3acbb255fa58 122 {
LancasterUniversity 0:3acbb255fa58 123 hdirection = SNAKE_DOWN;
LancasterUniversity 0:3acbb255fa58 124 newHead.y = newHead.y == 4 ? 0 : newHead.y+1;
LancasterUniversity 0:3acbb255fa58 125 }
LancasterUniversity 0:3acbb255fa58 126 }
LancasterUniversity 0:3acbb255fa58 127
LancasterUniversity 0:3acbb255fa58 128 int status = map.getPixelValue(newHead.x, newHead.y);
LancasterUniversity 0:3acbb255fa58 129 if (status == SNAKE_UP || status == SNAKE_DOWN || status == SNAKE_LEFT || status == SNAKE_RIGHT)
LancasterUniversity 0:3acbb255fa58 130 {
LancasterUniversity 0:3acbb255fa58 131 uBit.display.scroll("GAME OVER! SCORE: ");
LancasterUniversity 0:3acbb255fa58 132 uBit.display.scroll(score);
LancasterUniversity 0:3acbb255fa58 133
LancasterUniversity 0:3acbb255fa58 134 return;
LancasterUniversity 0:3acbb255fa58 135 }
LancasterUniversity 0:3acbb255fa58 136
LancasterUniversity 0:3acbb255fa58 137 // move the head.
LancasterUniversity 0:3acbb255fa58 138 map.setPixelValue(head.x, head.y, hdirection);
LancasterUniversity 0:3acbb255fa58 139 uBit.display.image.setPixelValue(newHead.x, newHead.y, 255);
LancasterUniversity 0:3acbb255fa58 140
LancasterUniversity 0:3acbb255fa58 141 if (growing == GROWTH_SPEED)
LancasterUniversity 0:3acbb255fa58 142 {
LancasterUniversity 0:3acbb255fa58 143 growing = 0;
LancasterUniversity 0:3acbb255fa58 144 snakeLength++;
LancasterUniversity 0:3acbb255fa58 145 }
LancasterUniversity 0:3acbb255fa58 146 else
LancasterUniversity 0:3acbb255fa58 147 {
LancasterUniversity 0:3acbb255fa58 148 // move the tail.
LancasterUniversity 0:3acbb255fa58 149 tdirection = map.getPixelValue(tail.x,tail.y);
LancasterUniversity 0:3acbb255fa58 150 map.setPixelValue(tail.x, tail.y, SNAKE_EMPTY);
LancasterUniversity 0:3acbb255fa58 151 uBit.display.image.setPixelValue(tail.x, tail.y, 0);
LancasterUniversity 0:3acbb255fa58 152
LancasterUniversity 0:3acbb255fa58 153 // Move our record of the tail's location.
LancasterUniversity 0:3acbb255fa58 154 if (snakeLength == 1)
LancasterUniversity 0:3acbb255fa58 155 {
LancasterUniversity 0:3acbb255fa58 156 tail.x = newHead.x;
LancasterUniversity 0:3acbb255fa58 157 tail.y = newHead.y;
LancasterUniversity 0:3acbb255fa58 158 }
LancasterUniversity 0:3acbb255fa58 159 else
LancasterUniversity 0:3acbb255fa58 160 {
LancasterUniversity 0:3acbb255fa58 161 if (tdirection == SNAKE_UP)
LancasterUniversity 0:3acbb255fa58 162 tail.y = tail.y == 0 ? 4 : tail.y-1;
LancasterUniversity 0:3acbb255fa58 163
LancasterUniversity 0:3acbb255fa58 164 if (tdirection == SNAKE_DOWN)
LancasterUniversity 0:3acbb255fa58 165 tail.y = tail.y == 4 ? 0 : tail.y+1;
LancasterUniversity 0:3acbb255fa58 166
LancasterUniversity 0:3acbb255fa58 167 if (tdirection == SNAKE_LEFT)
LancasterUniversity 0:3acbb255fa58 168 tail.x = tail.x == 0 ? 4 : tail.x-1;
LancasterUniversity 0:3acbb255fa58 169
LancasterUniversity 0:3acbb255fa58 170 if (tdirection == SNAKE_RIGHT)
LancasterUniversity 0:3acbb255fa58 171 tail.x = tail.x == 4 ? 0 : tail.x+1;
LancasterUniversity 0:3acbb255fa58 172 }
LancasterUniversity 0:3acbb255fa58 173 }
LancasterUniversity 0:3acbb255fa58 174
LancasterUniversity 0:3acbb255fa58 175 // Update our record of the head location and away we go!
LancasterUniversity 0:3acbb255fa58 176 head.x = newHead.x;
LancasterUniversity 0:3acbb255fa58 177 head.y = newHead.y;
LancasterUniversity 0:3acbb255fa58 178
LancasterUniversity 0:3acbb255fa58 179 // if we've eaten some food, replace the food and grow ourselves!
LancasterUniversity 0:3acbb255fa58 180 if (head.x == food.x && head.y == food.y)
LancasterUniversity 0:3acbb255fa58 181 {
LancasterUniversity 0:3acbb255fa58 182 growing++;
LancasterUniversity 0:3acbb255fa58 183 score++;
LancasterUniversity 0:3acbb255fa58 184 place_food();
LancasterUniversity 0:3acbb255fa58 185 }
LancasterUniversity 0:3acbb255fa58 186
LancasterUniversity 0:3acbb255fa58 187 uBit.sleep(SNAKE_FRAME_DELAY);
LancasterUniversity 0:3acbb255fa58 188 }
LancasterUniversity 0:3acbb255fa58 189 }
LancasterUniversity 0:3acbb255fa58 190
LancasterUniversity 0:3acbb255fa58 191 int main()
LancasterUniversity 0:3acbb255fa58 192 {
LancasterUniversity 0:3acbb255fa58 193 // Initialise the micro:bit runtime.
LancasterUniversity 0:3acbb255fa58 194 uBit.init();
LancasterUniversity 0:3acbb255fa58 195
LancasterUniversity 0:3acbb255fa58 196 // Insert your code here!
LancasterUniversity 0:3acbb255fa58 197 uBit.display.scroll("SNAKE v1.0");
LancasterUniversity 0:3acbb255fa58 198
LancasterUniversity 0:3acbb255fa58 199 while(1)
LancasterUniversity 0:3acbb255fa58 200 snake();
LancasterUniversity 0:3acbb255fa58 201 }
LancasterUniversity 0:3acbb255fa58 202