more comments

Dependencies:   TSI TextLCD mbed

Fork of CarGame by Dan James

Committer:
mengelcke
Date:
Fri May 03 11:19:48 2013 +0000
Revision:
2:f5abfdfe9e0b
Parent:
1:d55966246784
revised with more comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mengelcke 2:f5abfdfe9e0b 1 /* CarGame has the aim of trying to avoid obstacles on two lanes for as long as possbile.
mengelcke 2:f5abfdfe9e0b 2 The speed increases as the game progresses and when you die you are able to see your score. */
mengelcke 2:f5abfdfe9e0b 3
DanielOJ 0:0e59bc451a57 4 #include "mbed.h"
DanielOJ 0:0e59bc451a57 5 #include "TextLCD.h"
DanielOJ 0:0e59bc451a57 6 #include "TSISensor.h"
DanielOJ 0:0e59bc451a57 7
mengelcke 2:f5abfdfe9e0b 8 // initialise LCD display
mengelcke 2:f5abfdfe9e0b 9 TextLCD lcd(PTA1,PTA2,PTD4,PTA12,PTA4,PTA5); // rs, e, d4-d7
mengelcke 2:f5abfdfe9e0b 10
DanielOJ 0:0e59bc451a57 11 // number of seconds to wait between each frame movement
DanielOJ 0:0e59bc451a57 12 float frameTime = 1;
mengelcke 2:f5abfdfe9e0b 13
DanielOJ 0:0e59bc451a57 14 // number of frames since speed increase
DanielOJ 0:0e59bc451a57 15 int steps = 0;
mengelcke 2:f5abfdfe9e0b 16
DanielOJ 0:0e59bc451a57 17 // number of frames in total
DanielOJ 0:0e59bc451a57 18 int score = 0;
mengelcke 2:f5abfdfe9e0b 19
DanielOJ 0:0e59bc451a57 20 // size of course
DanielOJ 0:0e59bc451a57 21 int courseSize = 48;
DanielOJ 0:0e59bc451a57 22
DanielOJ 0:0e59bc451a57 23 int main()
DanielOJ 0:0e59bc451a57 24 {
DanielOJ 0:0e59bc451a57 25 // set up course
DanielOJ 0:0e59bc451a57 26 char course[courseSize][2];
DanielOJ 0:0e59bc451a57 27
DanielOJ 0:0e59bc451a57 28 // blank course to start with
mengelcke 2:f5abfdfe9e0b 29 for(int i = 0; i < courseSize; i++)
mengelcke 2:f5abfdfe9e0b 30 {
DanielOJ 0:0e59bc451a57 31 course[i][0] = ' ';
DanielOJ 0:0e59bc451a57 32 course[i][1] = ' ';
DanielOJ 0:0e59bc451a57 33 }
DanielOJ 0:0e59bc451a57 34
mengelcke 2:f5abfdfe9e0b 35 // obstacle course
DanielOJ 0:0e59bc451a57 36 course[3][0] = '0';
DanielOJ 0:0e59bc451a57 37 course[6][1] = '0';
DanielOJ 0:0e59bc451a57 38 course[9][1] = '0';
DanielOJ 0:0e59bc451a57 39 course[12][0] = '0';
DanielOJ 0:0e59bc451a57 40 course[15][1] = '0';
DanielOJ 0:0e59bc451a57 41 course[16][1] = '0';
DanielOJ 0:0e59bc451a57 42 course[19][0] = '0';
DanielOJ 0:0e59bc451a57 43 course[21][1] = '0';
DanielOJ 0:0e59bc451a57 44 course[23][0] = '0';
DanielOJ 0:0e59bc451a57 45 course[24][0] = '0';
DanielOJ 0:0e59bc451a57 46 course[29][1] = '0';
DanielOJ 0:0e59bc451a57 47 course[33][0] = '0';
DanielOJ 0:0e59bc451a57 48 course[35][0] = '0';
DanielOJ 0:0e59bc451a57 49 course[37][0] = '0';
DanielOJ 0:0e59bc451a57 50 course[40][1] = '0';
DanielOJ 0:0e59bc451a57 51 course[43][0] = '0';
DanielOJ 0:0e59bc451a57 52 course[46][1] = '0';
DanielOJ 0:0e59bc451a57 53
DanielOJ 0:0e59bc451a57 54 // set up LED output
DanielOJ 0:0e59bc451a57 55 PwmOut led(LED_GREEN);
DanielOJ 0:0e59bc451a57 56 // set up touch sensor to control game
DanielOJ 0:0e59bc451a57 57 TSISensor tsi;
DanielOJ 0:0e59bc451a57 58
mengelcke 2:f5abfdfe9e0b 59 int gameover = 0; // define a 'gameover' flag
DanielOJ 0:0e59bc451a57 60
DanielOJ 0:0e59bc451a57 61 // game loop
mengelcke 2:f5abfdfe9e0b 62 while(1)
mengelcke 2:f5abfdfe9e0b 63 {
DanielOJ 0:0e59bc451a57 64
DanielOJ 0:0e59bc451a57 65 // print current course on lcd
mengelcke 2:f5abfdfe9e0b 66 for(int i = 15; i >= 0; i--)
mengelcke 2:f5abfdfe9e0b 67 {
DanielOJ 0:0e59bc451a57 68 lcd.locate(i,0);
DanielOJ 0:0e59bc451a57 69 lcd.printf("%c",course[i][0]);
DanielOJ 0:0e59bc451a57 70 lcd.locate(i,1);
DanielOJ 0:0e59bc451a57 71 lcd.printf("%c",course[i][1]);
DanielOJ 0:0e59bc451a57 72 }
DanielOJ 0:0e59bc451a57 73
DanielOJ 0:0e59bc451a57 74 // create next frame of course
DanielOJ 0:0e59bc451a57 75 // course loops round infinitely
DanielOJ 0:0e59bc451a57 76
DanielOJ 0:0e59bc451a57 77 // these are rows that will be pushed off top of screen
DanielOJ 0:0e59bc451a57 78 // save them so they can be put at bottom once finished
DanielOJ 0:0e59bc451a57 79 char toprow1 = course[courseSize-1][0];
DanielOJ 0:0e59bc451a57 80 char toprow2 = course[courseSize-1][1];
DanielOJ 0:0e59bc451a57 81
DanielOJ 0:0e59bc451a57 82 // shift each row up 1
mengelcke 2:f5abfdfe9e0b 83 for(int i = courseSize-1; i >= 0; i--)
mengelcke 2:f5abfdfe9e0b 84 {
DanielOJ 0:0e59bc451a57 85 course[i][0] = course[i-1][0];
DanielOJ 0:0e59bc451a57 86 course[i][1] = course[i-1][1];
DanielOJ 0:0e59bc451a57 87 }
DanielOJ 0:0e59bc451a57 88
DanielOJ 0:0e59bc451a57 89 // set bottom rows as the top rows that have been pushed off
DanielOJ 0:0e59bc451a57 90 course[0][0] = toprow1;
DanielOJ 0:0e59bc451a57 91 course[0][1] = toprow2;
DanielOJ 0:0e59bc451a57 92
DanielOJ 0:0e59bc451a57 93 // game control
DanielOJ 0:0e59bc451a57 94 // what to do if controller is on right
DanielOJ 1:d55966246784 95
mengelcke 2:f5abfdfe9e0b 96 if (tsi.readPercentage() >= 0.5)
mengelcke 2:f5abfdfe9e0b 97 { // if on one side of touchpad
DanielOJ 0:0e59bc451a57 98 // go to column
DanielOJ 0:0e59bc451a57 99 lcd.locate(15,1);
DanielOJ 0:0e59bc451a57 100 // print game character
DanielOJ 0:0e59bc451a57 101 lcd.printf("%c",'<');
DanielOJ 0:0e59bc451a57 102
DanielOJ 0:0e59bc451a57 103 // check whether there is collision
DanielOJ 0:0e59bc451a57 104 if(course[15][1] == '0')
DanielOJ 0:0e59bc451a57 105 {
DanielOJ 0:0e59bc451a57 106 // clear screen
DanielOJ 0:0e59bc451a57 107 lcd.cls();
DanielOJ 0:0e59bc451a57 108 // let user know game is over
DanielOJ 0:0e59bc451a57 109 lcd.printf("Game Over!!\n Score %d", score);
DanielOJ 0:0e59bc451a57 110 gameover = 1;
DanielOJ 0:0e59bc451a57 111 }
DanielOJ 0:0e59bc451a57 112 }
DanielOJ 0:0e59bc451a57 113
DanielOJ 0:0e59bc451a57 114 // when controller is on left
mengelcke 2:f5abfdfe9e0b 115 else
mengelcke 2:f5abfdfe9e0b 116 {
DanielOJ 0:0e59bc451a57 117 // go to column
DanielOJ 0:0e59bc451a57 118 lcd.locate(15,0);
DanielOJ 0:0e59bc451a57 119 // print game character
DanielOJ 0:0e59bc451a57 120 lcd.printf("%c",'<');
DanielOJ 0:0e59bc451a57 121
DanielOJ 0:0e59bc451a57 122 // check whether there is collision
DanielOJ 0:0e59bc451a57 123 if(course[15][0] == '0')
DanielOJ 0:0e59bc451a57 124 {
DanielOJ 0:0e59bc451a57 125 // clear screen
DanielOJ 0:0e59bc451a57 126 lcd.cls();
DanielOJ 0:0e59bc451a57 127 // let user know game is over
DanielOJ 0:0e59bc451a57 128 lcd.printf("Game Over!!\n Score %d", score);
DanielOJ 0:0e59bc451a57 129 gameover = 1;
DanielOJ 0:0e59bc451a57 130 }
DanielOJ 0:0e59bc451a57 131 }
DanielOJ 0:0e59bc451a57 132
mengelcke 2:f5abfdfe9e0b 133 // delay between each frame
mengelcke 2:f5abfdfe9e0b 134 wait(frameTime);
mengelcke 2:f5abfdfe9e0b 135 // add to steps
mengelcke 2:f5abfdfe9e0b 136 steps++;
mengelcke 2:f5abfdfe9e0b 137 // add to score
mengelcke 2:f5abfdfe9e0b 138 score++;
mengelcke 2:f5abfdfe9e0b 139
mengelcke 2:f5abfdfe9e0b 140 // check whether enough steps completed to speed game up
mengelcke 2:f5abfdfe9e0b 141 if(steps > 5) {
DanielOJ 0:0e59bc451a57 142 frameTime -= 0.05;
DanielOJ 0:0e59bc451a57 143 // reset number of steps
DanielOJ 0:0e59bc451a57 144 steps = 0;
mengelcke 2:f5abfdfe9e0b 145 }
DanielOJ 0:0e59bc451a57 146
mengelcke 2:f5abfdfe9e0b 147 // return all variables to initial values when game is lost
mengelcke 2:f5abfdfe9e0b 148 if(gameover == 1)
mengelcke 2:f5abfdfe9e0b 149 {
mengelcke 2:f5abfdfe9e0b 150 wait(10);
mengelcke 2:f5abfdfe9e0b 151 gameover = 0;
mengelcke 2:f5abfdfe9e0b 152 score = 0;
mengelcke 2:f5abfdfe9e0b 153 frameTime = 1;
mengelcke 2:f5abfdfe9e0b 154 }
DanielOJ 0:0e59bc451a57 155 }
DanielOJ 0:0e59bc451a57 156 }