more comments
Dependencies: TSI TextLCD mbed
Fork of CarGame by
main.cpp@2:f5abfdfe9e0b, 2013-05-03 (annotated)
- 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?
User | Revision | Line number | New 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 | } |