Pong game for ELEC1620 board.

Committer:
eencae
Date:
Thu Mar 11 14:54:25 2021 +0000
Revision:
3:5746c6833d73
Parent:
2:482d74ef09c8
Added on LEDs and 7-seg for lives, bouncing off paddle and walls.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:be41a15e7a86 1
eencae 1:d63a63f0d397 2 ///////////// includes /////////////////////
eencae 0:be41a15e7a86 3 #include "mbed.h"
eencae 0:be41a15e7a86 4 #include "platform/mbed_thread.h"
eencae 0:be41a15e7a86 5 #include "Joystick.h"
eencae 0:be41a15e7a86 6 #include "N5110.h"
eencae 1:d63a63f0d397 7 #include "ShiftReg.h"
eencae 1:d63a63f0d397 8 #include "PongEngine.h"
eencae 1:d63a63f0d397 9 #include "Utils.h"
eencae 1:d63a63f0d397 10 ///////////// defines /////////////////////
eencae 1:d63a63f0d397 11 #define PADDLE_WIDTH 2
eencae 1:d63a63f0d397 12 #define PADDLE_HEIGHT 8
eencae 1:d63a63f0d397 13 #define BALL_SIZE 2
eencae 1:d63a63f0d397 14 #define BALL_SPEED 3
eencae 1:d63a63f0d397 15 ///////////// objects ///////////////////
eencae 0:be41a15e7a86 16 N5110 lcd(p14,p8,p9,p10,p11,p13,p21);
eencae 1:d63a63f0d397 17 Joystick joystick(p20,p19);
eencae 1:d63a63f0d397 18 DigitalIn buttonA(p29);
eencae 1:d63a63f0d397 19 BusOut leds(LED4,LED3,LED2,LED1);
eencae 1:d63a63f0d397 20 ShiftReg seven_seg;
eencae 1:d63a63f0d397 21 PongEngine pong;
eencae 3:5746c6833d73 22 AnalogIn pot(p17);
eencae 1:d63a63f0d397 23 ///////////// prototypes ///////////////
eencae 1:d63a63f0d397 24 void init();
eencae 1:d63a63f0d397 25 void render();
eencae 1:d63a63f0d397 26 void welcome();
eencae 3:5746c6833d73 27 void display_lives(int lives);
eencae 3:5746c6833d73 28 void game_over();
eencae 1:d63a63f0d397 29 ////////////////////////////////////////
eencae 0:be41a15e7a86 30
eencae 1:d63a63f0d397 31 int main() {
eencae 1:d63a63f0d397 32 init(); // initialise devices and objects
eencae 1:d63a63f0d397 33 welcome(); // waiting for the user to start
eencae 1:d63a63f0d397 34 render(); // first draw the initial frame
eencae 3:5746c6833d73 35 int fps = 10;
eencae 3:5746c6833d73 36 thread_sleep_for(1000/fps); // and wait for one frame period - millseconds
eencae 1:d63a63f0d397 37
eencae 3:5746c6833d73 38 int lives = 4; // display lives on LEDs
eencae 3:5746c6833d73 39 display_lives(lives);
eencae 3:5746c6833d73 40
eencae 3:5746c6833d73 41 while (lives > 0) { // keep looping while lives remain
eencae 1:d63a63f0d397 42 // read the joystick input and store in a struct
eencae 1:d63a63f0d397 43 UserInput input = {joystick.get_direction(),joystick.get_mag()};
eencae 3:5746c6833d73 44 lives = pong.update(input); // update the game engine based on input
eencae 3:5746c6833d73 45 display_lives(lives); // display lives on LEDs
eencae 3:5746c6833d73 46 render(); // draw frame on screen
eencae 3:5746c6833d73 47 thread_sleep_for(1000/fps); // and wait for one frame period - ms
eencae 3:5746c6833d73 48 }
eencae 3:5746c6833d73 49 game_over();
eencae 1:d63a63f0d397 50 }
eencae 0:be41a15e7a86 51
eencae 1:d63a63f0d397 52 void init() {
eencae 1:d63a63f0d397 53 seven_seg.write(0x00); // turn of 7-seg display
eencae 0:be41a15e7a86 54 lcd.init();
eencae 0:be41a15e7a86 55 lcd.setContrast(0.5);
eencae 0:be41a15e7a86 56 joystick.init();
eencae 3:5746c6833d73 57 pong.init(0,8,2,2,2); // paddle x position, paddle_height,paddle_width,ball_size,speed
eencae 1:d63a63f0d397 58 }
eencae 1:d63a63f0d397 59
eencae 1:d63a63f0d397 60 void render() { // clear screen, re-draw and refresh
eencae 1:d63a63f0d397 61 lcd.clear();
eencae 1:d63a63f0d397 62 pong.draw(lcd);
eencae 1:d63a63f0d397 63 lcd.refresh();
eencae 1:d63a63f0d397 64 }
eencae 1:d63a63f0d397 65
eencae 1:d63a63f0d397 66 void welcome() { // splash screen
eencae 1:d63a63f0d397 67 lcd.printString(" Pong! ",0,1);
eencae 1:d63a63f0d397 68 lcd.printString(" Press A ",0,4);
eencae 1:d63a63f0d397 69 lcd.refresh();
eencae 1:d63a63f0d397 70
eencae 1:d63a63f0d397 71 // wait flashing LEDs until button A is pressed
eencae 3:5746c6833d73 72 while (buttonA.read() == 0) {
eencae 1:d63a63f0d397 73 leds = 0b1111;
eencae 1:d63a63f0d397 74 thread_sleep_for(100);
eencae 1:d63a63f0d397 75 leds = 0b0000;
eencae 1:d63a63f0d397 76 thread_sleep_for(100);
eencae 0:be41a15e7a86 77 }
eencae 3:5746c6833d73 78 }
eencae 3:5746c6833d73 79
eencae 3:5746c6833d73 80 void display_lives(int lives) {
eencae 3:5746c6833d73 81 if (lives == 4) {
eencae 3:5746c6833d73 82 leds = 0b1111;
eencae 3:5746c6833d73 83 seven_seg.write(0x66);
eencae 3:5746c6833d73 84 } else if (lives == 3) {
eencae 3:5746c6833d73 85 leds = 0b1110;
eencae 3:5746c6833d73 86 seven_seg.write(0x4F);
eencae 3:5746c6833d73 87 } else if (lives == 2) {
eencae 3:5746c6833d73 88 leds = 0b1100;
eencae 3:5746c6833d73 89 seven_seg.write(0x5B);
eencae 3:5746c6833d73 90 } else if (lives == 1) {
eencae 3:5746c6833d73 91 leds = 0b1000;
eencae 3:5746c6833d73 92 seven_seg.write(0x06);
eencae 3:5746c6833d73 93 } else {
eencae 3:5746c6833d73 94 leds = 0b0000;
eencae 3:5746c6833d73 95 seven_seg.write(0x3F);
eencae 3:5746c6833d73 96 }
eencae 3:5746c6833d73 97 }
eencae 3:5746c6833d73 98
eencae 3:5746c6833d73 99 void game_over() { // splash screen
eencae 3:5746c6833d73 100 while (1) {
eencae 3:5746c6833d73 101 lcd.clear();
eencae 3:5746c6833d73 102 lcd.printString(" Game Over ",0,2);
eencae 3:5746c6833d73 103 lcd.printString(" Loser! ",0,4);
eencae 3:5746c6833d73 104 lcd.refresh();
eencae 3:5746c6833d73 105 leds = 0b1111;
eencae 3:5746c6833d73 106 thread_sleep_for(250);
eencae 3:5746c6833d73 107 lcd.clear();
eencae 3:5746c6833d73 108 lcd.refresh();
eencae 3:5746c6833d73 109 leds = 0b0000;
eencae 3:5746c6833d73 110 thread_sleep_for(250);
eencae 3:5746c6833d73 111 }
eencae 3:5746c6833d73 112 }