Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 //
Generated on Sat Jul 23 2022 17:26:56 by
