Samples of how to use the micro:bit DAL with mbed. This is a hg clone of the real git repo that can be found here: https://github.com/lancaster-university/microbit-samples

Dependencies:   microbit

Fork of microbit-samples by Lancaster University

Committer:
finneyj
Date:
Fri Apr 08 18:04:40 2016 +0000
Revision:
7:6b26df2a055a
Parent:
2:5b2cd31ac474
update of microbit repo to latest revision

Who changed what in which revision?

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