Wilbert George
/
NewOutrageousRetroSlot
Revised code. The original has been removed.
Diff: Game.cpp
- Revision:
- 0:305fa754c01e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Game.cpp Tue Feb 03 22:11:06 2015 +0000 @@ -0,0 +1,414 @@ + + +//I have removed Library LCD_ST7735 that was in the original post. +//Chris Taylor (taylorza) has reminded me that I was not using his library as I had stated. + +//I know nothing about payouts on a 'real' slot machine so I just made some up... +//Be creative and make your own! + +//There is no calculated payback percentage (Odds). +//Fruits displayed and payout values for two of a kind are chosen by random numbers. +//LUCKY7 - All payouts are fixed values + + +#include "mbed.h" +#include <stdarg.h> +#include <stdlib.h> +#include "USBSerial.h" +#include <string> + +#include "DisplayN18.h" + + bool spin = false; + + AnalogIn ain(P0_15); //One of the user header pins + + DigitalOut led1(P0_9, 0); + DigitalOut led2(P0_8, 1); + DigitalOut Buzzer(P0_18); + + DigitalIn up(P0_13, PullUp); + DigitalIn down(P0_12, PullUp); + DigitalIn left(P0_14, PullUp); + DigitalIn right(P0_11, PullUp); + + DigitalIn pbRobot(P0_16, PullUp); + + //Falling edge (hit) generates an interrupt + //Just wanted to try an interrupt + InterruptIn pbSpaceship(P0_1); + + //Random numbers for reels() + int r1 = 0; + int r2 = 0; + int r3 = 0; + int r4 = 0; + int r5 = 0; + int r6 = 0; + + //Virtual serial port over USB. + //Used for debug output only + USBSerial serial; + + DisplayN18 disp; + + bool doublepay = false; + bool win = false; + + int cash = 100; //Start with + int cashpay = 0; //Win or loss + + const char * const bar[] = { + "BAR ", + "BELL ", + "ORANGE ", + "LEMON ", + "LUCKY7 ", + "CHERRY " }; + + const char* msg1 = ""; + const char* msg2 = ""; + const char* msg3 = ""; + + //Screen width using spaces + const char* szErase = " "; //26 spaces + +//From E-Dice +void soundBuzzer(int Hz) +{ + int ticks = Hz/64; + int tickCount = 0; + float frequency = 1/(float)Hz; + + while(tickCount < ticks) + { + wait(frequency); + Buzzer = true; + wait(frequency); + Buzzer = false; + tickCount++; + } +} +// + +void reels(void) +{ + //Erase current text (-val = position from bottom of LCD) + //Fruit bars + disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -58, szErase, DisplayN18::BLACK, DisplayN18::BLACK); + + //Erase current text + //DOUBLE PAY (May not be used but we will erase that position anyway) + disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT + 73, szErase, DisplayN18::BLACK, DisplayN18::BLACK); + + while(spin) { + + r1 = (rand() % 6); //Fruit 1 + r2 = (rand() % 6); //Fruit 2 + r3 = (rand() % 6); //Fruit 3 + r4 = (rand() % 50); //Double Pay if 34,13,7 + r5 = (rand() % 2); //LOSE! 1 or 2 dollars + r6 = (rand() % 4) +1; //cashpay on two of a kind. (+1 for no zero wanted) + + //Use if wanted to show the random number values + serial.printf(" %d %d %d %d %d %d\r\n",r1,r2,r3,r4,r5,r6); + + msg1 = bar[r1]; + msg2 = bar[r2]; + msg3 = bar[r3]; + + char buf[27] = ""; + strncat(buf, msg1, sizeof buf); + strncat(buf, msg2, sizeof buf - strlen(buf)); + strncat(buf, msg3, sizeof buf - strlen(buf)); + + //Erase current text then draw new text centered + //Fruit bars + disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -58, szErase, DisplayN18::BLACK, DisplayN18::BLACK); + disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) * + strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 58, buf, DisplayN18::GREEN, DisplayN18::BLACK); + + //Robot button is Not pressed + if(pbRobot) { + //YOUR PLAY + disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -78, szErase, DisplayN18::BLACK, DisplayN18::BLACK); + } + // + wait(0.1); + + //Robot button was pressed + if(!pbRobot) { + led2 = 1; + led1 = 0; + + char buf[27] = ""; + sprintf(buf, "YOUR PLAY - Cash %d ", cash); + + //Erase current text then draw new text centered + //YOUR PLAY + disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -78, szErase, DisplayN18::BLACK, DisplayN18::BLACK); + disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) * + strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 78, buf, DisplayN18::GREEN, DisplayN18::BLACK); + + //Erase current text + //WIN/LOSS Cash at hand + disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -16, szErase, DisplayN18::BLACK, DisplayN18::BLACK); + + spin = false; + + //Show fruit bars left to right one at a time + //1 second interval + for(int i =0; i <= 2; i++) + { + msg1 = bar[r1]; + msg2 = bar[r2]; + msg3 = bar[r3]; + char buf[27] = ""; + + if(i == 0) { + strncat(buf, msg1, sizeof buf); + } + if(i == 1) { + strncat(buf, msg1, sizeof buf); + strncat(buf, msg2, sizeof buf - strlen(buf)); + } + if(i == 2) { + strncat(buf, msg1, sizeof buf); + strncat(buf, msg2, sizeof buf - strlen(buf)); + strncat(buf, msg3, sizeof buf - strlen(buf)); + } + + //Erase current text then draw new text centered + //Fruit bars + disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -58, szErase, DisplayN18::BLACK, DisplayN18::BLACK); + disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) * + strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 58, buf, DisplayN18::RED, DisplayN18::BLACK); + + wait(1); + + //Erase current text then draw new text centered + //Fruit bars + disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -58, szErase, DisplayN18::BLACK, DisplayN18::BLACK); + disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) * + strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 58, buf, DisplayN18::GREEN, DisplayN18::BLACK); + } //for + + win = false; + + //bar[2] = ORANGE + if ((msg1 == bar[2]) && (msg2 == bar[2]) && (msg3 == bar[2])) + { + cash = cash + 4; + cashpay = 4; + win = true; + } + if ((msg1 == bar[2]) && (msg2 == bar[2])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + if ((msg2 == bar[2]) && (msg3 == bar[2])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + // + + //bar[3] = LEMON + if ((msg1 == bar[3]) && (msg2 == bar[3]) && (msg3 == bar[3])) + { + cash = cash + 4; + cashpay = 4; + win = true; + } + if ((msg1 == bar[3]) && (msg2 == bar[3])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + if ((msg2 == bar[3]) && (msg3 == bar[3])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + // + + //bar[5] = CHERRY + if ((msg1 == bar[5]) && (msg2 == bar[5]) && (msg3 == bar[5])) + { + cash = cash + 6; + cashpay = 6; + win = true; + } + if ((msg1 == bar[5]) && (msg2 == bar[5])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + if ((msg2 == bar[5]) && (msg3 == bar[5])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + // + + //bar[1] = BELL + if ((msg1 == bar[1]) && (msg2 == bar[1]) && (msg3 == bar[1])) + { + cash = cash + 6; + cashpay = 6; + win = true; + } + if ((msg1 == bar[1]) && (msg2 == bar[1])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + if ((msg2 == bar[1]) && (msg3 == bar[1])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + // + + //bar[0] = BAR + if ((msg1 == bar[0]) && (msg2 == bar[0]) && (msg3 == bar[0])) + { + cash = cash + 10; + cashpay = 10; + win = true; + } + if ((msg1 == bar[0]) && (msg2 == bar[0])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + if ((msg2 == bar[0]) && (msg3 == bar[0])) + { + cash = cash + r6; + cashpay = r6; + win = true; + } + // + + //bar[4] = LUCKY7 + if ((msg1 == bar[4]) && (msg2 == bar[4]) && (msg3 == bar[4])) + { + cash = cash + 20; + cashpay = 20; + win = true; + } + if ((msg1 == bar[4]) && (msg2 == bar[4])) + { + cash = cash + 10; + cashpay = 10; + win = true; + } + if ((msg2 == bar[4]) && (msg3 == bar[4])) + { + cash = cash + 8; + cashpay = 8; + win = true; + } + // + + if(win) + { + if(r4 == 35 || r4 == 13 || r4 == 7) { + sprintf(buf, "DOUBLE PAY %d %d ", cashpay * 2, cash + cashpay); + } + else { + sprintf(buf, "WIN! Pay: %d Cash: %d ", cashpay, cash); + } + } + // + + if(!win) + { + if(r5 == 0) { + cash = cash - 1; + sprintf(buf, "LOSE! 1 dollar - %d ", cash); + } + else if(r5 == 1) { + cash = cash - 2; + sprintf(buf, "LOSE! 2 dollars - %d ", cash); + } + + } + // + + //Erase current text then draw new text centered + //WIN/LOSS Cash at hand + disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -16, szErase, DisplayN18::BLACK, DisplayN18::BLACK); + disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) * + strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 16, buf, DisplayN18::GREEN, DisplayN18::BLACK); + + if(win) { + for(int i = 0; i < 5; i++) { + soundBuzzer(800); + wait(.1); + soundBuzzer(600); + wait(.1); + soundBuzzer(400); + wait(.1); + } + } + } //if + } //while +} +// + +//Spaceship/RETRO button begins random pick of fruit bars +void pbSpaceship_hit_interrupt (void) { + led1 = 1; + led2 = 0; + + spin = true; + reels(); +} +// + +int main() { + + //For read_u16() - See: http://developer.mbed.org/handbook/AnalogIn + srand(ain.read_u16()); + + led1 = 0; + led2 = 0; + pbRobot.mode(PullUp); + //Delay for initial pullup to take effect + wait(.01); + + pbSpaceship.mode(PullUp); + //Delay for initial pullup to take effect + wait(.01); + + //Attach address of interrupt handler routine for pushbutton + pbSpaceship.fall(&pbSpaceship_hit_interrupt); + + disp.clear(); + wait(.5); + + //Splash + char buf[27] = ""; + sprintf(buf," OUTRAGEOUS RETRO Slot"); + disp.drawString(0, 0, buf, DisplayN18::GREEN, DisplayN18::BLACK); + sprintf(buf,"Press RETRO to pull Lever"); + disp.drawString(0, DisplayN18::CHAR_HEIGHT + 3, buf, DisplayN18::RED, DisplayN18::BLACK); + sprintf(buf,"Press ROBOT Lever up"); + disp.drawString(0, DisplayN18::CHAR_HEIGHT + 13, buf, DisplayN18::RED, DisplayN18::BLACK); + + while (true) { + wait(.1); + } //while +} +//