Simple fish eat program

Dependencies:   mbed mbed-rtos N5110 ShiftReg Tone

Committer:
el18a2k
Date:
Wed Apr 21 11:08:02 2021 +0000
Revision:
11:7c1e2a9303d3
Parent:
10:e221bd1ce3ec
Child:
12:20ac766b3175
highscore file writing complete

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el18a2k 1:7dfa61225fcf 1 #include "FishEngine.h"
el18a2k 1:7dfa61225fcf 2
el18a2k 2:532b0225519f 3 #define UP 0
el18a2k 2:532b0225519f 4 #define DOWN 1
el18a2k 2:532b0225519f 5 #define CENTRE 2
el18a2k 2:532b0225519f 6
el18a2k 2:532b0225519f 7 //objects
el18a2k 10:e221bd1ce3ec 8 Game game;
el18a2k 6:7aafcaf7cbe2 9 Settings settings;
el18a2k 1:7dfa61225fcf 10 Graphics graphics;
el18a2k 11:7c1e2a9303d3 11 HighScore highscore;
el18a2k 1:7dfa61225fcf 12
el18a2k 6:7aafcaf7cbe2 13 int ButtonA;
el18a2k 6:7aafcaf7cbe2 14 int ButtonB;
el18a2k 1:7dfa61225fcf 15
el18a2k 2:532b0225519f 16 // creates intro sequence
el18a2k 1:7dfa61225fcf 17 void FishEngine::titleSequence(N5110 &lcd){
el18a2k 1:7dfa61225fcf 18 lcd.clear();
el18a2k 2:532b0225519f 19 graphics.titleScreen(lcd); //prints titlescreen (held in graphics.h)
el18a2k 1:7dfa61225fcf 20 lcd.refresh();
el18a2k 2:532b0225519f 21 wait_ms(2000);
el18a2k 1:7dfa61225fcf 22
el18a2k 6:7aafcaf7cbe2 23 while(settings.buttonA_state(ButtonA) == 0){
el18a2k 1:7dfa61225fcf 24 lcd.clear();
el18a2k 2:532b0225519f 25 graphics.confirmationScreen(lcd); //calls confirmation function (held in graphics.h)
el18a2k 1:7dfa61225fcf 26 lcd.refresh();
el18a2k 1:7dfa61225fcf 27 wait_ms(1000/10);
el18a2k 1:7dfa61225fcf 28 }
el18a2k 1:7dfa61225fcf 29
el18a2k 2:532b0225519f 30 graphics.screenFlash(lcd); //calls screen flash function (held in graphics.h)
el18a2k 1:7dfa61225fcf 31 lcd.refresh();
el18a2k 1:7dfa61225fcf 32 }
el18a2k 1:7dfa61225fcf 33
el18a2k 10:e221bd1ce3ec 34 void FishEngine::gamePlay(N5110 &lcd, Tone &dac, Joystick &joystick){
el18a2k 10:e221bd1ce3ec 35 game.init(lcd, 20, 20, 1);
el18a2k 10:e221bd1ce3ec 36
el18a2k 10:e221bd1ce3ec 37 do{
el18a2k 10:e221bd1ce3ec 38 DIRECTION direction = {joystick.get_direction()};
el18a2k 10:e221bd1ce3ec 39 game.gamePlay(lcd, direction);
el18a2k 11:7c1e2a9303d3 40 playerScore = game.Score(lcd);
el18a2k 10:e221bd1ce3ec 41
el18a2k 10:e221bd1ce3ec 42 }while(game.Lives() != 0);
el18a2k 11:7c1e2a9303d3 43
el18a2k 11:7c1e2a9303d3 44 fileValue = highscore.read_File();
el18a2k 11:7c1e2a9303d3 45
el18a2k 11:7c1e2a9303d3 46 if(playerScore > fileValue){
el18a2k 11:7c1e2a9303d3 47 highscore.write_File(playerScore);
el18a2k 11:7c1e2a9303d3 48 lcd.clear();
el18a2k 11:7c1e2a9303d3 49 lcd.printString("New Score", 5, 1);
el18a2k 11:7c1e2a9303d3 50 lcd.refresh();
el18a2k 11:7c1e2a9303d3 51 wait_ms(1000);
el18a2k 11:7c1e2a9303d3 52 }
el18a2k 11:7c1e2a9303d3 53 }
el18a2k 11:7c1e2a9303d3 54
el18a2k 11:7c1e2a9303d3 55 void FishEngine::highScore(N5110 &lcd){
el18a2k 11:7c1e2a9303d3 56 do{
el18a2k 11:7c1e2a9303d3 57 highscore.display_File(lcd);
el18a2k 11:7c1e2a9303d3 58 }while(settings.buttonB_state(ButtonB) == false);
el18a2k 10:e221bd1ce3ec 59 }
el18a2k 10:e221bd1ce3ec 60
el18a2k 8:fe51fbf81dee 61 void FishEngine::Instructions(N5110 &lcd){
el18a2k 8:fe51fbf81dee 62 do{
el18a2k 8:fe51fbf81dee 63 lcd.clear();
el18a2k 8:fe51fbf81dee 64 lcd.printString(" -- Welcome --",0,0);
el18a2k 8:fe51fbf81dee 65 lcd.printString("Use the",0,2);
el18a2k 8:fe51fbf81dee 66 lcd.printString("joystick to ",0,3);
el18a2k 8:fe51fbf81dee 67 lcd.printString("move the fish",0,4);
el18a2k 8:fe51fbf81dee 68 lcd.refresh();
el18a2k 8:fe51fbf81dee 69
el18a2k 8:fe51fbf81dee 70 wait_ms(2000);
el18a2k 8:fe51fbf81dee 71
el18a2k 8:fe51fbf81dee 72 lcd.clear();
el18a2k 8:fe51fbf81dee 73 lcd.printString("remeber to",0,1);
el18a2k 8:fe51fbf81dee 74 lcd.printString("only eat fish",0,2);
el18a2k 8:fe51fbf81dee 75 lcd.printString("smaller than",0,3);
el18a2k 8:fe51fbf81dee 76 lcd.printString("you!!",0,4);
el18a2k 8:fe51fbf81dee 77 lcd.refresh();
el18a2k 8:fe51fbf81dee 78
el18a2k 8:fe51fbf81dee 79 wait_ms(2000);
el18a2k 8:fe51fbf81dee 80
el18a2k 8:fe51fbf81dee 81 lcd.clear();
el18a2k 8:fe51fbf81dee 82 lcd.printString("Hold B to Exit",0,2);
el18a2k 8:fe51fbf81dee 83 lcd.refresh();
el18a2k 8:fe51fbf81dee 84
el18a2k 8:fe51fbf81dee 85 wait_ms(2000);
el18a2k 8:fe51fbf81dee 86
el18a2k 8:fe51fbf81dee 87 }while(settings.buttonB_state(ButtonB) == false);
el18a2k 8:fe51fbf81dee 88 }
el18a2k 8:fe51fbf81dee 89
el18a2k 2:532b0225519f 90 // creates the games main menu screen with scrolling ability through the use of a
el18a2k 2:532b0225519f 91 // state machine.
el18a2k 2:532b0225519f 92 void FishEngine::mainMenu(N5110 &lcd, Tone &dac, Joystick &joystick){
el18a2k 2:532b0225519f 93 const int Fish_1[4][9]= {
el18a2k 2:532b0225519f 94 { 1,0,0,1,1,1,1,1,0, },
el18a2k 2:532b0225519f 95 { 1,1,1,1,1,1,1,0,1, },
el18a2k 2:532b0225519f 96 { 1,1,1,1,1,1,1,1,1, },
el18a2k 2:532b0225519f 97 { 1,0,0,1,1,1,1,1,0, },
el18a2k 2:532b0225519f 98 };
el18a2k 2:532b0225519f 99
el18a2k 2:532b0225519f 100 // outputs for the state machine are used to draw Fish_1 beside the corrosponding
el18a2k 2:532b0225519f 101 // menu choice
el18a2k 2:532b0225519f 102 int g_menu_output[4] = {10, 18, 26, 34};
el18a2k 2:532b0225519f 103 int state = 0; //set inital state to 0
el18a2k 2:532b0225519f 104 int direction = CENTRE; //set inital direction to remain on that state until an input is received
el18a2k 2:532b0225519f 105 int y_pos;
el18a2k 2:532b0225519f 106
el18a2k 2:532b0225519f 107 while(1){
el18a2k 2:532b0225519f 108 lcd.clear();
el18a2k 2:532b0225519f 109 lcd.drawRect(0,0,84,48,FILL_TRANSPARENT); //draws screen border
el18a2k 2:532b0225519f 110
el18a2k 2:532b0225519f 111 //prints players options
el18a2k 2:532b0225519f 112 lcd.printString("New Game", 15, 1);
el18a2k 2:532b0225519f 113 lcd.printString("High Score", 15, 2);
el18a2k 2:532b0225519f 114 lcd.printString("How to Play", 15, 3);
el18a2k 2:532b0225519f 115 lcd.printString("Settings", 15, 4);
el18a2k 2:532b0225519f 116
el18a2k 2:532b0225519f 117
el18a2k 2:532b0225519f 118 /*implementation of state machine allows the determination of the position of the fish marker
el18a2k 2:532b0225519f 119 based on the users joystick input:
el18a2k 2:532b0225519f 120
el18a2k 2:532b0225519f 121 inputs
el18a2k 2:532b0225519f 122 state 0 1 2 where 0 is UP and 1 is DOWN 2 is CENTRE
el18a2k 2:532b0225519f 123
el18a2k 2:532b0225519f 124 0 3 1 0
el18a2k 2:532b0225519f 125 1 0 2 1
el18a2k 2:532b0225519f 126 2 1 3 2
el18a2k 2:532b0225519f 127 3 2 0 3 */
el18a2k 2:532b0225519f 128
el18a2k 2:532b0225519f 129
el18a2k 2:532b0225519f 130 if(joystick.get_direction() == N){ //if the joystick is moved upward, then direction is UP
el18a2k 2:532b0225519f 131 direction = UP;
el18a2k 2:532b0225519f 132 }else if (joystick.get_direction() == S){//if the joystick is moved downward, then direction is DOWN
el18a2k 2:532b0225519f 133 direction = DOWN;
el18a2k 2:532b0225519f 134 }else{
el18a2k 2:532b0225519f 135 direction = CENTRE; //if the joystick is left in the centre position then direction is CENTRE
el18a2k 2:532b0225519f 136 };
el18a2k 2:532b0225519f 137
el18a2k 2:532b0225519f 138 y_pos = g_menu_output[state];//y_position is the array output at position 'state'
el18a2k 2:532b0225519f 139
el18a2k 2:532b0225519f 140
el18a2k 2:532b0225519f 141 //implement state machine
el18a2k 2:532b0225519f 142 switch(state) {
el18a2k 4:db929dab4f13 143
el18a2k 4:db929dab4f13 144 //case for new game
el18a2k 2:532b0225519f 145 case 0:
el18a2k 6:7aafcaf7cbe2 146 if(settings.buttonA_state(ButtonA)){
el18a2k 10:e221bd1ce3ec 147 graphics.screenFlash(lcd);
el18a2k 10:e221bd1ce3ec 148 gamePlay(lcd, dac, joystick);
el18a2k 4:db929dab4f13 149 }
el18a2k 2:532b0225519f 150 switch(direction) {
el18a2k 2:532b0225519f 151 case UP:
el18a2k 2:532b0225519f 152 state = 3;
el18a2k 2:532b0225519f 153 break;
el18a2k 2:532b0225519f 154 case DOWN:
el18a2k 2:532b0225519f 155 state = 1;
el18a2k 2:532b0225519f 156 break;
el18a2k 2:532b0225519f 157 case CENTRE:
el18a2k 2:532b0225519f 158 state = 0;
el18a2k 2:532b0225519f 159 break;
el18a2k 2:532b0225519f 160 }
el18a2k 2:532b0225519f 161 break;
el18a2k 4:db929dab4f13 162
el18a2k 4:db929dab4f13 163 //case for HighScore
el18a2k 2:532b0225519f 164 case 1:
el18a2k 6:7aafcaf7cbe2 165 if(settings.buttonA_state(ButtonA)){
el18a2k 11:7c1e2a9303d3 166 graphics.screenFlash(lcd);
el18a2k 11:7c1e2a9303d3 167 highScore(lcd);
el18a2k 4:db929dab4f13 168 }
el18a2k 2:532b0225519f 169 switch(direction) {
el18a2k 2:532b0225519f 170 case UP:
el18a2k 2:532b0225519f 171 state = 0;
el18a2k 2:532b0225519f 172 break;
el18a2k 2:532b0225519f 173 case DOWN:
el18a2k 2:532b0225519f 174 state = 2;
el18a2k 2:532b0225519f 175 break;
el18a2k 2:532b0225519f 176 case CENTRE:
el18a2k 2:532b0225519f 177 state = 1;
el18a2k 2:532b0225519f 178 break;
el18a2k 2:532b0225519f 179 }
el18a2k 2:532b0225519f 180 break;
el18a2k 4:db929dab4f13 181
el18a2k 4:db929dab4f13 182 //case for how to play
el18a2k 2:532b0225519f 183 case 2:
el18a2k 6:7aafcaf7cbe2 184 if(settings.buttonA_state(ButtonA)){
el18a2k 8:fe51fbf81dee 185 graphics.screenFlash(lcd);
el18a2k 4:db929dab4f13 186 Instructions(lcd);
el18a2k 4:db929dab4f13 187 }
el18a2k 2:532b0225519f 188 switch(direction) {
el18a2k 2:532b0225519f 189 case UP:
el18a2k 2:532b0225519f 190 state = 1;
el18a2k 2:532b0225519f 191 break;
el18a2k 2:532b0225519f 192 case DOWN:
el18a2k 2:532b0225519f 193 state = 3;
el18a2k 2:532b0225519f 194 break;
el18a2k 2:532b0225519f 195 case CENTRE:
el18a2k 2:532b0225519f 196 state = 2;
el18a2k 2:532b0225519f 197 break;
el18a2k 2:532b0225519f 198 }
el18a2k 2:532b0225519f 199 break;
el18a2k 4:db929dab4f13 200
el18a2k 4:db929dab4f13 201 //case for settings
el18a2k 2:532b0225519f 202 case 3:
el18a2k 6:7aafcaf7cbe2 203 if(settings.buttonA_state(ButtonA)){
el18a2k 6:7aafcaf7cbe2 204 graphics.screenFlash(lcd);
el18a2k 6:7aafcaf7cbe2 205 settings.settingsMenu(lcd, dac, joystick);
el18a2k 4:db929dab4f13 206 }
el18a2k 2:532b0225519f 207 switch(direction) {
el18a2k 2:532b0225519f 208 case UP:
el18a2k 2:532b0225519f 209 state = 2;
el18a2k 2:532b0225519f 210 break;
el18a2k 2:532b0225519f 211 case DOWN:
el18a2k 2:532b0225519f 212 state = 0;
el18a2k 2:532b0225519f 213 break;
el18a2k 2:532b0225519f 214 case CENTRE:
el18a2k 2:532b0225519f 215 state = 3;
el18a2k 2:532b0225519f 216 break;
el18a2k 4:db929dab4f13 217
el18a2k 2:532b0225519f 218 }
el18a2k 2:532b0225519f 219 break;
el18a2k 2:532b0225519f 220 default:
el18a2k 2:532b0225519f 221 state = 0;
el18a2k 2:532b0225519f 222 break;
el18a2k 2:532b0225519f 223 }
el18a2k 2:532b0225519f 224
el18a2k 2:532b0225519f 225 //draw sprite at position (3, y_pos)
el18a2k 2:532b0225519f 226 lcd.drawSprite(3, y_pos, 4, 9, (int*)Fish_1);
el18a2k 2:532b0225519f 227 lcd.refresh();
el18a2k 2:532b0225519f 228 wait_ms(500);
el18a2k 2:532b0225519f 229 }
el18a2k 8:fe51fbf81dee 230 }