This is the code for LCD bouncing ball game.

Dependencies:   4DGL-uLCD-SE LSM9DS0 mbed

Committer:
fengspot
Date:
Mon Oct 19 18:52:57 2015 +0000
Revision:
0:eda8882a56f9
LCD

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fengspot 0:eda8882a56f9 1 // LSM9DS90/uLCD Demo
fengspot 0:eda8882a56f9 2 // ECE 4180 Lab Code Template
fengspot 0:eda8882a56f9 3
fengspot 0:eda8882a56f9 4 #include "mbed.h"
fengspot 0:eda8882a56f9 5 #include "LSM9DS0.h"
fengspot 0:eda8882a56f9 6 #include "uLCD_4DGL.h"
fengspot 0:eda8882a56f9 7 #include <stdio.h>
fengspot 0:eda8882a56f9 8 #include <stdlib.h>
fengspot 0:eda8882a56f9 9 #include <time.h>
fengspot 0:eda8882a56f9 10
fengspot 0:eda8882a56f9 11 // uncomment this line to enable the uLCD for Part 4 of the lab
fengspot 0:eda8882a56f9 12 #define PART_4
fengspot 0:eda8882a56f9 13
fengspot 0:eda8882a56f9 14 // SDO_XM and SDO_G are pulled up, so our addresses are:
fengspot 0:eda8882a56f9 15 #define LSM9DS0_XM_ADDR 0x1D // Would be 0x1E if SDO_XM is LOW
fengspot 0:eda8882a56f9 16 #define LSM9DS0_G_ADDR 0x6B // Would be 0x6A if SDO_G is LOW
fengspot 0:eda8882a56f9 17
fengspot 0:eda8882a56f9 18 // refresh time. set to 500 for part 2 and 50 for part 4
fengspot 0:eda8882a56f9 19 #define REFRESH_TIME_MS 200
fengspot 0:eda8882a56f9 20
fengspot 0:eda8882a56f9 21 // Verify that the pin assignments below match your breadboard
fengspot 0:eda8882a56f9 22 LSM9DS0 imu(p9, p10, LSM9DS0_G_ADDR, LSM9DS0_XM_ADDR);
fengspot 0:eda8882a56f9 23 Serial pc(USBTX, USBRX);
fengspot 0:eda8882a56f9 24
fengspot 0:eda8882a56f9 25 #ifdef PART_4
fengspot 0:eda8882a56f9 26 uLCD_4DGL lcd(p28, p27, p30);
fengspot 0:eda8882a56f9 27 #endif
fengspot 0:eda8882a56f9 28
fengspot 0:eda8882a56f9 29 //Init Serial port and LSM9DS0 chip
fengspot 0:eda8882a56f9 30 void setup()
fengspot 0:eda8882a56f9 31 {
fengspot 0:eda8882a56f9 32 #ifdef PART_4
fengspot 0:eda8882a56f9 33 lcd.baudrate(3000000);
fengspot 0:eda8882a56f9 34 lcd.background_color(0);
fengspot 0:eda8882a56f9 35 lcd.cls();
fengspot 0:eda8882a56f9 36
fengspot 0:eda8882a56f9 37 lcd.printf("Initializing...");
fengspot 0:eda8882a56f9 38 #endif
fengspot 0:eda8882a56f9 39
fengspot 0:eda8882a56f9 40 // Use the begin() function to initialize the LSM9DS0 library.
fengspot 0:eda8882a56f9 41 // You can either call it with no parameters (the easy way):
fengspot 0:eda8882a56f9 42 uint16_t status = imu.begin();
fengspot 0:eda8882a56f9 43 }
fengspot 0:eda8882a56f9 44
fengspot 0:eda8882a56f9 45 class Brick {
fengspot 0:eda8882a56f9 46
fengspot 0:eda8882a56f9 47 public:
fengspot 0:eda8882a56f9 48 int x;
fengspot 0:eda8882a56f9 49 int y;
fengspot 0:eda8882a56f9 50 int color;
fengspot 0:eda8882a56f9 51 int width;
fengspot 0:eda8882a56f9 52 int height;
fengspot 0:eda8882a56f9 53 bool exist;
fengspot 0:eda8882a56f9 54
fengspot 0:eda8882a56f9 55 Brick(){
fengspot 0:eda8882a56f9 56 width = 10;
fengspot 0:eda8882a56f9 57 height = 5;
fengspot 0:eda8882a56f9 58 exist = true;
fengspot 0:eda8882a56f9 59 }
fengspot 0:eda8882a56f9 60
fengspot 0:eda8882a56f9 61 void set(int x, int y){
fengspot 0:eda8882a56f9 62 this->x = x;
fengspot 0:eda8882a56f9 63 this->y = y;
fengspot 0:eda8882a56f9 64 }
fengspot 0:eda8882a56f9 65 };
fengspot 0:eda8882a56f9 66
fengspot 0:eda8882a56f9 67 int main()
fengspot 0:eda8882a56f9 68 {
fengspot 0:eda8882a56f9 69 setup(); //Setup sensor and Serial
fengspot 0:eda8882a56f9 70 lcd.cls();
fengspot 0:eda8882a56f9 71
fengspot 0:eda8882a56f9 72 int score = 0;
fengspot 0:eda8882a56f9 73 Brick* wall[32];
fengspot 0:eda8882a56f9 74 srand(time(0));
fengspot 0:eda8882a56f9 75 for(int i = 0; i < 8; i ++){
fengspot 0:eda8882a56f9 76 for( int j = 0; j < 4; j++){
fengspot 0:eda8882a56f9 77 Brick * brick = new Brick();
fengspot 0:eda8882a56f9 78 brick->set(5 + i * brick->width, 20 + j * brick->height);
fengspot 0:eda8882a56f9 79 int c = 0;
fengspot 0:eda8882a56f9 80 int num = rand() % 8 + 1;
fengspot 0:eda8882a56f9 81 switch (num) {
fengspot 0:eda8882a56f9 82 case 1:
fengspot 0:eda8882a56f9 83 c = 0xff0000;
fengspot 0:eda8882a56f9 84 break;
fengspot 0:eda8882a56f9 85 case 2:
fengspot 0:eda8882a56f9 86 c = 0xffff00;
fengspot 0:eda8882a56f9 87 break;
fengspot 0:eda8882a56f9 88 case 3:
fengspot 0:eda8882a56f9 89 c = 0x00FF00;
fengspot 0:eda8882a56f9 90 break;
fengspot 0:eda8882a56f9 91 case 4:
fengspot 0:eda8882a56f9 92 c = 0x0000FF;
fengspot 0:eda8882a56f9 93 break;
fengspot 0:eda8882a56f9 94 case 5:
fengspot 0:eda8882a56f9 95 c = 0xFFC0CB;
fengspot 0:eda8882a56f9 96 break;
fengspot 0:eda8882a56f9 97 case 6:
fengspot 0:eda8882a56f9 98 c = 0xA52A2A;
fengspot 0:eda8882a56f9 99 break;
fengspot 0:eda8882a56f9 100 case 7:
fengspot 0:eda8882a56f9 101 c = 0xd3d3d3;
fengspot 0:eda8882a56f9 102 break;
fengspot 0:eda8882a56f9 103 case 8:
fengspot 0:eda8882a56f9 104 c = 0x800080;
fengspot 0:eda8882a56f9 105 break;
fengspot 0:eda8882a56f9 106 default:
fengspot 0:eda8882a56f9 107 c = 0x445566;
fengspot 0:eda8882a56f9 108 }
fengspot 0:eda8882a56f9 109 brick->color = c;
fengspot 0:eda8882a56f9 110 wall[i*4 + j] = brick;
fengspot 0:eda8882a56f9 111 }
fengspot 0:eda8882a56f9 112 }
fengspot 0:eda8882a56f9 113
fengspot 0:eda8882a56f9 114 float player_x = 60.0;
fengspot 0:eda8882a56f9 115 float player_y = 120.0;
fengspot 0:eda8882a56f9 116 float p_width = 30.0;
fengspot 0:eda8882a56f9 117
fengspot 0:eda8882a56f9 118 float ball_x = 23.0;
fengspot 0:eda8882a56f9 119 float ball_y = 49.0;
fengspot 0:eda8882a56f9 120 float ball_vx = 15.0;
fengspot 0:eda8882a56f9 121 float ball_vy = 15.0;
fengspot 0:eda8882a56f9 122 float ball_r = 2.0;
fengspot 0:eda8882a56f9 123 float width = 110.0;
fengspot 0:eda8882a56f9 124 float height = 120.0;
fengspot 0:eda8882a56f9 125 bool end = false;
fengspot 0:eda8882a56f9 126 bool win = false;
fengspot 0:eda8882a56f9 127
fengspot 0:eda8882a56f9 128 while (!end && !win)
fengspot 0:eda8882a56f9 129 {
fengspot 0:eda8882a56f9 130 lcd.cls();
fengspot 0:eda8882a56f9 131 lcd.printf("score is %d", score);
fengspot 0:eda8882a56f9 132 imu.readMag();
fengspot 0:eda8882a56f9 133 imu.readAccel();
fengspot 0:eda8882a56f9 134
fengspot 0:eda8882a56f9 135 for(int i = 0; i < 32; i++ ){
fengspot 0:eda8882a56f9 136 if(wall[i]->exist){
fengspot 0:eda8882a56f9 137 lcd.filled_rectangle(wall[i]->x, wall[i]->y, wall[i]->x + wall[i]->width, wall[i]->y + wall[i]->height, wall[i]->color);
fengspot 0:eda8882a56f9 138 }
fengspot 0:eda8882a56f9 139 }
fengspot 0:eda8882a56f9 140
fengspot 0:eda8882a56f9 141 lcd.circle(ball_x, ball_y, ball_r, RED);
fengspot 0:eda8882a56f9 142 lcd.line(player_x, player_y, player_x + p_width, player_y, BLUE);
fengspot 0:eda8882a56f9 143
fengspot 0:eda8882a56f9 144 ball_x += ball_vx * 0.7;
fengspot 0:eda8882a56f9 145 ball_y += ball_vy * 0.7;
fengspot 0:eda8882a56f9 146 player_x = player_x - imu.ax_raw * 0.003;
fengspot 0:eda8882a56f9 147
fengspot 0:eda8882a56f9 148 if(player_x + p_width > width){
fengspot 0:eda8882a56f9 149 player_x = width - p_width;
fengspot 0:eda8882a56f9 150 }
fengspot 0:eda8882a56f9 151
fengspot 0:eda8882a56f9 152 if(player_x < 0){
fengspot 0:eda8882a56f9 153 player_x = 0;
fengspot 0:eda8882a56f9 154 }
fengspot 0:eda8882a56f9 155
fengspot 0:eda8882a56f9 156 if(ball_x + ball_r > width){
fengspot 0:eda8882a56f9 157 ball_x = width - ball_r;
fengspot 0:eda8882a56f9 158 ball_vx *= -1;
fengspot 0:eda8882a56f9 159 }
fengspot 0:eda8882a56f9 160
fengspot 0:eda8882a56f9 161 if(ball_x - ball_r < 0){
fengspot 0:eda8882a56f9 162 ball_x = ball_r;
fengspot 0:eda8882a56f9 163 ball_vx *= -1;
fengspot 0:eda8882a56f9 164 }
fengspot 0:eda8882a56f9 165
fengspot 0:eda8882a56f9 166 if(ball_y + ball_r > height){
fengspot 0:eda8882a56f9 167 if(ball_x < player_x || ball_x > player_x + p_width){
fengspot 0:eda8882a56f9 168 end = true;
fengspot 0:eda8882a56f9 169 } else {
fengspot 0:eda8882a56f9 170 ball_y = height - ball_r;
fengspot 0:eda8882a56f9 171 ball_vy *= -1;
fengspot 0:eda8882a56f9 172 }
fengspot 0:eda8882a56f9 173 }
fengspot 0:eda8882a56f9 174
fengspot 0:eda8882a56f9 175 if(ball_y - ball_r < 0){
fengspot 0:eda8882a56f9 176 ball_y = ball_r;
fengspot 0:eda8882a56f9 177 ball_vy *= -1;
fengspot 0:eda8882a56f9 178 }
fengspot 0:eda8882a56f9 179
fengspot 0:eda8882a56f9 180 for(int i = 0; i < 32; i++ ){
fengspot 0:eda8882a56f9 181 if(wall[i]->exist){
fengspot 0:eda8882a56f9 182 if (!(ball_x > wall[i]->x + wall[i]->width ||
fengspot 0:eda8882a56f9 183 ball_x + ball_r < wall[i]->x ||
fengspot 0:eda8882a56f9 184 ball_y > wall[i]->y + wall[i]->height ||
fengspot 0:eda8882a56f9 185 ball_y + ball_r < wall[i]->y)){
fengspot 0:eda8882a56f9 186 wall[i]->exist = false;
fengspot 0:eda8882a56f9 187 score++;
fengspot 0:eda8882a56f9 188 }
fengspot 0:eda8882a56f9 189 }
fengspot 0:eda8882a56f9 190 }
fengspot 0:eda8882a56f9 191 if(score == 32){
fengspot 0:eda8882a56f9 192 win = true;
fengspot 0:eda8882a56f9 193 }
fengspot 0:eda8882a56f9 194 wait_ms(REFRESH_TIME_MS);
fengspot 0:eda8882a56f9 195 }
fengspot 0:eda8882a56f9 196 lcd.cls();
fengspot 0:eda8882a56f9 197
fengspot 0:eda8882a56f9 198 if(win){
fengspot 0:eda8882a56f9 199 lcd.printf("You Win!!!");
fengspot 0:eda8882a56f9 200 } else {
fengspot 0:eda8882a56f9 201 lcd.printf("Game Over...");
fengspot 0:eda8882a56f9 202 }
fengspot 0:eda8882a56f9 203 }