Wilbert George / Mbed 2 deprecated NewOutrageousRetroSlot

Dependencies:   USBDevice mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Game.cpp Source File

Game.cpp

00001 
00002 
00003 //I have removed Library LCD_ST7735 that was in the original post.
00004 //Chris Taylor (taylorza) has reminded me that I was not using his library as I had stated.
00005 
00006 //I know nothing about payouts on a 'real' slot machine so I just made some up...
00007 //Be creative and make your own!
00008 
00009 //There is no calculated payback percentage (Odds).
00010 //Fruits displayed and payout values for two of a kind are chosen by random numbers.
00011 //LUCKY7 - All payouts are fixed values
00012 
00013 
00014 #include "mbed.h"
00015 #include <stdarg.h>
00016 #include <stdlib.h>
00017 #include "USBSerial.h"
00018 #include <string>
00019 
00020 #include "DisplayN18.h"
00021 
00022  bool spin = false;
00023  
00024  AnalogIn ain(P0_15);  //One of the user header pins
00025  
00026  DigitalOut led1(P0_9, 0);
00027  DigitalOut led2(P0_8, 1);
00028  DigitalOut Buzzer(P0_18);
00029  
00030  DigitalIn up(P0_13, PullUp);
00031  DigitalIn down(P0_12, PullUp);
00032  DigitalIn left(P0_14, PullUp);
00033  DigitalIn right(P0_11, PullUp);
00034 
00035  DigitalIn pbRobot(P0_16, PullUp);
00036  
00037  //Falling edge (hit) generates an interrupt
00038  //Just wanted to try an interrupt
00039  InterruptIn pbSpaceship(P0_1);
00040  
00041  //Random numbers for reels()
00042  int r1 = 0;
00043  int r2 = 0;
00044  int r3 = 0;
00045  int r4 = 0;
00046  int r5 = 0;
00047  int r6 = 0;
00048  
00049  //Virtual serial port over USB.
00050  //Used for debug output only
00051  USBSerial serial;
00052 
00053  DisplayN18 disp;
00054  
00055  bool doublepay = false;
00056  bool win = false;
00057  
00058  int cash = 100; //Start with
00059  int cashpay = 0; //Win or loss
00060  
00061  const char * const bar[] = {
00062  "BAR ",
00063  "BELL ",
00064  "ORANGE ",
00065  "LEMON ",
00066  "LUCKY7 ",
00067  "CHERRY " };
00068 
00069  const char* msg1 = "";
00070  const char* msg2 = "";
00071  const char* msg3 = "";
00072  
00073  //Screen width using spaces
00074  const char* szErase = "                          "; //26 spaces
00075 
00076 //From E-Dice
00077 void soundBuzzer(int Hz)
00078 {
00079     int ticks = Hz/64;
00080     int tickCount = 0;
00081     float frequency = 1/(float)Hz;
00082     
00083     while(tickCount < ticks)
00084     {
00085         wait(frequency);
00086         Buzzer = true;
00087         wait(frequency);
00088         Buzzer = false;
00089         tickCount++;
00090     }
00091 }
00092 //
00093 
00094 void reels(void)
00095 {
00096     //Erase current text (-val = position from bottom of LCD)
00097     //Fruit bars
00098     disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -58, szErase, DisplayN18::BLACK, DisplayN18::BLACK);
00099     
00100     //Erase current text 
00101     //DOUBLE PAY (May not be used but we will erase that position anyway)
00102     disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT + 73, szErase, DisplayN18::BLACK, DisplayN18::BLACK);
00103         
00104     while(spin) {
00105         
00106         r1 = (rand() % 6);  //Fruit 1
00107         r2 = (rand() % 6);  //Fruit 2
00108         r3 = (rand() % 6);  //Fruit 3
00109         r4 = (rand() % 50); //Double Pay if 34,13,7
00110         r5 = (rand() % 2);  //LOSE! 1 or 2 dollars
00111         r6 = (rand() % 4) +1;  //cashpay on two of a kind. (+1 for no zero wanted)
00112         
00113         //Use if wanted to show the random number values
00114         serial.printf(" %d %d %d %d %d %d\r\n",r1,r2,r3,r4,r5,r6);
00115                         
00116         msg1 = bar[r1];
00117         msg2 = bar[r2];
00118         msg3 = bar[r3];
00119         
00120         char buf[27] = "";
00121         strncat(buf, msg1, sizeof buf);
00122         strncat(buf, msg2, sizeof buf - strlen(buf));
00123         strncat(buf, msg3, sizeof buf - strlen(buf));
00124     
00125         //Erase current text then draw new text centered
00126         //Fruit bars
00127         disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -58, szErase, DisplayN18::BLACK, DisplayN18::BLACK);
00128         disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) *
00129             strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 58, buf, DisplayN18::GREEN, DisplayN18::BLACK);
00130         
00131         //Robot button is Not pressed
00132         if(pbRobot) {
00133             //YOUR PLAY
00134             disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -78, szErase, DisplayN18::BLACK, DisplayN18::BLACK);
00135         }
00136         //
00137         wait(0.1);
00138         
00139         //Robot button was pressed
00140         if(!pbRobot) {
00141             led2 = 1;
00142             led1 = 0;
00143             
00144             char buf[27] = "";
00145             sprintf(buf, "YOUR PLAY - Cash %d ", cash);
00146             
00147             //Erase current text then draw new text centered
00148             //YOUR PLAY
00149             disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -78, szErase, DisplayN18::BLACK, DisplayN18::BLACK);
00150             disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) *
00151                 strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 78, buf, DisplayN18::GREEN, DisplayN18::BLACK);
00152             
00153             //Erase current text
00154             //WIN/LOSS Cash at hand
00155             disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -16, szErase, DisplayN18::BLACK, DisplayN18::BLACK);
00156             
00157             spin = false;
00158             
00159             //Show fruit bars left to right one at a time
00160             //1 second interval
00161             for(int i =0; i <= 2; i++)
00162             {  
00163                 msg1 = bar[r1];
00164                 msg2 = bar[r2];
00165                 msg3 = bar[r3];
00166                 char buf[27] = "";
00167                 
00168                 if(i == 0) {
00169                     strncat(buf, msg1, sizeof buf);    
00170                 }
00171                 if(i == 1) {
00172                     strncat(buf, msg1, sizeof buf);
00173                     strncat(buf, msg2, sizeof buf - strlen(buf));  
00174                 }
00175                 if(i == 2) {
00176                     strncat(buf, msg1, sizeof buf);
00177                     strncat(buf, msg2, sizeof buf - strlen(buf));
00178                     strncat(buf, msg3, sizeof buf - strlen(buf));     
00179                 }
00180                 
00181                 //Erase current text then draw new text centered
00182                 //Fruit bars
00183                 disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -58, szErase, DisplayN18::BLACK, DisplayN18::BLACK);
00184                 disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) *
00185                     strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 58, buf, DisplayN18::RED, DisplayN18::BLACK);
00186                     
00187                 wait(1);
00188                 
00189                 //Erase current text then draw new text centered
00190                 //Fruit bars
00191                 disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -58, szErase, DisplayN18::BLACK, DisplayN18::BLACK);
00192                 disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) *
00193                     strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 58, buf, DisplayN18::GREEN, DisplayN18::BLACK);                
00194             } //for
00195             
00196             win = false;
00197 
00198             //bar[2] = ORANGE
00199             if ((msg1 == bar[2]) && (msg2 == bar[2]) && (msg3 == bar[2]))
00200             {
00201                 cash = cash + 4;
00202                 cashpay = 4;
00203                 win = true;
00204             }
00205             if ((msg1 == bar[2]) && (msg2 == bar[2]))
00206             {
00207                 cash = cash + r6;
00208                 cashpay = r6;
00209                 win = true;
00210             }
00211             if ((msg2 == bar[2]) && (msg3 == bar[2]))
00212             {
00213                 cash = cash + r6;
00214                 cashpay = r6;
00215                 win = true;
00216             }
00217             //
00218             
00219             //bar[3] = LEMON
00220             if ((msg1 == bar[3]) && (msg2 == bar[3]) && (msg3 == bar[3]))
00221             {
00222                 cash = cash + 4;
00223                 cashpay = 4;
00224                 win = true;
00225             }
00226             if ((msg1 == bar[3]) && (msg2 == bar[3]))
00227             {
00228                 cash = cash + r6;
00229                 cashpay = r6;
00230                 win = true;
00231             }
00232             if ((msg2 == bar[3]) && (msg3 == bar[3]))
00233             {
00234                 cash = cash + r6;
00235                 cashpay = r6;
00236                 win = true;
00237             }
00238             //
00239                        
00240             //bar[5] = CHERRY
00241             if ((msg1 == bar[5]) && (msg2 == bar[5]) && (msg3 == bar[5]))
00242             {
00243                 cash = cash + 6;
00244                 cashpay = 6;
00245                 win = true;
00246             }
00247             if ((msg1 == bar[5]) && (msg2 == bar[5]))
00248             {
00249                 cash = cash + r6;
00250                 cashpay = r6;
00251                 win = true;
00252             }
00253             if ((msg2 == bar[5]) && (msg3 == bar[5]))
00254             {
00255                 cash = cash + r6;
00256                 cashpay = r6;
00257                 win = true;
00258             }
00259             //
00260             
00261             //bar[1] = BELL
00262             if ((msg1 == bar[1]) && (msg2 == bar[1]) && (msg3 == bar[1]))
00263             {
00264                 cash = cash + 6;
00265                 cashpay = 6;
00266                 win = true;
00267             }
00268             if ((msg1 == bar[1]) && (msg2 == bar[1]))
00269             {
00270                 cash = cash + r6;
00271                 cashpay = r6;
00272                 win = true;
00273             }
00274             if ((msg2 == bar[1]) && (msg3 == bar[1]))
00275             {
00276                 cash = cash + r6;
00277                 cashpay = r6;
00278                 win = true;
00279             }
00280             //
00281             
00282             //bar[0] = BAR
00283             if ((msg1 == bar[0]) && (msg2 == bar[0]) && (msg3 == bar[0]))
00284             {
00285                 cash = cash + 10;
00286                 cashpay = 10;
00287                 win = true;
00288             }
00289             if ((msg1 == bar[0]) && (msg2 == bar[0]))
00290             {
00291                 cash = cash + r6;
00292                 cashpay = r6;
00293                 win = true;
00294             }
00295             if ((msg2 == bar[0]) && (msg3 == bar[0]))
00296             {
00297                 cash = cash + r6;
00298                 cashpay = r6;
00299                 win = true;
00300             }
00301             //
00302             
00303             //bar[4] = LUCKY7
00304             if ((msg1 == bar[4]) && (msg2 == bar[4]) && (msg3 == bar[4]))
00305             {
00306                 cash = cash + 20;
00307                 cashpay = 20;
00308                 win = true;
00309             }
00310             if ((msg1 == bar[4]) && (msg2 == bar[4]))
00311             {
00312                 cash = cash + 10;
00313                 cashpay = 10;
00314                 win = true;
00315             }
00316             if ((msg2 == bar[4]) && (msg3 == bar[4]))
00317             {
00318                 cash = cash + 8;
00319                 cashpay = 8;
00320                 win = true;
00321             }
00322             //
00323             
00324             if(win)
00325             {                
00326                 if(r4 == 35 || r4 == 13 || r4 == 7) {
00327                     sprintf(buf, "DOUBLE PAY %d  %d ", cashpay * 2, cash + cashpay);
00328                 }
00329                 else {
00330                     sprintf(buf, "WIN! Pay: %d Cash: %d ", cashpay, cash);
00331                 }   
00332             }
00333             //
00334             
00335             if(!win)
00336             {
00337                 if(r5 == 0) {
00338                     cash = cash - 1;
00339                     sprintf(buf, "LOSE! 1 dollar - %d ", cash);
00340                 }
00341                 else if(r5 == 1) {
00342                     cash = cash - 2;
00343                     sprintf(buf, "LOSE! 2 dollars - %d ", cash);
00344                 }
00345                 
00346             }
00347             //
00348             
00349             //Erase current text then draw new text centered
00350             //WIN/LOSS Cash at hand
00351             disp.drawString(0, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT -16, szErase, DisplayN18::BLACK, DisplayN18::BLACK);
00352             disp.drawString(DisplayN18::WIDTH / 2 - (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) *
00353                 strlen(buf) / 2, DisplayN18::HEIGHT-DisplayN18::CHAR_HEIGHT - 16, buf, DisplayN18::GREEN, DisplayN18::BLACK);
00354 
00355             if(win) {
00356                for(int i = 0; i < 5; i++) {
00357                     soundBuzzer(800);
00358                     wait(.1);
00359                     soundBuzzer(600);
00360                     wait(.1);
00361                     soundBuzzer(400);
00362                     wait(.1);
00363                 }
00364             }
00365         } //if
00366     } //while
00367 }
00368 //
00369 
00370 //Spaceship/RETRO button begins random pick of fruit bars
00371 void pbSpaceship_hit_interrupt (void) {
00372     led1 = 1;
00373     led2 = 0;
00374     
00375     spin = true;
00376     reels();
00377 }
00378 //
00379 
00380 int main() {
00381     
00382     //For read_u16() - See: http://developer.mbed.org/handbook/AnalogIn
00383     srand(ain.read_u16());
00384     
00385     led1 = 0;
00386     led2 = 0;
00387     pbRobot.mode(PullUp);
00388     //Delay for initial pullup to take effect
00389     wait(.01);
00390     
00391     pbSpaceship.mode(PullUp);
00392     //Delay for initial pullup to take effect
00393     wait(.01);
00394     
00395     //Attach address of interrupt handler routine for pushbutton
00396     pbSpaceship.fall(&pbSpaceship_hit_interrupt);
00397      
00398     disp.clear();
00399     wait(.5);
00400     
00401     //Splash
00402     char buf[27] = "";
00403     sprintf(buf,"   OUTRAGEOUS RETRO Slot");
00404     disp.drawString(0, 0, buf, DisplayN18::GREEN, DisplayN18::BLACK);
00405     sprintf(buf,"Press RETRO to pull Lever");
00406     disp.drawString(0, DisplayN18::CHAR_HEIGHT + 3, buf, DisplayN18::RED, DisplayN18::BLACK);
00407     sprintf(buf,"Press ROBOT Lever up");
00408     disp.drawString(0, DisplayN18::CHAR_HEIGHT + 13, buf, DisplayN18::RED, DisplayN18::BLACK);
00409         
00410     while (true) {     
00411         wait(.1);
00412     } //while
00413 }
00414 //