University project - accelerometer controlled Arkanoid

Dependencies:   KS0108 MMA8451Q mbed

Committer:
JSindelar
Date:
Sun Jan 18 19:27:16 2015 +0000
Revision:
0:9515d58c3408
University project - accelerometer controlled Arkanoid

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JSindelar 0:9515d58c3408 1 /*
JSindelar 0:9515d58c3408 2 #include "mbed.h"
JSindelar 0:9515d58c3408 3 #include "KS0108.h"
JSindelar 0:9515d58c3408 4 #include "Arial12.h"
JSindelar 0:9515d58c3408 5 #include "SystemFont5x7.h"
JSindelar 0:9515d58c3408 6 #include "stdbool.h"
JSindelar 0:9515d58c3408 7 #include "MMA8451Q.h"
JSindelar 0:9515d58c3408 8
JSindelar 0:9515d58c3408 9 #define step (4)
JSindelar 0:9515d58c3408 10 #define minX (125)
JSindelar 0:9515d58c3408 11 #define maxX (39)
JSindelar 0:9515d58c3408 12 #define minY (2)
JSindelar 0:9515d58c3408 13 #define maxY (62)
JSindelar 0:9515d58c3408 14 #define PadLength (10)
JSindelar 0:9515d58c3408 15 #define PadY (59)
JSindelar 0:9515d58c3408 16 #define LowSpeed (2)
JSindelar 0:9515d58c3408 17 #define HighSpeed (4)
JSindelar 0:9515d58c3408 18 #define XPadInit ((unsigned char)(0.5*(minX+maxX-PadLength)))
JSindelar 0:9515d58c3408 19 #define XBallInit ((unsigned char)(XPadInit+0.5*PadLength))
JSindelar 0:9515d58c3408 20 #define BallD (1)
JSindelar 0:9515d58c3408 21 #define YBallInit ((unsigned char)(PadY-BallD))
JSindelar 0:9515d58c3408 22
JSindelar 0:9515d58c3408 23 #define BrickH (4)
JSindelar 0:9515d58c3408 24 #define BrickW (20)
JSindelar 0:9515d58c3408 25 #define columns (4)
JSindelar 0:9515d58c3408 26 #define rows (3)
JSindelar 0:9515d58c3408 27
JSindelar 0:9515d58c3408 28 #define AccTres1 (0.12)
JSindelar 0:9515d58c3408 29 #define AccTres2 (0.25)
JSindelar 0:9515d58c3408 30
JSindelar 0:9515d58c3408 31 #define MMA8451_I2C_ADDRESS (0x1d<<1)
JSindelar 0:9515d58c3408 32
JSindelar 0:9515d58c3408 33 KS0108 display (PTE22,PTE23, PTE29, PTE30, PTE20, PTE21, PTC7, PTC0, PTC3, PTC4, PTC5, PTC6, PTC10, PTC11);
JSindelar 0:9515d58c3408 34
JSindelar 0:9515d58c3408 35 //prototypes of functions
JSindelar 0:9515d58c3408 36 void DrawBorder();
JSindelar 0:9515d58c3408 37 void DrawBall(unsigned char* X, unsigned char* Y, char* dx, char* dy, unsigned char D, unsigned char PaddlePos, bool* Start, unsigned char* lifes);
JSindelar 0:9515d58c3408 38 void MovePad(unsigned char* Pad_ptr, bool Start);
JSindelar 0:9515d58c3408 39 void DrawLogo(void);
JSindelar 0:9515d58c3408 40 void DrawTable(char sc, char liv);
JSindelar 0:9515d58c3408 41 void reset(unsigned char* XBall, unsigned char* YBall, char* dxBall, char* dyBall, unsigned char* XPaddle, bool* Start, unsigned char score, unsigned char lifes);
JSindelar 0:9515d58c3408 42 void CreateGrid(unsigned char* col, unsigned char* ro);
JSindelar 0:9515d58c3408 43 void DrawBricks(unsigned char col[columns], unsigned char ro[rows]);
JSindelar 0:9515d58c3408 44
JSindelar 0:9515d58c3408 45 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
JSindelar 0:9515d58c3408 46
JSindelar 0:9515d58c3408 47 //main program
JSindelar 0:9515d58c3408 48 int main() {
JSindelar 0:9515d58c3408 49
JSindelar 0:9515d58c3408 50 display.ClearScreen();
JSindelar 0:9515d58c3408 51
JSindelar 0:9515d58c3408 52 unsigned char score = 0; //initial score and number of lifes
JSindelar 0:9515d58c3408 53 unsigned char lifes = 3;
JSindelar 0:9515d58c3408 54 DrawLogo(); //drawing ARM-kanoid title
JSindelar 0:9515d58c3408 55 DrawTable(score,lifes); //drawing table with score and number of lifes
JSindelar 0:9515d58c3408 56 DrawBorder(); //drawing border of the playing area
JSindelar 0:9515d58c3408 57
JSindelar 0:9515d58c3408 58 unsigned char XBall = XBallInit;
JSindelar 0:9515d58c3408 59 unsigned char YBall = YBallInit;
JSindelar 0:9515d58c3408 60 char Balldx = 2;
JSindelar 0:9515d58c3408 61 char Balldy = -2;
JSindelar 0:9515d58c3408 62
JSindelar 0:9515d58c3408 63 unsigned char PadPos = XPadInit; //initializing position of the paddle
JSindelar 0:9515d58c3408 64 bool StartFlag = true;
JSindelar 0:9515d58c3408 65
JSindelar 0:9515d58c3408 66 unsigned char column[columns];
JSindelar 0:9515d58c3408 67 unsigned char row[rows];
JSindelar 0:9515d58c3408 68
JSindelar 0:9515d58c3408 69 struct brick { //structure for arkanoid bricks description (along with constants brickH and brickW)
JSindelar 0:9515d58c3408 70 unsigned char Xbrick;
JSindelar 0:9515d58c3408 71 unsigned char Ybrick;
JSindelar 0:9515d58c3408 72 bool exists;
JSindelar 0:9515d58c3408 73 }BrickArray[rows][columns], cihla; //array of bricks, single brick
JSindelar 0:9515d58c3408 74
JSindelar 0:9515d58c3408 75 //struct brick (*BrickArr_ptr)[rows][columns] = &BrickArray; //pointer to array of bricks
JSindelar 0:9515d58c3408 76
JSindelar 0:9515d58c3408 77 struct brick (*BrickArr_ptr)[rows][columns];
JSindelar 0:9515d58c3408 78 BrickArr_ptr = BrickArray;
JSindelar 0:9515d58c3408 79 CreateGrid(&(column[0]), &(row[0])); //creating grid for bricks
JSindelar 0:9515d58c3408 80 DrawBricks(column, row); //drawing bricks
JSindelar 0:9515d58c3408 81
JSindelar 0:9515d58c3408 82 while(1) {
JSindelar 0:9515d58c3408 83 display.TurnOn();
JSindelar 0:9515d58c3408 84 if (StartFlag){
JSindelar 0:9515d58c3408 85 reset(&XBall, &YBall, &Balldx, &Balldy, &PadPos, &StartFlag, score, lifes);
JSindelar 0:9515d58c3408 86 }
JSindelar 0:9515d58c3408 87 DrawBall(&XBall, &YBall, &Balldx, &Balldy, BallD, PadPos, &StartFlag, &lifes); //function for drawing the ball, computing its movement, bounces etc.
JSindelar 0:9515d58c3408 88 MovePad(&PadPos, StartFlag); //function for paddle drawing and its control by accelerometer
JSindelar 0:9515d58c3408 89 wait(0.05);
JSindelar 0:9515d58c3408 90 }
JSindelar 0:9515d58c3408 91
JSindelar 0:9515d58c3408 92 }
JSindelar 0:9515d58c3408 93
JSindelar 0:9515d58c3408 94 void DrawLogo(void){
JSindelar 0:9515d58c3408 95 display.SelectFont(Arial12,BLACK,ReadData);
JSindelar 0:9515d58c3408 96 display.GotoXY(8,8);
JSindelar 0:9515d58c3408 97 display.PrintString("ARM");
JSindelar 0:9515d58c3408 98 display.GotoXY(4,24);
JSindelar 0:9515d58c3408 99 display.PrintString("kanoid");
JSindelar 0:9515d58c3408 100 }
JSindelar 0:9515d58c3408 101
JSindelar 0:9515d58c3408 102 void DrawTable(char sc, char liv){
JSindelar 0:9515d58c3408 103 static char score[5];
JSindelar 0:9515d58c3408 104 static char lifes[5];
JSindelar 0:9515d58c3408 105 display.EmptyRectangle(4,38, (maxX-6),56, BLACK);
JSindelar 0:9515d58c3408 106 display.FullRectangle(20,39,(maxX-7), 55, WHITE);
JSindelar 0:9515d58c3408 107 display.SelectFont(System5x7,BLACK,ReadData);
JSindelar 0:9515d58c3408 108 sprintf(score,"S:%2d",sc);
JSindelar 0:9515d58c3408 109 sprintf(lifes,"L:%2d",liv);
JSindelar 0:9515d58c3408 110 display.GotoXY(8,40);
JSindelar 0:9515d58c3408 111 display.PrintString(score);
JSindelar 0:9515d58c3408 112 display.GotoXY(8,48);
JSindelar 0:9515d58c3408 113 display.PrintString(lifes);
JSindelar 0:9515d58c3408 114 }
JSindelar 0:9515d58c3408 115
JSindelar 0:9515d58c3408 116 void DrawBorder(void){
JSindelar 0:9515d58c3408 117 display.HLine(maxX-2, 127,0,BLACK);
JSindelar 0:9515d58c3408 118 display.VLine(maxX-2, 0,63,BLACK);
JSindelar 0:9515d58c3408 119 display.VLine(minX+2, 0,63,BLACK);
JSindelar 0:9515d58c3408 120 }
JSindelar 0:9515d58c3408 121
JSindelar 0:9515d58c3408 122 void DrawBall(unsigned char* X, unsigned char* Y, char* dx, char* dy, unsigned char D, unsigned char PaddlePos, bool* Start, unsigned char* lifes){
JSindelar 0:9515d58c3408 123
JSindelar 0:9515d58c3408 124 display.FullCircle(*X, *Y, D, WHITE);
JSindelar 0:9515d58c3408 125
JSindelar 0:9515d58c3408 126 (*X) += (*dx);
JSindelar 0:9515d58c3408 127 (*Y) += (*dy);
JSindelar 0:9515d58c3408 128 display.FullCircle(*X, *Y, D, BLACK);
JSindelar 0:9515d58c3408 129 //if (!(*Start)){
JSindelar 0:9515d58c3408 130 if ((((unsigned char)(*X+D)) >= minX)||(((char)(*X-D)) <= maxX)){
JSindelar 0:9515d58c3408 131 *dx = -(*dx);
JSindelar 0:9515d58c3408 132 }
JSindelar 0:9515d58c3408 133
JSindelar 0:9515d58c3408 134 if (((unsigned char)(*Y-D)) <= minY){
JSindelar 0:9515d58c3408 135 *dy = -(*dy);
JSindelar 0:9515d58c3408 136 }
JSindelar 0:9515d58c3408 137 if (((char)(*Y+D)) >= PadY){
JSindelar 0:9515d58c3408 138 if ((((unsigned char)(*X+D)) <= (PaddlePos+PadLength+2))&&(((unsigned char)(*X-D)) >= (PaddlePos-2))){
JSindelar 0:9515d58c3408 139 *dy = -(*dy);
JSindelar 0:9515d58c3408 140 }else{
JSindelar 0:9515d58c3408 141 if (*lifes > 1){
JSindelar 0:9515d58c3408 142 (*lifes)--;
JSindelar 0:9515d58c3408 143 *Start = true;
JSindelar 0:9515d58c3408 144 }else{
JSindelar 0:9515d58c3408 145 //doplnit kod na game over
JSindelar 0:9515d58c3408 146 }
JSindelar 0:9515d58c3408 147 }
JSindelar 0:9515d58c3408 148 }
JSindelar 0:9515d58c3408 149
JSindelar 0:9515d58c3408 150 }
JSindelar 0:9515d58c3408 151
JSindelar 0:9515d58c3408 152 void MovePad(unsigned char* Pad_ptr, bool Start){
JSindelar 0:9515d58c3408 153 unsigned char PaddleDif;
JSindelar 0:9515d58c3408 154 if ((abs(acc.getAccY()))>AccTres1){
JSindelar 0:9515d58c3408 155 display.FullRectangle(*Pad_ptr, PadY, *Pad_ptr+PadLength ,PadY+2,WHITE);
JSindelar 0:9515d58c3408 156 if(Start){
JSindelar 0:9515d58c3408 157 *Pad_ptr = XPadInit;
JSindelar 0:9515d58c3408 158 }else{
JSindelar 0:9515d58c3408 159 if ((abs(acc.getAccY()))>AccTres2){
JSindelar 0:9515d58c3408 160 PaddleDif = HighSpeed;
JSindelar 0:9515d58c3408 161 }else{
JSindelar 0:9515d58c3408 162 PaddleDif = LowSpeed;
JSindelar 0:9515d58c3408 163 }
JSindelar 0:9515d58c3408 164 if ((acc.getAccY() > 0)&&((*Pad_ptr+PadLength) < (minX - 3))){
JSindelar 0:9515d58c3408 165 *Pad_ptr += PaddleDif;
JSindelar 0:9515d58c3408 166 }
JSindelar 0:9515d58c3408 167 if ((acc.getAccY() < 0)&&(*Pad_ptr > (maxX + 1))){
JSindelar 0:9515d58c3408 168 *Pad_ptr -= PaddleDif;
JSindelar 0:9515d58c3408 169 }
JSindelar 0:9515d58c3408 170 }
JSindelar 0:9515d58c3408 171 }
JSindelar 0:9515d58c3408 172 display.FullRectangle(*Pad_ptr, PadY, *Pad_ptr+PadLength ,PadY+2,BLACK);
JSindelar 0:9515d58c3408 173 }
JSindelar 0:9515d58c3408 174
JSindelar 0:9515d58c3408 175 void reset(unsigned char* XBall, unsigned char* YBall, char* dxBall, char* dyBall, unsigned char* XPaddle, bool* Start, unsigned char score, unsigned char lifes){
JSindelar 0:9515d58c3408 176 display.FullCircle(*XBall, *YBall, BallD, WHITE);
JSindelar 0:9515d58c3408 177 *XBall = XBallInit;
JSindelar 0:9515d58c3408 178 *YBall = YBallInit;
JSindelar 0:9515d58c3408 179 display.FullRectangle(*XPaddle, PadY, *XPaddle+PadLength ,PadY+2,WHITE);
JSindelar 0:9515d58c3408 180 *XPaddle = XPadInit;
JSindelar 0:9515d58c3408 181 wait(1);
JSindelar 0:9515d58c3408 182 display.FullCircle(*XBall, *YBall, BallD, BLACK);
JSindelar 0:9515d58c3408 183 display.FullRectangle(*XPaddle, PadY, *XPaddle+PadLength ,PadY+2,BLACK);
JSindelar 0:9515d58c3408 184 DrawTable(score, lifes);
JSindelar 0:9515d58c3408 185 *dxBall = 2;
JSindelar 0:9515d58c3408 186 *dyBall = -2;
JSindelar 0:9515d58c3408 187 *Start = false;
JSindelar 0:9515d58c3408 188 wait(1);
JSindelar 0:9515d58c3408 189 }
JSindelar 0:9515d58c3408 190
JSindelar 0:9515d58c3408 191 void CreateGrid(unsigned char* col, unsigned char* ro){
JSindelar 0:9515d58c3408 192 char i;
JSindelar 0:9515d58c3408 193 for (i = 0; i < columns; i++){
JSindelar 0:9515d58c3408 194 *(col+i) = maxX + i*(BrickW + 2);
JSindelar 0:9515d58c3408 195 }
JSindelar 0:9515d58c3408 196 for (i = 0; i < columns; i++){
JSindelar 0:9515d58c3408 197 *(ro+i) = minY + i*(BrickH + 2);
JSindelar 0:9515d58c3408 198 }
JSindelar 0:9515d58c3408 199 }
JSindelar 0:9515d58c3408 200
JSindelar 0:9515d58c3408 201 void DrawBricks(unsigned char col[columns], unsigned char ro[rows]){
JSindelar 0:9515d58c3408 202 struct brick {
JSindelar 0:9515d58c3408 203 unsigned char Xbrick;
JSindelar 0:9515d58c3408 204 unsigned char Ybrick;
JSindelar 0:9515d58c3408 205 bool exists;
JSindelar 0:9515d58c3408 206 }BrickArray[rows][columns], cihla;
JSindelar 0:9515d58c3408 207
JSindelar 0:9515d58c3408 208 char i;
JSindelar 0:9515d58c3408 209 char j;
JSindelar 0:9515d58c3408 210 for (j = 0; j < rows; j++){
JSindelar 0:9515d58c3408 211 for (i = 0; i < columns; i++){
JSindelar 0:9515d58c3408 212 cihla.Xbrick = col[i];
JSindelar 0:9515d58c3408 213 cihla.Ybrick = ro[j];
JSindelar 0:9515d58c3408 214 cihla.exists = true;
JSindelar 0:9515d58c3408 215 BrickArray[j][i] = cihla;
JSindelar 0:9515d58c3408 216 display.FullRectangle(cihla.Xbrick,cihla.Ybrick, (cihla.Xbrick + BrickW), (cihla.Ybrick + BrickH) ,((cihla.exists)? BLACK:WHITE));
JSindelar 0:9515d58c3408 217 }
JSindelar 0:9515d58c3408 218 }
JSindelar 0:9515d58c3408 219 }
JSindelar 0:9515d58c3408 220
JSindelar 0:9515d58c3408 221 void BounceBricks(unsigned char* XBall, unsigned char* YBall, char* dxBall, char* dyBall, struct brick* ArrayOfBricks, struct brick* ExBrick, unsigned char ro[rows], unsigned char col[columns], char* dx, char* dy, unsigned char* score){
JSindelar 0:9515d58c3408 222 if (*YBall <= ro[rows-1]){
JSindelar 0:9515d58c3408 223 char i, j;
JSindelar 0:9515d58c3408 224 for (i = columns - 1; i >= 0; i--){
JSindelar 0:9515d58c3408 225 if (*XBall >= col[i]){
JSindelar 0:9515d58c3408 226 break;
JSindelar 0:9515d58c3408 227 }
JSindelar 0:9515d58c3408 228 }
JSindelar 0:9515d58c3408 229 for (j = rows - 1; j >= 0; j--){
JSindelar 0:9515d58c3408 230 if (*YBall >= ro[j]){
JSindelar 0:9515d58c3408 231 break;
JSindelar 0:9515d58c3408 232 }
JSindelar 0:9515d58c3408 233 }
JSindelar 0:9515d58c3408 234
JSindelar 0:9515d58c3408 235 if ((*ArrayOfBricks)[i][j].exists){
JSindelar 0:9515d58c3408 236 (ArrayOfBricks)[i][j].exists = false;
JSindelar 0:9515d58c3408 237 *score++;
JSindelar 0:9515d58c3408 238 *dy = -(*dy);
JSindelar 0:9515d58c3408 239 }
JSindelar 0:9515d58c3408 240 }
JSindelar 0:9515d58c3408 241 }
JSindelar 0:9515d58c3408 242 */