Unzip the file and extract the folder into your PEQB64 directory. In the IDE make sure that you have the Run Option “Save EXE in source folder” checked.
QB64 Roulette.zip (Size: 3.47 MB / Downloads: 13)
This program is a graphical simulation of the game of Roulette where bets are placed against a ball falling into slots of a spinning wheel.
You place bets and await the outcome. The number and types of bets you can place in the game are complex, and so a User Manual in included if you wish to play seriously.
QB64 Roulette User Manual.pdf (Size: 359.84 KB / Downloads: 12)
Good luck!
The video shows the running program:
QB64 Roulette.zip (Size: 3.47 MB / Downloads: 13)
This program is a graphical simulation of the game of Roulette where bets are placed against a ball falling into slots of a spinning wheel.
You place bets and await the outcome. The number and types of bets you can place in the game are complex, and so a User Manual in included if you wish to play seriously.
QB64 Roulette User Manual.pdf (Size: 359.84 KB / Downloads: 12)
Good luck!
The video shows the running program:
Code: (Select All)
'Roulette Simulation by Magdha 2025-12-15 ex Qwerkey
'Clipart & Images from ripleys.com
'Sounds from freesfx.co.uk & findsounds.com
CONST False = 0, True = NOT False
CONST Sector! = (2 * _PI) / 38, BallHalfDiam%% = 18, XScreen% = 1300, YScreen% = 820
CONST XRoule% = 400, YRoule% = 410, RRoule% = 390, Inset! = 0.87, SlotInset! = 0.5, WinSize% = 80, RienSize% = 120
DIM Slots%%(38), TheBets%%(62, 37), BettingOdds!(63), PlacedStake%%(2, 3), Dollars&(9), Posn1%(62, 1), Posn2%(37, 1)
_TITLE ("QB64 Roulette")
'Images
$EXEICON:'.\roulette.ico'
Wheel& = _LOADIMAGE("Roulette Wheel.png", 33)
Ball& = _LOADIMAGE("Billiard Ball.png", 33)
W% = _WIDTH(Wheel&) - 1
TempImg& = _NEWIMAGE(XScreen%, YScreen%, 32)
_DEST TempImg&
COLOR _RGB32(200, 200, 200), _RGB32(34, 91, 121)
CLS
_PUTIMAGE (842, 0)-(XScreen% - 1, YScreen% - 1), _LOADIMAGE("Roulette Table.png", 32)
BackGround& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(51, 51, 32)
_DEST TempImg&
COLOR _RGB32(205, 127, 50)
CIRCLE (25, 25), 25
PAINT (25, 25)
FOR N%% = 1 TO 24
Phi! = 2 * N%% * _PI / 24
PSET (25 + CINT(25 * COS(Phi!)), 25 + CINT(25 * SIN(Phi!))), _RGB32(103, 63, 25)
NEXT N%%
CIRCLE (25, 25), 23, _RGB32(103, 63, 25)
COLOR _RGB32(103, 63, 25), _RGB32(205, 127, 50)
_PRINTSTRING (18, 18), "10"
Bronze& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(51, 51, 32)
_DEST TempImg&
COLOR _RGB32(205, 127, 50), _RGB32(10, 10, 10)
CLS
CIRCLE (25, 25), 25
PAINT (25, 25)
FOR N%% = 1 TO 24
Phi! = 2 * N%% * _PI / 24
PSET (25 + CINT(25 * COS(Phi!)), 25 + CINT(25 * SIN(Phi!))), _RGB32(103, 63, 25)
NEXT N%%
CIRCLE (25, 25), 23, _RGB32(103, 63, 25)
COLOR _RGB32(103, 63, 25), _RGBA32(205, 127, 50, 0)
_PRINTSTRING (18, 18), "10"
_SETALPHA 90
_SETALPHA 0, _RGBA32(10, 10, 10, 90)
AlphaBronze& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(51, 51, 32)
_DEST TempImg&
COLOR _RGB32(196, 199, 206)
CIRCLE (25, 25), 25
PAINT (25, 25)
FOR N%% = 1 TO 24
Phi! = 2 * N%% * _PI / 24
PSET (25 + CINT(25 * COS(Phi!)), 25 + CINT(25 * SIN(Phi!))), _RGB32(98, 100, 103)
NEXT N%%
CIRCLE (25, 25), 23, _RGB32(98, 100, 103)
COLOR _RGB32(98, 100, 103), _RGB32(196, 199, 206)
_PRINTSTRING (18, 18), "20"
Silver& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(51, 51, 32)
_DEST TempImg&
COLOR _RGB32(196, 199, 206), _RGB32(10, 10, 10)
CLS
CIRCLE (25, 25), 25
PAINT (25, 25)
FOR N%% = 1 TO 24
Phi! = 2 * N%% * _PI / 24
PSET (25 + CINT(25 * COS(Phi!)), 25 + CINT(25 * SIN(Phi!))), _RGB32(98, 100, 103)
NEXT N%%
CIRCLE (25, 25), 23, _RGB32(98, 100, 103)
COLOR _RGB32(98, 100, 103), _RGB32(196, 199, 206)
_PRINTSTRING (18, 18), "20"
_SETALPHA 90
_SETALPHA 0, _RGBA32(10, 10, 10, 90)
AlphaSilver& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(51, 51, 32)
_DEST TempImg&
COLOR _RGB32(212, 175, 55)
CIRCLE (25, 25), 25
PAINT (25, 25)
FOR N%% = 1 TO 24
Phi! = 2 * N%% * _PI / 24
PSET (25 + CINT(25 * COS(Phi!)), 25 + CINT(25 * SIN(Phi!))), _RGB32(106, 88, 28)
NEXT N%%
CIRCLE (25, 25), 23, _RGB32(106, 88, 28)
COLOR _RGB32(106, 88, 28), _RGB32(212, 175, 55)
_PRINTSTRING (18, 18), "50"
Gold& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(51, 51, 32)
_DEST TempImg&
COLOR _RGB32(212, 175, 55), _RGB32(10, 10, 10)
CLS
CIRCLE (25, 25), 25
PAINT (25, 25)
FOR N%% = 1 TO 24
Phi! = 2 * N%% * _PI / 24
PSET (25 + CINT(25 * COS(Phi!)), 25 + CINT(25 * SIN(Phi!))), _RGB32(106, 88, 28)
NEXT N%%
CIRCLE (25, 25), 23, _RGB32(106, 88, 28)
COLOR _RGB32(106, 88, 28), _RGB32(212, 175, 55)
_PRINTSTRING (18, 18), "50"
_SETALPHA 90
_SETALPHA 0, _RGBA32(10, 10, 10, 90)
AlphaGold& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(80, 100, 32)
_DEST TempImg&
COLOR _RGB32(170, 170, 170), _RGB32(34, 91, 171)
CLS
F& = _LOADFONT("tahomabd.ttf", 26)
_FONT F&
_PRINTSTRING (4, 8), "Q"
_PRINTSTRING (24, 28), "U"
_PRINTSTRING (42, 48), "I"
_PRINTSTRING (58, 68), "T"
_FONT 16
_FREEFONT F&
LINE (0, 0)-(79, 99), , B
LINE (1, 1)-(78, 98), , B
Quit& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(RienSize%, RienSize%, 32)
_DEST TempImg&
COLOR _RGB32(255, 255, 255), _RGB32(34, 91, 181)
CLS
F& = _LOADFONT("tahomabd.ttf", 30)
_FONT F&
_PRINTSTRING (16, 10), "Rien"
_PRINTSTRING (16, 44), "Ne Va"
_PRINTSTRING (16, 78), "Plus"
_FONT 16
_FREEFONT F&
FOR N%% = 1 TO 5
LINE (N%% - 1, N%% - 1)-(RienSize% - N%%, RienSize% - N%%), , B
NEXT N%%
Rien& = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(174, 62, 32)
_DEST TempImg&
COLOR _RGB32(200, 200, 200), _RGB32(34, 91, 171)
CLS
F& = _LOADFONT("tahomabd.ttf", 50)
_FONT F&
_PRINTSTRING (4, 6), "$"
LINE (0, 0)-(173, 61), , B
LINE (1, 1)-(172, 60), , B
_FONT 16
_FREEFONT F&
Riches& = HardwareImage&(TempImg&)
FOR N%% = 0 TO 9
TempImg& = _NEWIMAGE(34, 62, 32)
_DEST TempImg&
COLOR _RGB32(200, 200, 200), _RGBA32(34, 91, 171, 0)
CLS
F& = _LOADFONT("tahomabd.ttf", 50)
_FONT F&
_PRINTSTRING (4, 6), LTRIM$(STR$(N%%))
_FONT 16
_FREEFONT F&
Dollars&(N%%) = HardwareImage&(TempImg&)
NEXT N%%
TempImg& = _NEWIMAGE(2 * WinSize% + 1, 2 * WinSize% + 1, 32)
_DEST TempImg&
COLOR _RGB32(200, 200, 200), _RGB32(255, 255, 50)
CLS
F& = _LOADFONT("tahomabd.ttf", 60)
_FONT F&
_PRINTSTRING (20, 20), "You"
_PRINTSTRING (20, 90), "Win"
_FONT 16
_FREEFONT F&
LINE (0, 0)-(2 * WinSize%, 2 * WinSize%), _RGB32(200, 200, 0), B
LINE (1, 1)-(2 * WinSize% - 1, 2 * WinSize% - 1), _RGB32(215, 215, 0), B
LINE (1, 1)-(2 * WinSize% - 2, 2 * WinSize% - 2), _RGB32(230, 215, 0), B
Winner& = HardwareImage&(TempImg&)
'All data
FOR N%% = 1 TO 62
SELECT CASE N%%
CASE 1 TO 4, 61 TO 62
Posn1%(N%%, 0) = 911
SELECT CASE N%%
CASE 61
Posn1%(N%%, 1) = 138
CASE 62
Posn1%(N%%, 1) = 692
CASE ELSE
Posn1%(N%%, 1) = 138 + N%% * 111
END SELECT
CASE 5 TO 7
Posn1%(N%%, 0) = 990
Posn1%(N%%, 1) = 120 + (N%% - 5) * 222
CASE 8 TO 10
Posn1%(N%%, 1) = 774
Posn1%(N%%, 0) = 1055 + (N%% - 8) * 74
CASE 11
Posn1%(N%%, 0) = 990
Posn1%(N%%, 1) = 65
CASE 12 TO 23
Posn1%(N%%, 0) = 1262
Posn1%(N%%, 1) = 108 + CINT((N%% - 12) * 55.5)
CASE 24 TO 26
Posn1%(N%%, 1) = 81
Posn1%(N%%, 0) = 1092 + (N%% - 24) * 37
CASE 27
Posn1%(N%%, 0) = 1128
Posn1%(N%%, 1) = 49
CASE 28 TO 49
Posn1%(N%%, 0) = 1092 + ((N%% - 28) MOD 2) * 74
Posn1%(N%%, 1) = 136 + CINT(((N%% - 28) \ 2) * 55.5)
CASE ELSE '50 TO 60
Posn1%(N%%, 0) = 1262
Posn1%(N%%, 1) = 136 + CINT((N%% - 50) * 55.5)
END SELECT
NEXT N%%
FOR N%% = 0 TO 37
SELECT CASE N%%
CASE 0
Posn2%(N%%, 1) = 49
Posn2%(N%%, 0) = 1073
CASE 37
Posn2%(N%%, 1) = 49
Posn2%(N%%, 0) = 1185
CASE ELSE
Posn2%(N%%, 0) = 1055 + ((N%% - 1) MOD 3) * 74
Posn2%(N%%, 1) = 108 + CINT(((N%% - 1) \ 3) * 55.5)
END SELECT
NEXT N%%
'Slot Definitions
DATA 0,28,9,26,30,11,7,20,32,17,5,22,34,15,3,24,36,13,1,37,27,10,25,29,12,8,19,31,18,6,21,33,16,4,23,35,14,2
FOR N%% = 1 TO 38
READ Slots%%(N%%)
NEXT N%%
'Betting Odds
DATA 2.1111,2.1111,2.1111,2.1111
'4
DATA 3.1667,3.1667,3.1667
'7
DATA 3.1667,3.1667,3.1667
'10
DATA 3.1667
'11
DATA 12.3333,12.3333,12.3333,12.3333,12.3333,12.3333,12.3333,12.3333,12.3333,12.3333,12.3333,12.3333
'23
DATA 12.3333,12.3333,12.3333
'26
DATA 7.6
'27
DATA 9.5,9.5,9.5,9.5,9.5,9.5,9.5,9.5,9.5,9.5,9.5
'38
DATA 9.5,9.5,9.5,9.5,9.5,9.5,9.5,9.5,9.5,9.5,9.5
'49
DATA 6.3333,6.3333,6.3333,6.3333,6.3333,6.3333,6.3333,6.3333,6.3333,6.3333,6.3333
'60
DATA 2.1111,2.1111
'62
DATA 38
'63
FOR N%% = 1 TO 63
READ BettingOdds!(N%%)
NEXT N%%
'Bet Types
'We're not doing Split Bets (adjacent pairs) - already have too many bet types!
DATA 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36
FOR N%% = 1 TO 18 'Evens Pair
READ DummyNo%
TheBets%%(1, DummyNo%) = True
NEXT N%%
DATA 1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36
FOR N%% = 1 TO 18 'Red Rouge
READ DummyNo%
TheBets%%(2, DummyNo%) = True
NEXT N%%
DATA 2,4,6,8,10,11,13,15,17,20,22,24,26,28,29,31,33,35
FOR N%% = 1 TO 18 'Black Noir
READ DummyNo%
TheBets%%(3, DummyNo%) = True
NEXT N%%
DATA 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35
FOR N%% = 1 TO 18 'Odds Impair
READ DummyNo%
TheBets%%(4, DummyNo%) = True
NEXT N%%
DATA 1,2,3,4,5,6,7,8,9,10,11,12
FOR N%% = 1 TO 12 '1st 12 Premiere douzaine
READ DummyNo%
TheBets%%(5, DummyNo%) = True
NEXT N%%
DATA 13,14,15,16,17,18,19,20,21,22,23,24
FOR N%% = 1 TO 12 '2nd 12 Moyenne douzaine
READ DummyNo%
TheBets%%(6, DummyNo%) = True
NEXT N%%
DATA 25,26,27,28,29,30,31,32,33,34,35,36
FOR N%% = 1 TO 12 '3rd 12 Derniere douzaine
READ DummyNo%
TheBets%%(7, DummyNo%) = True
NEXT N%%
DATA 1,4,7,10,13,16,19,22,25,28,31,34
FOR N%% = 1 TO 12 '1st Column
READ DummyNo%
TheBets%%(8, DummyNo%) = True
NEXT N%%
DATA 2,5,8,11,14,17,20,23,26,29,32,35
FOR N%% = 1 TO 12 '2nd Column
READ DummyNo%
TheBets%%(9, DummyNo%) = True
NEXT N%%
DATA 3,6,9,12,15,18,21,24,27,30,33,36
FOR N%% = 1 TO 12 '3rd Column
READ DummyNo%
TheBets%%(10, DummyNo%) = True
NEXT N%%
DATA 1,5,9,12,14,16,19,23,27,30,32,34
FOR N%% = 1 TO 12 'Snake
READ DummyNo%
TheBets%%(11, DummyNo%) = True
NEXT N%%
DATA 1,2,3
FOR N%% = 1 TO 3 'Street1
READ DummyNo%
TheBets%%(12, DummyNo%) = True
NEXT N%%
DATA 4,5,6
FOR N%% = 1 TO 3 'Street2
READ DummyNo%
TheBets%%(13, DummyNo%) = True
NEXT N%%
DATA 7,8,9
FOR N%% = 1 TO 3 'Street3
READ DummyNo%
TheBets%%(14, DummyNo%) = True
NEXT N%%
DATA 10,11,12
FOR N%% = 1 TO 3 'Street4
READ DummyNo%
TheBets%%(15, DummyNo%) = True
NEXT N%%
DATA 13,14,15
FOR N%% = 1 TO 3 'Street5
READ DummyNo%
TheBets%%(16, DummyNo%) = True
NEXT N%%
DATA 16,17,18
FOR N%% = 1 TO 3 'Street6
READ DummyNo%
TheBets%%(17, DummyNo%) = True
NEXT N%%
DATA 19,20,21
FOR N%% = 1 TO 3 'Street7
READ DummyNo%
TheBets%%(18, DummyNo%) = True
NEXT N%%
DATA 22,23,24
FOR N%% = 1 TO 3 'Street8
READ DummyNo%
TheBets%%(19, DummyNo%) = True
NEXT N%%
DATA 25,26,27
FOR N%% = 1 TO 3 'Street9
READ DummyNo%
TheBets%%(20, DummyNo%) = True
NEXT N%%
DATA 28,29,30
FOR N%% = 1 TO 3 'Street10
READ DummyNo%
TheBets%%(21, DummyNo%) = True
NEXT N%%
DATA 31,32,33
FOR N%% = 1 TO 3 'Street11
READ DummyNo%
TheBets%%(22, DummyNo%) = True
NEXT N%%
DATA 34,35,36
FOR N%% = 1 TO 3 'Street12
READ DummyNo%
TheBets%%(23, DummyNo%) = True
NEXT N%%
DATA 0,1,2
FOR N%% = 1 TO 3 'Trio1
READ DummyNo%
TheBets%%(24, DummyNo%) = True
NEXT N%%
DATA 0,2,37
FOR N%% = 1 TO 3 'Trio2
READ DummyNo%
TheBets%%(25, DummyNo%) = True
NEXT N%%
DATA 2,3,37
FOR N%% = 1 TO 3 'Trio3
READ DummyNo%
TheBets%%(26, DummyNo%) = True
NEXT N%%
DATA 0,1,2,3,37
FOR N%% = 1 TO 5 'Top Line
READ DummyNo%
TheBets%%(27, DummyNo%) = True
NEXT N%%
DATA 1,2,4,5
FOR N%% = 1 TO 4 'Corner1
READ DummyNo%
TheBets%%(28, DummyNo%) = True
NEXT N%%
DATA 2,3,5,6
FOR N%% = 1 TO 4 'Corner2
READ DummyNo%
TheBets%%(29, DummyNo%) = True
NEXT N%%
DATA 4,5,7,8
FOR N%% = 1 TO 4 'Corner3
READ DummyNo%
TheBets%%(30, DummyNo%) = True
NEXT N%%
DATA 5,6,8,9
FOR N%% = 1 TO 4 'Corner4
READ DummyNo%
TheBets%%(31, DummyNo%) = True
NEXT N%%
DATA 7,8,10,11
FOR N%% = 1 TO 4 'Corner5
READ DummyNo%
TheBets%%(32, DummyNo%) = True
NEXT N%%
DATA 8,9,11,12
FOR N%% = 1 TO 4 'Corner6
READ DummyNo%
TheBets%%(33, DummyNo%) = True
NEXT N%%
DATA 10,11,13,14
FOR N%% = 1 TO 4 'Corner7
READ DummyNo%
TheBets%%(34, DummyNo%) = True
NEXT N%%
DATA 11,12,14,15
FOR N%% = 1 TO 4 'Corner8
READ DummyNo%
TheBets%%(35, DummyNo%) = True
NEXT N%%
DATA 13,14,16,17
FOR N%% = 1 TO 4 'Corner9
READ DummyNo%
TheBets%%(36, DummyNo%) = True
NEXT N%%
DATA 14,15,17,18
FOR N%% = 1 TO 4 'Corner10
READ DummyNo%
TheBets%%(37, DummyNo%) = True
NEXT N%%
DATA 16,17,19,20
FOR N%% = 1 TO 4 'Corner11
READ DummyNo%
TheBets%%(38, DummyNo%) = True
NEXT N%%
DATA 17,18,20,21
FOR N%% = 1 TO 4 'Corner12
READ DummyNo%
TheBets%%(39, DummyNo%) = True
NEXT N%%
DATA 19,20,22,23
FOR N%% = 1 TO 4 'Corner13
READ DummyNo%
TheBets%%(40, DummyNo%) = True
NEXT N%%
DATA 20,21,23,24
FOR N%% = 1 TO 4 'Corner14
READ DummyNo%
TheBets%%(41, DummyNo%) = True
NEXT N%%
DATA 22,23,25,26
FOR N%% = 1 TO 4 'Corner15
READ DummyNo%
TheBets%%(42, DummyNo%) = True
NEXT N%%
DATA 23,24,26,27
FOR N%% = 1 TO 4 'Corner16
READ DummyNo%
TheBets%%(43, DummyNo%) = True
NEXT N%%
DATA 25,26,28,29
FOR N%% = 1 TO 4 'Corner17
READ DummyNo%
TheBets%%(44, DummyNo%) = True
NEXT N%%
DATA 26,27,29,30
FOR N%% = 1 TO 4 'Corner18
READ DummyNo%
TheBets%%(45, DummyNo%) = True
NEXT N%%
DATA 28,29,31,32
FOR N%% = 1 TO 4 'Corner19
READ DummyNo%
TheBets%%(46, DummyNo%) = True
NEXT N%%
DATA 29,30,32,33
FOR N%% = 1 TO 4 'Corner20
READ DummyNo%
TheBets%%(47, DummyNo%) = True
NEXT N%%
DATA 31,32,34,35
FOR N%% = 1 TO 4 'Corner21
READ DummyNo%
TheBets%%(48, DummyNo%) = True
NEXT N%%
DATA 32,33,35,36
FOR N%% = 1 TO 4 'Corner22
READ DummyNo%
TheBets%%(49, DummyNo%) = True
NEXT N%%
DATA 1,2,3,4,5,6
FOR N%% = 1 TO 6 'Double Street1
READ DummyNo%
TheBets%%(50, DummyNo%) = True
NEXT N%%
DATA 4,5,6,7,8,9
FOR N%% = 1 TO 6 'Double Street2
READ DummyNo%
TheBets%%(51, DummyNo%) = True
NEXT N%%
DATA 7,8,9,10,11,12
FOR N%% = 1 TO 6 'Double Street3
READ DummyNo%
TheBets%%(52, DummyNo%) = True
NEXT N%%
DATA 10,11,12,13,14,15
FOR N%% = 1 TO 6 'Double Street4
READ DummyNo%
TheBets%%(53, DummyNo%) = True
NEXT N%%
DATA 13,14,15,16,17,18
FOR N%% = 1 TO 6 'Double Street5
READ DummyNo%
TheBets%%(54, DummyNo%) = True
NEXT N%%
DATA 16,17,18,19,20,21
FOR N%% = 1 TO 6 'Double Street6
READ DummyNo%
TheBets%%(55, DummyNo%) = True
NEXT N%%
DATA 19,20,21,22,23,24
FOR N%% = 1 TO 6 'Double Street7
READ DummyNo%
TheBets%%(56, DummyNo%) = True
NEXT N%%
DATA 22,23,24,25,26,27
FOR N%% = 1 TO 6 'Double Street8
READ DummyNo%
TheBets%%(57, DummyNo%) = True
NEXT N%%
DATA 25,26,27,28,29,30
FOR N%% = 1 TO 6 'Double Street9
READ DummyNo%
TheBets%%(58, DummyNo%) = True
NEXT N%%
DATA 28,29,30,31,32,33
FOR N%% = 1 TO 6 'Double Street10
READ DummyNo%
TheBets%%(59, DummyNo%) = True
NEXT N%%
DATA 31,32,33,34,35,36
FOR N%% = 1 TO 6 'Double Street11
READ DummyNo%
TheBets%%(60, DummyNo%) = True
NEXT N%%
DATA 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
FOR N%% = 1 TO 18 '1-18
READ DummyNo%
TheBets%%(61, DummyNo%) = True
NEXT N%%
DATA 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36
FOR N%% = 1 TO 18 '19-36
READ DummyNo%
TheBets%%(62, DummyNo%) = True
NEXT N%%
'Routine to Set Mouse Button (First Time Only)
_TITLE ("Set Mouse Button")
IF NOT _FILEEXISTS("mouse.cfg") THEN
Mousey& = _LOADIMAGE("Danger.png", 32)
SCREEN _NEWIMAGE(500, 500, 32)
_SCREENMOVE 100, 100
_DEST 0
CLS
_PUTIMAGE (50, 100), Mousey&
LOCATE 2, 7
PRINT "Click on the mouse below with your normal button";
LOCATE 3, 5
PRINT "Click (not double-click) to make this screen disappear";
LOCATE 5, 6
PRINT "There may be a delay - Please wait for next screen";
CorrectButton%% = False
WHILE NOT CorrectButton%%
_LIMIT 60
'Assumes hardware has mouse buttons, value <=5
IF _MOUSEINPUT THEN
CorrectButton%% = False
MouseButton%% = 1
WHILE NOT CorrectButton%% AND MouseButton%% <= 5
IF _MOUSEBUTTON(MouseButton%%) THEN
CorrectButton%% = True
ELSE
MouseButton%% = MouseButton%% + 1
END IF
WEND
END IF
WEND
_FREEIMAGE Mousey&
OPEN "mouse.cfg" FOR OUTPUT AS #2
PRINT #2, MouseButton%%
CLOSE #2
_DELAY 0.2
DO 'Make sure that mouse button is released
Dum%% = _MOUSEINPUT
LOOP UNTIL NOT _MOUSEBUTTON(MouseButton%%)
_AUTODISPLAY
CLS
'Also a routine to rate processor would be good for future version
ELSE
OPEN "mouse.cfg" FOR INPUT AS #1
INPUT #1, MouseButton%%
CLOSE #1
END IF
_TITLE ("QB64 Roulette - Esc to Quit")
SCREEN _NEWIMAGE(XScreen%, YScreen%, 32)
_DEST 0
_SCREENMOVE 0, 0
_DISPLAYORDER _HARDWARE
RANDOMIZE (TIMER)
Theta! = 2 * _PI * RND
Kitty! = 1000
Gambol%% = True
k$ = ""
_SNDLOOP _SNDOPEN("Ambience.ogg")
Rolling& = _SNDOPEN("B0.mp3")
Bounce& = _SNDOPEN("B1.mp3")
Settle& = _SNDOPEN("B2.mp3")
WHILE Gambol%%
RANDOMIZE (TIMER)
Phi! = _PI / 2
VBall! = -0.015 - RND * 0.02
VStop! = -0.004 + 0.001 * RND
BallRad! = RRoule% * Inset!
SlotRad! = RRoule% * SlotInset!
Devn! = BallRad! - SlotRad!
BAngle! = 0
Amp! = 1
BDecn%% = False
VDecn! = 0.99 * RND
VWheelStart! = 0.015 + 0.004 * RND
VWheel! = VWheelStart!
Bouncy% = 0
DoBounce%% = False
FindSlot%% = False
InSlot%% = False
VousGagnez%% = False
RollEm%% = True
'Place Bets
BetsPlaced%% = False
PickedUp%% = False
NoBets%% = 0
WHILE NOT BetsPlaced%%
_LIMIT 25
_PUTIMAGE (0, 0), BackGround&
_PUTIMAGE (20, 20), Quit&
X0Dash! = -RRoule% * COS(Theta!) + RRoule% * SIN(Theta!)
Y0Dash! = -RRoule% * SIN(Theta!) - RRoule% * COS(Theta!)
X1Dash! = RRoule% * COS(Theta!) + RRoule% * SIN(Theta!)
Y1Dash! = RRoule% * SIN(Theta!) - RRoule% * COS(Theta!)
X2Dash! = -RRoule% * COS(Theta!) - RRoule% * SIN(Theta!)
Y2Dash! = -RRoule% * SIN(Theta!) + RRoule% * COS(Theta!)
X3Dash! = RRoule% * COS(Theta!) - RRoule% * SIN(Theta!)
Y3Dash! = RRoule% * SIN(Theta!) + RRoule% * COS(Theta!)
XBall! = BallRad! * SIN(Phi!)
YBall! = -BallRad! * COS(Phi!)
_MAPTRIANGLE (0, 0)-(W%, 0)-(0, W%), Wheel& TO(X0Dash! + XRoule%, Y0Dash! + YRoule%)-(X1Dash! + XRoule%, Y1Dash! + YRoule%)-(X2Dash! + XRoule%, Y2Dash! + YRoule%)
_MAPTRIANGLE (W%, W%)-(0, W%)-(W%, 0), Wheel& TO(X3Dash! + XRoule%, Y3Dash! + YRoule%)-(X2Dash! + XRoule%, Y2Dash! + YRoule%)-(X1Dash! + XRoule%, Y1Dash! + YRoule%)
_PUTIMAGE (XBall! + XRoule% - BallHalfDiam%%, YBall! + YRoule% - BallHalfDiam%%)-(XBall! + XRoule% + BallHalfDiam%%, YBall! + YRoule% + BallHalfDiam%%), Ball&
IF Kitty! >= 10 THEN _PUTIMAGE (740, 10), Bronze&
IF Kitty! >= 30 THEN _PUTIMAGE (810, 10), Silver&
IF Kitty! >= 80 THEN _PUTIMAGE (880, 10), Gold&
_PUTIMAGE (650, YScreen% - 70), Riches&
Qty$ = LTRIM$(STR$(CINT(Kitty!)))
FOR N%% = 1 TO LEN(Qty$)
_PUTIMAGE (650 + 34 + 32 * (N%% - 1), YScreen% - 70), Dollars&(VAL(MID$(Qty$, N%%, 1)))
NEXT N%%
WHILE _MOUSEINPUT
XMouse% = _MOUSEX: YMouse% = _MOUSEY
IF _MOUSEBUTTON(MouseButton%%) THEN
IF XMouse% >= 25 AND XMouse% <= 95 AND YMouse% >= 25 AND YMouse% <= 115 THEN
'Quit
BetsPlaced%% = True
RollEm%% = False
Gambol%% = False
ELSEIF XMouse% >= 870 - RienSize% AND XMouse% <= 850 AND YMouse% >= 88 AND YMouse% <= 188 AND NoBets%% > 0 AND NOT PickedUp%% THEN
'Spin Wheel
BetsPlaced%% = True
ELSEIF NOT PickedUp%% AND NoBets%% < 3 THEN
'If over token then pick up that token
IF XMouse% >= 747 AND XMouse% <= 783 AND YMouse% >= 17 AND YMouse% <= 53 AND Kitty! >= 10 THEN
PickedUp%% = True
Stake%% = 10
ELSEIF XMouse% >= 817 AND XMouse% <= 853 AND YMouse% >= 17 AND YMouse% <= 53 AND Kitty! >= 30 THEN
PickedUp%% = True
Stake%% = 20
ELSEIF XMouse% >= 887 AND XMouse% <= 923 AND YMouse% >= 17 AND YMouse% <= 53 AND Kitty! >= 80 THEN
PickedUp%% = True
Stake%% = 50
END IF
ELSE
IF PickedUp%% THEN
BetType%% = 0
IF XMouse% >= 1033 AND XMouse% <= 1226 AND YMouse% >= 93 AND YMouse% <= 733 THEN
'Single & Corner bets
X1% = (XMouse% - 1033) \ 74: X2% = (XMouse% - 1033) MOD 74
Y1% = 2 * (YMouse% - 93) \ 111: Y2% = (2 * (YMouse% - 93) MOD 111) \ 2
IF X2% <= 44 AND Y2% <= 30 THEN
'Single Bet
BetType%% = 63
SelectedNo%% = 1 + X1% + 3 * Y1%
ELSEIF X2% >= 45 AND Y2% >= 31 AND XMouse% <= 1181 AND YMouse% <= 703 THEN
'Corner Bet
X3% = (XMouse% - 1077) \ 74
Y3% = 2 * (YMouse% - 123) \ 111
BetType%% = 28 + X3% + 2 * Y3%
ELSE
BetType%% = 0
END IF
ELSEIF XMouse% >= 1255 AND XMouse% <= 1272 AND YMouse% >= 93 AND YMouse% <= 733 THEN
'Street & Double Street
Y1% = 2 * (YMouse% - 93) \ 111: Y2% = (2 * (YMouse% - 93) MOD 111) \ 2
IF Y2% <= 30 THEN
BetType%% = 12 + Y1% 'Street Bet
ELSE
BetType%% = 50 + Y1% 'Double Street Bet
END IF
ELSEIF XMouse% >= 1031 AND XMouse% <= 1228 AND YMouse% >= 756 AND YMouse% <= 795 THEN
'Column Bets
X1% = (XMouse% - 1031) \ 74: X2% = (XMouse% - 1031) MOD 74
IF X2% <= 55 THEN
BetType%% = 8 + X1%
ELSE
BetType%% = 0
END IF
ELSEIF XMouse% >= 870 AND XMouse% <= 952 AND YMouse% >= 93 AND YMouse% <= 734 THEN
'Manque/Passe, Rouge/Noir, Pair/Impair Bets
Y1% = (YMouse% - 93) \ 111: Y2% = (YMouse% - 93) MOD 111
IF Y2% <= 90 THEN
IF Y1% = 0 THEN
BetType%% = 61
ELSEIF Y1% = 5 THEN
BetType%% = 62
ELSE
BetType%% = Y1%
END IF
ELSE
BetType%% = 0
END IF
ELSEIF XMouse% >= 975 AND XMouse% <= 1006 AND YMouse% >= 93 AND YMouse% <= 734 THEN
'Douzaine Bets
Y1% = (YMouse% - 93) \ 222: Y2% = (YMouse% - 93) MOD 222
IF Y2% <= 197 THEN
BetType%% = 5 + Y1%
ELSE
BetType%% = 0
END IF
ELSEIF XMouse% >= 1031 AND XMouse% <= 1228 AND YMouse% >= 26 AND YMouse% <= 65 THEN
'0, 00 & top line
IF XMouse% <= 1113 THEN
'0
BetType%% = 63
SelectedNo%% = 0
ELSEIF XMouse% >= 1144 THEN
'00
BetType%% = 63
SelectedNo%% = 37
ELSE
'Top Line Bet (0-1-2-3-00)
BetType%% = 27
END IF
ELSEIF XMouse% >= 975 AND XMouse% <= 1006 AND YMouse% >= 56 AND YMouse% <= 75 THEN
'Snake Bet
BetType%% = 11
ELSEIF XMouse% >= 1077 AND XMouse% <= 1181 AND YMouse% >= 66 AND YMouse% <= 92 THEN
'Trio Bets 0/1/2, 0/2/00, 00/2/3
X1% = (XMouse% - 1077) \ 37: X2% = (XMouse% - 1077) MOD 37
IF X2% <= 30 THEN
BetType%% = 24 + X1%
ELSE
BetType%% = 0
END IF
ELSE
BetType%% = 0
END IF
IF BetType%% <> 0 THEN
'Place Token (drop token if not true here)
NoBets%% = NoBets%% + 1
PlacedStake%%(0, NoBets%%) = Stake%%
PlacedStake%%(1, NoBets%%) = BetType%%
Kitty! = Kitty! - Stake%%
IF BetType%% = 63 THEN PlacedStake%%(2, NoBets%%) = SelectedNo%%
END IF
END IF
PickedUp%% = False
END IF
END IF
WEND
IF NoBets%% > 0 THEN
_PUTIMAGE (860 - RienSize%, 79), Rien&
FOR N%% = 1 TO NoBets%%
IF PlacedStake%%(1, N%%) = 63 THEN
XCoin% = Posn2%(PlacedStake%%(2, N%%), 0)
YCoin% = Posn2%(PlacedStake%%(2, N%%), 1)
ELSE
XCoin% = Posn1%(PlacedStake%%(1, N%%), 0)
YCoin% = Posn1%(PlacedStake%%(1, N%%), 1)
END IF
SELECT CASE PlacedStake%%(0, N%%)
CASE 10
_PUTIMAGE (XCoin% - 25, YCoin% - 25), Bronze&
CASE 20
_PUTIMAGE (XCoin% - 25, YCoin% - 25), Silver&
CASE ELSE
_PUTIMAGE (XCoin% - 25, YCoin% - 25), Gold&
END SELECT
NEXT N%%
END IF
IF PickedUp%% THEN
SELECT CASE Stake%%
CASE 10
_PUTIMAGE (XMouse% - 25, YMouse% - 25), AlphaBronze&
CASE 20
_PUTIMAGE (XMouse% - 25, YMouse% - 25), AlphaSilver&
CASE ELSE
_PUTIMAGE (XMouse% - 25, YMouse% - 25), AlphaGold&
END SELECT
END IF
k$ = INKEY$
IF k$ <> "" THEN
IF ASC(k$) = 27 THEN
BetsPlaced%% = True
RollEm%% = False
Gambol%% = False
END IF
END IF
_DISPLAY
WEND
_SNDPLAY Rolling&
_SNDVOL Rolling&, 0.8
WHILE RollEm%%
_LIMIT 70
_PUTIMAGE (0, 0), BackGround&
X0Dash! = -RRoule% * COS(Theta!) + RRoule% * SIN(Theta!)
Y0Dash! = -RRoule% * SIN(Theta!) - RRoule% * COS(Theta!)
X1Dash! = RRoule% * COS(Theta!) + RRoule% * SIN(Theta!)
Y1Dash! = RRoule% * SIN(Theta!) - RRoule% * COS(Theta!)
X2Dash! = -RRoule% * COS(Theta!) - RRoule% * SIN(Theta!)
Y2Dash! = -RRoule% * SIN(Theta!) + RRoule% * COS(Theta!)
X3Dash! = RRoule% * COS(Theta!) - RRoule% * SIN(Theta!)
Y3Dash! = RRoule% * SIN(Theta!) + RRoule% * COS(Theta!)
XBall! = BallRad! * SIN(Phi!)
YBall! = -BallRad! * COS(Phi!)
_MAPTRIANGLE (0, 0)-(W%, 0)-(0, W%), Wheel& TO(X0Dash! + XRoule%, Y0Dash! + YRoule%)-(X1Dash! + XRoule%, Y1Dash! + YRoule%)-(X2Dash! + XRoule%, Y2Dash! + YRoule%)
_MAPTRIANGLE (W%, W%)-(0, W%)-(W%, 0), Wheel& TO(X3Dash! + XRoule%, Y3Dash! + YRoule%)-(X2Dash! + XRoule%, Y2Dash! + YRoule%)-(X1Dash! + XRoule%, Y1Dash! + YRoule%)
_PUTIMAGE (XBall! + XRoule% - BallHalfDiam%%, YBall! + YRoule% - BallHalfDiam%%)-(XBall! + XRoule% + BallHalfDiam%%, YBall! + YRoule% + BallHalfDiam%%), Ball&
IF Kitty! >= 10 THEN _PUTIMAGE (740, 10), Bronze&
IF Kitty! >= 30 THEN _PUTIMAGE (810, 10), Silver&
IF Kitty! >= 80 THEN _PUTIMAGE (880, 10), Gold&
_PUTIMAGE (650, YScreen% - 70), Riches&
Qty$ = LTRIM$(STR$(CINT(Kitty!)))
FOR N%% = 1 TO LEN(Qty$)
_PUTIMAGE (650 + 34 + 32 * (N%% - 1), YScreen% - 70), Dollars&(VAL(MID$(Qty$, N%%, 1)))
NEXT N%%
FOR N%% = 1 TO NoBets%%
IF PlacedStake%%(1, N%%) = 63 THEN
XCoin% = Posn2%(PlacedStake%%(2, N%%), 0)
YCoin% = Posn2%(PlacedStake%%(2, N%%), 1)
ELSE
XCoin% = Posn1%(PlacedStake%%(1, N%%), 0)
YCoin% = Posn1%(PlacedStake%%(1, N%%), 1)
END IF
SELECT CASE PlacedStake%%(0, N%%)
CASE 10
_PUTIMAGE (XCoin% - 25, YCoin% - 25), Bronze&
CASE 20
_PUTIMAGE (XCoin% - 25, YCoin% - 25), Silver&
CASE ELSE
_PUTIMAGE (XCoin% - 25, YCoin% - 25), Gold&
END SELECT
NEXT N%%
IF VousGagnez%% THEN _PUTIMAGE (XRoule% - WinSize%, YRoule% - WinSize%), Winner&
_DISPLAY
Theta! = Theta! + VWheel!
IF Theta! > 2 * _PI THEN Theta! = Theta! - 2 * _PI
Phi! = Phi! + VBall!
IF Phi! < 0 THEN
Phi! = Phi! + 2 * _PI
ELSEIF Phi! > 2 * _PI THEN
Phi! = Phi! - 2 * _PI
END IF
IF NOT DoBounce%% THEN
VBall! = VBall! * 0.9963
IF VBall! > VStop! THEN DoBounce%% = True
ELSEIF NOT FindSlot%% THEN
'Move towards slots - with bounce
BallRad! = SlotRad! + Devn!
IF NOT BDecn%% THEN
VBall! = VBall! * 0.995
ELSE
VBall! = VBall! * VDecn!
END IF
Amp! = Amp! * 0.9965
Devn! = RRoule% * (Inset! - SlotInset!) * Amp! * COS(BAngle!)
IF Devn! < 0 THEN
Devn! = -Devn!
IF NOT BDecn%% THEN
BDecn%% = True
_SNDVOL Rolling&, 0.5
_SNDPLAY Bounce&
END IF
END IF
BAngle! = BAngle! + 0.0157
Bouncy% = Bouncy% + 1
IF Bouncy% = 300 THEN
FindSlot%% = True
Bouncy% = 0
IF Phi! >= Theta! THEN
AngDiff! = (Phi! - Theta!) / Sector!
ELSE
AngDiff! = (2 * _PI + Phi! - Theta!) / Sector!
END IF
SlotNo%% = INT(AngDiff!)
IF AngDiff! - SlotNo%% >= 0.5 THEN SlotNo%% = SlotNo%% + 1
SlotNo%% = SlotNo%% + 1
IF SlotNo%% > 38 THEN
SlotNo%% = 1
ELSEIF SlotNo%% < 1 THEN 'Probably shouldn't need this
SlotNo%% = 38
END IF
VBall! = 0
_SNDSTOP Rolling&
_SNDPLAY Settle&
END IF
ELSEIF NOT InSlot%% THEN
'Move to final position
RDevn! = BallRad! - SlotRad!
FinalAngle! = Theta! + (SlotNo%% - 1) * Sector!
IF FinalAngle! > 2 * _PI THEN FinalAngle! = FinalAngle! - 2 * _PI
IF Phi! - FinalAngle! > _PI THEN Phi! = Phi! - 2 * _PI
ADevn! = Phi! - FinalAngle!
BallRad! = SlotRad! + RDevn! * (100 - Bouncy%) / 100
Phi! = FinalAngle! + ADevn! * (100 - Bouncy%) / 100
Bouncy% = Bouncy% + 1
IF Bouncy% = 100 THEN
InSlot%% = True
BallRad! = SlotRad!
Bouncy% = 0
END IF
ELSE
'Ball In Slot
Phi! = Theta! + (SlotNo%% - 1) * Sector!
IF Phi! > 2 * _PI THEN Phi! = Phi! - 2 * _PI
Bouncy% = Bouncy% + 1
IF Bouncy% <= 100 THEN
VWheel! = VWheelStart! * (100 - Bouncy%) / 100
IF Bouncy% = 100 THEN
FOR N%% = 1 TO NoBets%%
IF PlacedStake%%(1, N%%) = 63 THEN
IF Slots%%(SlotNo%%) = PlacedStake%%(2, N%%) THEN
Kitty! = Kitty! + PlacedStake%%(0, N%%) * BettingOdds!(PlacedStake%%(1, N%%))
VousGagnez%% = True
END IF
ELSEIF TheBets%%(PlacedStake%%(1, N%%), Slots%%(SlotNo%%)) THEN
Kitty! = Kitty! + PlacedStake%%(0, N%%) * BettingOdds!(PlacedStake%%(1, N%%))
VousGagnez%% = True
END IF
NEXT N%%
IF Kitty! > 9999 THEN Kitty! = 9999
IF VousGagnez%% THEN
_SNDPLAYFILE "KerChing.mp3"
Pause% = 300
ELSE
Pause% = 200
END IF
END IF
ELSEIF Bouncy% = Pause% THEN
RollEm%% = False
Bouncy% = 0
END IF
END IF
k$ = INKEY$
IF k$ <> "" THEN
IF ASC(k$) = 27 THEN
RollEm%% = False
Gambol%% = False
END IF
END IF
DO 'make sure that mouse button is released
Dum%% = _MOUSEINPUT
LOOP UNTIL NOT _MOUSEBUTTON(MouseButton%%)
WEND
WEND
SYSTEM
FUNCTION HardwareImage& (ImageName&)
HardwareImage& = _COPYIMAGE(ImageName&, 33)
_FREEIMAGE ImageName&
END FUNCTION

