ELEC2645 (2017/18) / Mbed OS el16ajm
Committer:
Andrew_M
Date:
Mon May 07 19:41:09 2018 +0000
Revision:
13:81573be8fac6
Parent:
12:d3eef5ea3f43
Child:
14:a57a40ff9430
Restructuring and reorganising of code, adaptive difficulty doesn't work as intended and needs reworking. Sound effect has been added when food is consumed and menu items are selected. Game is finished, code needs further organisation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Andrew_M 0:66e5b37c127e 1 /*
Andrew_M 0:66e5b37c127e 2 ELEC2645 Embedded Systems Project
Andrew_M 0:66e5b37c127e 3 School of Electronic & Electrical Engineering
Andrew_M 0:66e5b37c127e 4 University of Leeds
Andrew_M 2:9ca5e1c221c3 5 Name: Andrew Moore
Andrew_M 2:9ca5e1c221c3 6 Username: el16ajm
Andrew_M 2:9ca5e1c221c3 7 Student ID Number: 201042893
Andrew_M 8:9d01fd4a63ad 8 Date:
Andrew_M 0:66e5b37c127e 9 */
Andrew_M 0:66e5b37c127e 10
Andrew_M 0:66e5b37c127e 11 #include "mbed.h"
Andrew_M 1:a14415de3ad5 12 #include "Gamepad.h"
Andrew_M 1:a14415de3ad5 13 #include "N5110.h"
Andrew_M 1:a14415de3ad5 14 #include "Engine.h"
Andrew_M 9:fe86ddbf7799 15 #include "Menu.h"
Andrew_M 0:66e5b37c127e 16
Andrew_M 1:a14415de3ad5 17 /////////////// structs /////////////////
Andrew_M 1:a14415de3ad5 18 struct UserInput {
Andrew_M 1:a14415de3ad5 19 Direction d;
Andrew_M 1:a14415de3ad5 20 };
Andrew_M 1:a14415de3ad5 21
Andrew_M 1:a14415de3ad5 22 /////////////// objects ///////////////
Andrew_M 1:a14415de3ad5 23 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
Andrew_M 1:a14415de3ad5 24 Gamepad pad;
Andrew_M 1:a14415de3ad5 25 Engine gameEngine;
Andrew_M 9:fe86ddbf7799 26 Menu mainMenu;
Andrew_M 0:66e5b37c127e 27
Andrew_M 1:a14415de3ad5 28 ///////////// prototypes ///////////////
Andrew_M 1:a14415de3ad5 29 void init();
Andrew_M 1:a14415de3ad5 30 void update_game(UserInput input);
Andrew_M 9:fe86ddbf7799 31 void renderGame();
Andrew_M 9:fe86ddbf7799 32 void renderMenu();
Andrew_M 1:a14415de3ad5 33 void welcome();
Andrew_M 10:279d3775d52c 34 void transition();
Andrew_M 12:d3eef5ea3f43 35 void reset();
Andrew_M 11:b25874e7efe4 36 float setDif();
Andrew_M 1:a14415de3ad5 37
Andrew_M 1:a14415de3ad5 38 ///////////// functions ////////////////
Andrew_M 1:a14415de3ad5 39 int main()
Andrew_M 10:279d3775d52c 40 {
Andrew_M 1:a14415de3ad5 41 init();
Andrew_M 1:a14415de3ad5 42 welcome();
Andrew_M 8:9d01fd4a63ad 43
Andrew_M 10:279d3775d52c 44 transition();
Andrew_M 11:b25874e7efe4 45
Andrew_M 2:9ca5e1c221c3 46 // game loop - read input, update the game state and render the display
Andrew_M 2:9ca5e1c221c3 47 while (1) {
Andrew_M 10:279d3775d52c 48 if (!mainMenu.started()) { //menu logic and rendering
Andrew_M 10:279d3775d52c 49 mainMenu.read_input(pad);
Andrew_M 10:279d3775d52c 50 mainMenu.update();
Andrew_M 12:d3eef5ea3f43 51 gameEngine.setLvl(mainMenu.getLvl());
Andrew_M 10:279d3775d52c 52 renderMenu();
Andrew_M 12:d3eef5ea3f43 53 } else if (gameEngine.getGameOver()) { //resets the game once a game over state has been reached
Andrew_M 12:d3eef5ea3f43 54 gameEngine.gameOverScreen(lcd);
Andrew_M 12:d3eef5ea3f43 55 reset();
Andrew_M 10:279d3775d52c 56 } else { //game logic and rendering
Andrew_M 9:fe86ddbf7799 57 gameEngine.read_input(pad);
Andrew_M 9:fe86ddbf7799 58 gameEngine.update(pad);
Andrew_M 9:fe86ddbf7799 59 renderGame();
Andrew_M 9:fe86ddbf7799 60 }
Andrew_M 2:9ca5e1c221c3 61 }
Andrew_M 1:a14415de3ad5 62 }
Andrew_M 1:a14415de3ad5 63
Andrew_M 1:a14415de3ad5 64 void welcome()
Andrew_M 1:a14415de3ad5 65 {
Andrew_M 8:9d01fd4a63ad 66 lcd.printString(" Snake! ",0,1);
Andrew_M 1:a14415de3ad5 67 lcd.printString(" Press Start ",0,4);
Andrew_M 1:a14415de3ad5 68 lcd.refresh();
Andrew_M 8:9d01fd4a63ad 69
Andrew_M 8:9d01fd4a63ad 70 // wait flashing LEDs until start button is pressed
Andrew_M 1:a14415de3ad5 71 while ( pad.check_event(Gamepad::START_PRESSED) == false) {
Andrew_M 1:a14415de3ad5 72 pad.leds_on();
Andrew_M 1:a14415de3ad5 73 wait(0.1);
Andrew_M 1:a14415de3ad5 74 pad.leds_off();
Andrew_M 1:a14415de3ad5 75 wait(0.1);
Andrew_M 0:66e5b37c127e 76 }
Andrew_M 9:fe86ddbf7799 77
Andrew_M 0:66e5b37c127e 78 }
Andrew_M 0:66e5b37c127e 79
Andrew_M 1:a14415de3ad5 80 void init()
Andrew_M 1:a14415de3ad5 81 {
Andrew_M 8:9d01fd4a63ad 82 // need to initialise LCD and Gamepad
Andrew_M 3:6253a2d374fa 83 gameEngine.init();
Andrew_M 1:a14415de3ad5 84 lcd.init();
Andrew_M 8:9d01fd4a63ad 85 pad.init();
Andrew_M 9:fe86ddbf7799 86 mainMenu.init();
Andrew_M 1:a14415de3ad5 87
Andrew_M 1:a14415de3ad5 88 }
Andrew_M 2:9ca5e1c221c3 89
Andrew_M 12:d3eef5ea3f43 90 void reset()
Andrew_M 12:d3eef5ea3f43 91 {
Andrew_M 12:d3eef5ea3f43 92 mainMenu.init();
Andrew_M 12:d3eef5ea3f43 93 gameEngine.init();
Andrew_M 12:d3eef5ea3f43 94 }
Andrew_M 12:d3eef5ea3f43 95
Andrew_M 9:fe86ddbf7799 96 void renderGame()
Andrew_M 2:9ca5e1c221c3 97 {
Andrew_M 2:9ca5e1c221c3 98 // clear screen, re-draw and refresh
Andrew_M 8:9d01fd4a63ad 99 lcd.clear();
Andrew_M 2:9ca5e1c221c3 100 gameEngine.draw(lcd);
Andrew_M 2:9ca5e1c221c3 101 lcd.refresh();
Andrew_M 11:b25874e7efe4 102 wait(setDif());
Andrew_M 2:9ca5e1c221c3 103 }
Andrew_M 8:9d01fd4a63ad 104
Andrew_M 9:fe86ddbf7799 105 void renderMenu()
Andrew_M 9:fe86ddbf7799 106 {
Andrew_M 9:fe86ddbf7799 107 // clear screen, re-draw and refresh
Andrew_M 9:fe86ddbf7799 108 lcd.clear();
Andrew_M 9:fe86ddbf7799 109 mainMenu.draw(lcd);
Andrew_M 9:fe86ddbf7799 110 lcd.refresh();
Andrew_M 9:fe86ddbf7799 111 wait(1.0f/8);
Andrew_M 9:fe86ddbf7799 112 }
Andrew_M 9:fe86ddbf7799 113
Andrew_M 10:279d3775d52c 114 void transition()
Andrew_M 11:b25874e7efe4 115 {
Andrew_M 11:b25874e7efe4 116 //transition animation between modes to stop 'ghosting' of inputs
Andrew_M 10:279d3775d52c 117 for (int i = 0; i <= 11; i++) {
Andrew_M 10:279d3775d52c 118 for (int j = 0; j <= 21; j++) {
Andrew_M 10:279d3775d52c 119 lcd.drawRect(j*4,i*4,4,4,FILL_BLACK);
Andrew_M 10:279d3775d52c 120 wait(0.005);
Andrew_M 10:279d3775d52c 121 lcd.refresh();
Andrew_M 10:279d3775d52c 122 }
Andrew_M 10:279d3775d52c 123 }
Andrew_M 10:279d3775d52c 124
Andrew_M 10:279d3775d52c 125 }
Andrew_M 10:279d3775d52c 126
Andrew_M 11:b25874e7efe4 127 float setDif()
Andrew_M 11:b25874e7efe4 128 {
Andrew_M 11:b25874e7efe4 129 int _dif = mainMenu.getDif();
Andrew_M 11:b25874e7efe4 130
Andrew_M 13:81573be8fac6 131 if (_dif == 1) { //Low difficulty
Andrew_M 11:b25874e7efe4 132 return 1.0f/4;
Andrew_M 13:81573be8fac6 133 } else if (_dif == 2) { //Medium difficulty
Andrew_M 11:b25874e7efe4 134 return 1.0f/8;
Andrew_M 13:81573be8fac6 135 } else if (_dif == 3) { //Hard difficulty
Andrew_M 11:b25874e7efe4 136 return 1.0f/12;
Andrew_M 13:81573be8fac6 137 } else { //Adaptive difficulty
Andrew_M 13:81573be8fac6 138 float _delta = gameEngine.getScore();
Andrew_M 13:81573be8fac6 139 if (_delta < 25) { //Limits FPS to 25
Andrew_M 13:81573be8fac6 140 return ((1.0f/(_delta + 1)));
Andrew_M 11:b25874e7efe4 141 } else {
Andrew_M 11:b25874e7efe4 142 return (1.0f/25);
Andrew_M 11:b25874e7efe4 143 }
Andrew_M 11:b25874e7efe4 144 }
Andrew_M 11:b25874e7efe4 145 }