Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Fruit Machine Simulator (PE Edition)
#1
This is an updated version of my program which was featured at QB64.org.  There are some differences in the images on the reels, but mostly the code has been changed to make it clearer for study if desired.

_MAPTRIANGLE(3D) (a favourite Magdha method) has been used to give a realistic impression of Fruit Machine rotating reels.  The reels rotate realistically, but the randomness has been produced not by randomness of the rotations (which are fixed in order to keep sync with sounds) but by randomly positioning the fruit images around the reels at each spin.  This is not realistic but gives a method to set the desired chances of winning.

The chances of winning are such that the player will always make money after a suitably long time.  The chances of getting a winning line are about 1 in 5.



.zip   One-Armed Bandit.zip (Size: 9.26 MB / Downloads: 7)
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.

When in play, Press the Spacebar to start the reels turning.  Esc at any time to Quit.

   
   
The second screenshot shows the opening of the game where we pay tribute to Our Grand Overseer, but he does not appear in actual gameplay.


   
The picture shows the winning line statistics.



The video shows a short excerpt of the running program giving a winning line.



.pdf   Fruit Machine Guide.pdf (Size: 213.21 KB / Downloads: 19)
The User Guide gives further background but is not a necessity to run the game.


Code: (Select All)
' One-armed Bandit Simulation by Magdha 2025-12-10 ex Qwerkey
' Updated for PE

' Clipart from openclipart.org, nicepng.com
' Sounds from FreeSFX.co.uk

_TITLE "One-Armed Bandit PE Edition - Esc to Quit"
$EXEICON:'.\lemon.ico'

CONST False = 0, True = NOT False
CONST SlowSpin! = 0.002, Fruit% = 81, DoshStop% = 250, WinStop% = 750, Ark! = 2 * _PI / 23, Rad! = 23 * Fruit% / (2 * _PI)
CONST Zplane% = -400, BX% = 150, BY% = 240, XB1% = -132, XB2% = 140

DIM ReelPos!(2, 22), deltaTheta!(2), Reels%(2, 22), ReelStats%(2, 4), Pict&(6), WinLine%%(2)
DIM Spin%%(2, 2), SpinCount%(2, 1), NumImg&(9), Taper%%(3, 7), Segment%%(9, 6), Plum%(1, 5), Blinking%(2)
DIM StarsHoriz!(9, 1, 1), StarsVert!(5, 1, 1), Banner&(2)

RANDOMIZE (TIMER)

'IMAGES
'7-segment display
RESTORE SevenSegment
FOR S%% = 1 TO 3
    FOR R%% = 1 TO 7
        READ Taper%%(S%%, R%%)
    NEXT R%%
NEXT S%%
FOR S%% = 0 TO 9
    FOR R%% = 0 TO 6
        READ Segment%%(S%%, R%%)
    NEXT R%%
NEXT S%%
Horiz& = _NEWIMAGE(19, 7, 32)
_DEST Horiz&
COLOR _RGB32(3, 220, 3), _RGBA32(0, 0, 0, 0)
CLS
FOR S%% = 1 TO 3
    FOR R%% = 1 TO 7
        IF Taper%%(S%%, R%%) THEN
            PSET (S%% - 1, R%% - 1), _RGB32(3, 220, 3)
            PSET (19 - S%%, 7 - R%%), _RGB32(3, 220, 3)
        END IF
    NEXT R%%
NEXT S%%
LINE (3, 0)-(15, 6), , BF
Vert& = _NEWIMAGE(7, 19, 32)
_DEST Vert&
COLOR _RGB32(3, 220, 3), _RGBA32(0, 0, 0, 0)
CLS
FOR S%% = 1 TO 3
    FOR R%% = 1 TO 7
        IF Taper%%(S%%, R%%) THEN
            PSET (R%% - 1, S%% - 1), _RGB32(3, 220, 3)
            PSET (7 - R%%, 19 - S%%), _RGB32(3, 220, 3)
        END IF
    NEXT R%%
NEXT S%%
LINE (0, 3)-(6, 15), , BF
FOR S%% = 0 TO 9
    TempImg& = _NEWIMAGE(29, 51, 32)
    _DEST TempImg&
    IF Segment%%(S%%, 0) THEN _PUTIMAGE (5, 0), Horiz&
    IF Segment%%(S%%, 1) THEN _PUTIMAGE (0, 5), Vert&
    IF Segment%%(S%%, 2) THEN _PUTIMAGE (22, 5), Vert&
    IF Segment%%(S%%, 3) THEN _PUTIMAGE (5, 22), Horiz&
    IF Segment%%(S%%, 4) THEN _PUTIMAGE (0, 27), Vert&
    IF Segment%%(S%%, 5) THEN _PUTIMAGE (22, 27), Vert&
    IF Segment%%(S%%, 6) THEN _PUTIMAGE (5, 44), Horiz&
    NumImg&(S%%) = HardwareImage&(TempImg&)
NEXT S%%
_FREEIMAGE Vert&
_FREEIMAGE Horiz&
'Fruit Images
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("cherries.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(0) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("lemony.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(1) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("strawberry.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(2) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("bell.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(3) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_FONT _LOADFONT("calibriz.ttf", 36, "bold")
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
_PRINTSTRING (10, 30), "BAR"
LINE (6, 24)-(74, 56), , B
Pict&(4) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("joker.png", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(5) = HardwareImage&(TempImg&)
TempImg& = _NEWIMAGE(Fruit%, Fruit%, 32)
_DEST TempImg&
COLOR _RGB32(0, 0, 0), _RGB32(255, 255, 235)
CLS
_PUTIMAGE (9, 9), _LOADIMAGE("Steve The Amazing.jpg", 32)
LINE (0, 10)-(3, 30), , BF
LINE (0, 50)-(3, 70), , BF
LINE (77, 10)-(80, 30), , BF
LINE (77, 50)-(80, 70), , BF
Pict&(6) = HardwareImage&(TempImg&)
'Start Frame
TempImg& = _NEWIMAGE(370, 64, 32)
_DEST TempImg&
COLOR _RGBA32(0, 0, 255, 20), _RGBA32(200, 200, 200, 0)
_FONT _LOADFONT("calibriz.ttf", 80)
_PRINTSTRING (25, 5), "MAGDHA"
Greetings& = HardwareImage&(TempImg&)
'Banners (3D)
FOR S%% = 0 TO 2
    TempImg& = _NEWIMAGE(BX%, BY%, 32)
    _DEST TempImg&
    COLOR _RGB32(38 + 20 * S%%, 121 + 20 * S%%, 139 + 20 * S%%), _RGBA32(200, 200, 200, 0)
    _FONT _LOADFONT("arialbd.ttf", 74, "bold")
    _PRINTSTRING (15, 50), "Q"
    COLOR _RGB32(15 + S%% * 5, 30 + S%% * 10, 190 + S%% * 20)
    _PRINTSTRING (75, 50), "B"
    COLOR _RGB32(203 + S%% * 20, 135 + S%% * 20, 10 + S%% * 2)
    _PRINTSTRING (28, 115), "6"
    COLOR _RGB32(203 + S%% * 20, 74 + S%% * 10, 10 + S%% * 2)
    _PRINTSTRING (76, 115), "4"
    _FONT 16
    _FONT _LOADFONT("arialbi.ttf", 74, "bold,italic")
    COLOR _RGB32(240, 240, 70)
    _PRINTSTRING (20, 180), "PE"
    Banner&(S%%) = HardwareImage&(TempImg&)
NEXT S%%
'Stars
Star& = _LOADIMAGE("Star.png", 33)
DollarSign& = _LOADIMAGE("Dollar3.png", 33)
Payout& = _LOADIMAGE("Payout.png", 33)
'Background & Frames
PEBackground& = _LOADIMAGE("PEBackground.jpg", 32)
TempImg& = _NEWIMAGE(800, 600, 32)
_DEST TempImg&
_PUTIMAGE (0, 0)-(799, 161), PEBackground&, , (0, 0)-(799, 161)
_PUTIMAGE (0, 438)-(799, 599), PEBackground&, , (0, 438)-(799, 599)
_PUTIMAGE (0, 0)-(235, 599), PEBackground&, , (0, 0)-(235, 599)
_PUTIMAGE (564, 0)-(799, 599), PEBackground&, , (564, 0)-(799, 599)
_FREEIMAGE PEBackground&
'Reel masks
COLOR _RGBA32(80, 80, 80, 65)
LINE (236, 162)-(563, 250), , BF
LINE (236, 349)-(563, 437), , BF
'Frames & frame masks
COLOR _RGBA32(80, 80, 80, 120)
LINE (250, 14)-(529, 123), , BF
LINE (190, 476)-(606, 585), , BF
_PUTIMAGE (217, 145), _LOADIMAGE("Frame3.png", 32)
_PUTIMAGE (250, 14), _LOADIMAGE("Frame1.png", 32)
_PUTIMAGE (190, 476), _LOADIMAGE("Frame2.png", 32)
Bandit& = HardwareImage&(TempImg&)
'Reels background
TempImg& = _NEWIMAGE(400, 300, 32)
_DEST TempImg&
COLOR _RGB32(130, 130, 130)
LINE (0, 0)-(399, 399), , BF
Back& = HardwareImage&(TempImg&)
'Phoenix Logo
Phoenix& = _LOADIMAGE("Red Phoenix.png", 33)

'SOUNDS
Ambience& = _SNDOPEN("Ambience.ogg", "SYNC,VOL")
_SNDVOL Ambience&, 0.3
KerChing& = _SNDOPEN("KerChing.ogg", "SYNC,VOL")
_SNDVOL KerChing&, 1
SlotMachine& = _SNDOPEN("Slot Machine1.ogg", "SYNC,VOL")
_SNDVOL SlotMachine&, 1

'Set Data and Initial Values
'Set Blinking Rate for Winnings Display
RESTORE Blinks:
FOR S%% = 1 TO 2
    READ Blinking%(S%%)
NEXT S%%
'Set Winnings Amounts
RESTORE Plums:
FOR S%% = 0 TO 1
    FOR R%% = 0 TO 5
        READ Plum%(S%%, R%%)
    NEXT R%%
NEXT S%%
'Set Chances of Winning Lines
RESTORE ReelData
FOR S%% = 0 TO 2
    FOR R%% = 0 TO 4
        READ ReelStats%(S%%, R%%)
    NEXT R%%
NEXT S%%
'Set Timings of Reel Spin
RESTORE SpinData:
FOR S%% = 0 TO 2
    READ SpinCount%(S%%, 1)
NEXT S%%
'Set Rates of Reel Spin
RESTORE ThetaData:
FOR S%% = 0 TO 2
    READ deltaTheta!(S%%)
NEXT S%%

'Set Reel Fruit Types - Fruits Are Never The Same as Neighbours at Start
FOR Reel%% = 0 TO 2
    FOR Posn%% = 0 TO 22
        ReelPos!(Reel%%, Posn%%) = (Posn%% * Ark!) - _PI + Ark! / 2
        IF Posn%% = 11 THEN
            'Steve The Amazing in payout line at start
            Reels%(Reel%%, 11) = 6
        ELSE
            Same%% = True
            WHILE Same%%
                P! = 1000 * RND
                IF P! >= ReelStats%(Reel%%, 4) THEN
                    IF Posn%% = 0 THEN
                        Reels%(Reel%%, Posn%%) = 4
                        Same%% = False
                    ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 4 OR Reels%(Reel%%, Posn%% - 1) = 4) THEN
                        'Same as previous
                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 4 THEN
                        'Same as previous
                    ELSE
                        Reels%(Reel%%, Posn%%) = 4
                        Same%% = False
                    END IF
                ELSEIF P! >= ReelStats%(Reel%%, 3) THEN
                    IF Posn%% = 0 THEN
                        Reels%(Reel%%, Posn%%) = 3
                        Same%% = False
                    ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 3 OR Reels%(Reel%%, Posn%% - 1) = 3) THEN
                        'Same as previous
                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 3 THEN
                        'Same as previous
                    ELSE
                        Reels%(Reel%%, Posn%%) = 3
                        Same%% = False
                    END IF
                ELSEIF P! >= ReelStats%(Reel%%, 2) THEN
                    IF Posn%% = 0 THEN
                        Reels%(Reel%%, Posn%%) = 2
                        Same%% = False
                    ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 2 OR Reels%(Reel%%, Posn%% - 1) = 2) THEN
                        'Same as previous
                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 2 THEN
                        'Same as previous
                    ELSE
                        Reels%(Reel%%, Posn%%) = 2
                        Same%% = False
                    END IF
                ELSEIF P! >= ReelStats%(Reel%%, 1) THEN
                    IF Posn%% = 0 THEN
                        Reels%(Reel%%, Posn%%) = 1
                        Same%% = False
                    ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 1 OR Reels%(Reel%%, Posn%% - 1) = 1) THEN
                        'Same as previous
                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 1 THEN
                        'Same as previous
                    ELSE
                        Reels%(Reel%%, Posn%%) = 1
                        Same%% = False
                    END IF
                ELSEIF P! >= ReelStats%(Reel%%, 0) THEN
                    IF Posn%% = 0 THEN
                        Reels%(Reel%%, Posn%%) = 0
                        Same%% = False
                    ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 9 OR Reels%(Reel%%, Posn%% - 1) = 0) THEN
                        'Same as previous
                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 0 THEN
                        'Same as previous
                    ELSE
                        Reels%(Reel%%, Posn%%) = 0
                        Same%% = False
                    END IF
                ELSE
                    IF Posn%% = 0 THEN
                        Reels%(Reel%%, Posn%%) = 5
                        Same%% = False
                    ELSEIF Posn%% = 22 AND (Reels%(Reel%%, 0) = 5 OR Reels%(Reel%%, Posn%% - 1) = 5) THEN
                        'Same as previous
                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 5 THEN
                        'Same as previous
                    ELSE
                        Reels%(Reel%%, Posn%%) = 5
                        Same%% = False
                    END IF
                END IF
            WEND
        END IF
    NEXT Posn%%
    Spin%%(Reel%%, 0) = True
    Spin%%(Reel%%, 1) = True
    Spin%%(Reel%%, 2) = False
    SpinCount%(Reel%%, 0) = 0
NEXT Reel%%

'Stars Display
FOR S%% = 0 TO 9
    FOR R%% = 0 TO 1
        IF RND > 0.5 THEN
            StarsHoriz!(S%%, R%%, 1) = (RND + 0.5) * 0.011
        ELSE
            StarsHoriz!(S%%, R%%, 1) = -(RND + 0.5) * 0.011
        END IF
    NEXT R%%
NEXT S%%
FOR S%% = 0 TO 5
    FOR R%% = 0 TO 1
        IF RND > 0.5 THEN
            StarsVert!(S%%, R%%, 1) = (RND + 0.5) * 0.011
        ELSE
            StarsVert!(S%%, R%%, 1) = -(RND + 0.5) * 0.011
        END IF
    NEXT R%%
NEXT S%%

'Set Initial Values & Load Files
Twinkle%% = True 'Set this to False if twirling stars not required
DoSounds%% = True 'Set this to False if Sounds Not Required
RandomReels%% = True 'Set this to False to ensure Fruits Are Never the Same as Neighbouring
X0% = -Fruit% \ 2
X1% = X0% + Fruit% - 1
X2% = X0% - (Fruit% + 5)
X3% = X1% - (Fruit% + 5)
Spin%%(2, 2) = True
SettleUp%% = False
Cash& = 500
Winnings% = 0
WinCount% = 0
Blink%% = False
WinBan%% = False
WinDisp%% = False
AmbCount& = 0
DispMagdha%% = True
Casino%% = True
IF DoSounds%% THEN _SNDPLAY Ambience&

SCREEN _NEWIMAGE(1000, 800, 32)
_SCREENMOVE 30, 10
_DEST 0
_DISPLAYORDER _HARDWARE 'Hardware images only

WHILE Casino%%

    _LIMIT 250

    'Reel Images
    _PUTIMAGE (300, 250), Back&
    FOR Reel%% = 0 TO 2
        FOR Posn%% = 0 TO 22
            IF ReelPos!(Reel%%, Posn%%) < 4 * _PI / 23 AND ReelPos!(Reel%%, Posn%%) > -4 * _PI / 23 THEN
                FOR Q%% = 0 TO 3
                    Theta0! = ReelPos!(Reel%%, Posn%%) + (-(Fruit% / 2) + Q%% * Fruit% / 4) / Rad!
                    Theta1! = ReelPos!(Reel%%, Posn%%) + (-(Fruit% / 2) + (Q%% + 1) * Fruit% / 4) / Rad!
                    Zed0! = Rad! * COS(Theta0!) - 2.5 * Rad!
                    Zed1! = Rad! * COS(Theta1!) - 2.5 * Rad!
                    Y0% = SIN(Theta0!) * Rad!
                    Y1% = SIN(Theta1!) * Rad!
                    X1% = Fruit% - 1
                    Y2% = CINT(Fruit% - 1 - (Q%% * Fruit% / 4))
                    Y3% = CINT(Fruit% - 1 - ((Q%% + 1) * Fruit% / 4))
                    X4% = X2% + Reel%% * (Fruit% + 5)
                    X5% = X3% + Reel%% * (Fruit% + 5)
                    _MAPTRIANGLE (0, Y2%)-(X1%, Y2%)-(0, Y3%), Pict&(Reels%(Reel%%, Posn%%)) TO(X4%, Y0%, Zed0!)-(X5%, Y0%, Zed0!)-(X4%, Y1%, Zed1!), , _SMOOTH
                    _MAPTRIANGLE (X1%, Y3%)-(0, Y3%)-(X1%, Y2%), Pict&(Reels%(Reel%%, Posn%%)) TO(X5%, Y1%, Zed1!)-(X4%, Y1%, Zed1!)-(X5%, Y0%, Zed0!), , _SMOOTH
                NEXT Q%%
            END IF
        NEXT Posn%%
    NEXT Reel%%

    'Background, logo, banners & cash images
    _PUTIMAGE (100, 100), Bandit&
    _PUTIMAGE (140, 130)-(290, 280), Phoenix&
    _PUTIMAGE (720, 130)-(870, 280), Phoenix&
    _PUTIMAGE (390, 136), DollarSign&
    C$ = LTRIM$(STR$(Cash&))
    FOR S%% = 1 TO LEN(C$)
        R%% = VAL(MID$(C$, S%%, 1))
        _PUTIMAGE (410 + (38 * S%%), 143), NumImg&(R%%)
    NEXT S%%
    FOR S%% = 0 TO 2
        Z1% = Zplane% + 4 * (S%% - 1)
        _MAPTRIANGLE (0, 0)-(149, 0)-(0, 249), Banner&(S%%) TO(XB1% - BX%, BY% / 2, Z1%)-(XB1%, BY% / 2, Z1%)-(XB1% - BX%, -BY% / 2, Z1%)
        _MAPTRIANGLE (149, 249)-(0, 249)-(149, 0), Banner&(S%%) TO(XB1%, -BY% / 2, Z1%)-(XB1% - BX%, -BY% / 2, Z1%)-(XB1%, BY% / 2, Z1%)
        _MAPTRIANGLE (0, 0)-(149, 0)-(0, 249), Banner&(S%%) TO(XB2%, BY% / 2, Z1%)-(XB2% + BX%, BY% / 2, Z1%)-(XB2%, -BY% / 2, Z1%)
        _MAPTRIANGLE (149, 249)-(0, 249)-(149, 0), Banner&(S%%) TO(XB2% + BX%, -BY% / 2, Z1%)-(XB2%, -BY% / 2, Z1%)-(XB2% + BX%, BY% / 2, Z1%)
    NEXT S%%
    IF DispMagdha%% THEN
        _PUTIMAGE (315, 600), Greetings&
    ELSEIF Blink%% AND (WinDisp%% OR WinBan%%) THEN
        _PUTIMAGE (315, 600), Payout&
        C$ = LTRIM$(STR$(Swag%))
        FOR S%% = 1 TO LEN(C$)
            R%% = VAL(MID$(C$, S%%, 1))
            _PUTIMAGE (540 + (38 * S%%), 605), NumImg&(R%%)
        NEXT S%%
    END IF

    'Star Images
    IF Twinkle%% THEN
        FOR S%% = 0 TO 9
            FOR R%% = 0 TO 1
                StarsHoriz!(S%%, R%%, 0) = StarsHoriz!(S%%, R%%, 0) + StarsHoriz!(S%%, R%%, 1)
                IF StarsHoriz!(S%%, R%%, 0) > _PI THEN
                    StarsHoriz!(S%%, R%%, 0) = StarsHoriz!(S%%, R%%, 0) - 2 * _PI
                ELSEIF StarsHoriz!(S%%, R%%, 0) < -_PI THEN
                    StarsHoriz!(S%%, R%%, 0) = StarsHoriz!(S%%, R%%, 0) + 2 * _PI
                END IF
                StarZ1% = CINT((15 * SIN(StarsHoriz!(S%%, R%%, 0))) + Zplane%)
                StarZ2% = CINT((-15 * SIN(StarsHoriz!(S%%, R%%, 0))) + Zplane%)
                StarX1% = CINT((15 * COS(StarsHoriz!(S%%, R%%, 0)))) - 320 + S%% * 71
                StarX2% = CINT((-15 * COS(StarsHoriz!(S%%, R%%, 0)))) - 320 + S%% * 71
                StarY1% = 15 + 250 - R%% * 500
                StarY2% = -15 + 250 - R%% * 500
                _MAPTRIANGLE (29, 0)-(0, 0)-(29, 29), Star& TO(StarX1%, StarY1%, StarZ1%)-(StarX2%, StarY1%, StarZ2%)-(StarX1%, StarY2%, StarZ1%), , _SMOOTH
                _MAPTRIANGLE (0, 29)-(29, 29)-(0, 0), Star& TO(StarX2%, StarY2%, StarZ2%)-(StarX1%, StarY2%, StarZ1%)-(StarX2%, StarY1%, StarZ2%), , _SMOOTH
                IF RND > 0.9995 THEN
                    IF RND > 0.5 THEN
                        StarsHoriz!(S%%, R%%, 1) = (RND + 0.5) * 0.011
                    ELSE
                        StarsHoriz!(S%%, R%%, 1) = -(RND + 0.5) * 0.011
                    END IF
                END IF
            NEXT R%%
        NEXT S%%
        FOR S%% = 0 TO 5
            FOR R%% = 0 TO 1
                StarsVert!(S%%, R%%, 0) = StarsVert!(S%%, R%%, 0) + StarsVert!(S%%, R%%, 1)
                IF StarsVert!(S%%, R%%, 0) > _PI THEN
                    StarsVert!(S%%, R%%, 0) = StarsVert!(S%%, R%%, 0) - 2 * _PI
                ELSEIF StarsVert!(S%%, R%%, 0) < -_PI THEN
                    StarsVert!(S%%, R%%, 0) = StarsVert!(S%%, R%%, 0) + 2 * _PI
                END IF
                StarZ1% = CINT((15 * SIN(StarsVert!(S%%, R%%, 0))) + Zplane%)
                StarZ2% = CINT((-15 * SIN(StarsVert!(S%%, R%%, 0))) + Zplane%)
                StarX1% = CINT((15 * COS(StarsVert!(S%%, R%%, 0)))) - 320 + R%% * 640
                StarX2% = CINT((-15 * COS(StarsVert!(S%%, R%%, 0)))) - 320 + R%% * 640
                StarY1% = 15 + 180 - S%% * 71
                StarY2% = -15 + 180 - S%% * 71
                _MAPTRIANGLE (29, 0)-(0, 0)-(29, 29), Star& TO(StarX1%, StarY1%, StarZ1%)-(StarX2%, StarY1%, StarZ2%)-(StarX1%, StarY2%, StarZ1%)
                _MAPTRIANGLE (0, 29)-(29, 29)-(0, 0), Star& TO(StarX2%, StarY2%, StarZ2%)-(StarX1%, StarY2%, StarZ1%)-(StarX2%, StarY1%, StarZ2%)
                IF RND > 0.9995 THEN
                    IF RND > 0.5 THEN
                        StarsHoriz!(S%%, R%%, 1) = (RND + 0.5) * 0.011
                    ELSE
                        StarsHoriz!(S%%, R%%, 1) = -(RND + 0.5) * 0.011
                    END IF
                END IF
            NEXT R%%
        NEXT S%%
    END IF

    _DISPLAY

    'Reel Spin
    IF NOT Spin%%(2, 2) THEN
        FOR Reel%% = 0 TO 2
            IF Spin%%(Reel%%, 0) THEN
                SpinCount%(Reel%%, 0) = SpinCount%(Reel%%, 0) + 1
                IF SpinCount%(Reel%%, 0) = SpinCount%(Reel%%, 1) THEN Spin%%(Reel%%, 0) = False
            ELSEIF NOT Spin%%(Reel%%, 2) THEN
                AngleRem!(Reel%%) = AngleRem!(Reel%%) - SlowSpin!
                IF AngleRem!(Reel%%) <= 0 THEN
                    Spin%%(Reel%%, 2) = True
                    IF Reel%% = 2 THEN SettleUp%% = True
                END IF
            END IF
            FOR Posn%% = 0 TO 22
                IF Spin%%(Reel%%, 0) THEN
                    ReelPos!(Reel%%, Posn%%) = ReelPos!(Reel%%, Posn%%) - deltaTheta!(Reel%%)
                ELSEIF NOT Spin%%(Reel%%, 2) THEN
                    ReelPos!(Reel%%, Posn%%) = ReelPos!(Reel%%, Posn%%) - SlowSpin!
                END IF
                IF ReelPos!(Reel%%, Posn%%) < -_PI THEN ReelPos!(Reel%%, Posn%%) = ReelPos!(Reel%%, Posn%%) + 2 * _PI
                IF ReelPos!(Reel%%, Posn%%) < 4 * _PI / 23 AND ReelPos!(Reel%%, Posn%%) > -4 * _PI / 23 THEN
                    IF NOT Spin%%(Reel%%, 0) AND Spin%%(Reel%%, 1) AND ReelPos!(Reel%%, Posn%%) < 4 * _PI / 23 AND ReelPos!(Reel%%, Posn%%) >= 2 * _PI / 23 THEN
                        AngleRem!(Reel%%) = ReelPos!(Reel%%, Posn%%)
                        WinLine%%(Reel%%) = Reels%(Reel%%, Posn%%)
                        Spin%%(Reel%%, 1) = False
                    END IF
                END IF
            NEXT Posn%%
        NEXT Reel%%
    END IF

    'Check for Winning Lines
    IF SettleUp%% THEN
        SettleUp%% = False
        HaveWon%% = False
        IF (WinLine%%(2) = 0 OR WinLine%%(2) = 4) AND WinLine%%(1) = 0 AND WinLine%%(0) = 0 THEN
            Plumpet%% = 1
            HaveWon%% = True
        ELSEIF (WinLine%%(2) = 1 OR WinLine%%(2) = 4) AND WinLine%%(1) = 1 AND WinLine%%(0) = 1 THEN
            Plumpet%% = 2
            HaveWon%% = True
        ELSEIF (WinLine%%(2) = 2 OR WinLine%%(2) = 4) AND WinLine%%(1) = 2 AND WinLine%%(0) = 2 THEN
            Plumpet%% = 3
            HaveWon%% = True
        ELSEIF (WinLine%%(2) = 3 OR WinLine%%(2) = 4) AND WinLine%%(1) = 3 AND WinLine%%(0) = 3 THEN
            Plumpet%% = 4
            HaveWon%% = True
        ELSEIF WinLine%%(2) = 0 AND WinLine%%(1) = 0 THEN
            Plumpet%% = 0
            HaveWon%% = True
        ELSEIF WinLine%%(2) = 4 AND WinLine%%(1) = 4 AND WinLine%%(0) = 4 THEN
            Plumpet%% = 5
            HaveWon%% = True
        END IF
        IF HaveWon%% THEN
            Winnings% = Plum%(0, Plumpet%%)
            Swag% = Winnings%
            Blink%% = True
            MoreDosh%% = True
            Dosh%% = 1
            WinBan%% = True
        END IF
        FOR Reel%% = 0 TO 2
            FOR Posn%% = 0 TO 22
                Cardinal% = CINT(ReelPos!(Reel%%, Posn%%) / Ark!)
                ReelPos!(Reel%%, Posn%%) = Cardinal% * Ark!
            NEXT Posn%%
        NEXT Reel%%
    END IF

    'Determine Winnings
    IF Winnings% <> 0 THEN
        IF Dosh%% > Plum%(1, Plumpet%%) THEN
            Winnings% = 0
            WinBan%% = False
            WinDisp%% = True
        ELSE
            IF MoreDosh%% THEN
                Cash& = Cash& + (Winnings% / Plum%(1, Plumpet%%))
                IF Cash& > 5000 THEN Cash& = 5000
                Dosh%% = Dosh%% + 1
                MoreDosh%% = False
                IF DoSounds%% THEN _SNDPLAY KerChing&
                DoshCount% = 0
            ELSE
                DoshCount% = DoshCount% + 1
                IF DoshCount% = DoshStop% THEN MoreDosh%% = True
            END IF
        END IF
    END IF

    'Display Winnings
    IF WinDisp%% THEN
        IF WinCount% < WinStop% THEN
            WinCount% = WinCount% + 1
        ELSE
            WinDisp%% = False
        END IF
    END IF
    Blinking%(0) = Blinking%(0) + 1
    IF Blinking%(0) = Blinking%(1) AND Blink%% THEN
        Blinking%(0) = 0
        Blink%% = False
    ELSEIF Blinking%(0) = Blinking%(2) AND NOT Blink%% THEN
        Blinking%(0) = 0
        Blink%% = True
    END IF

    'Ambient Sound
    AmbCount& = AmbCount& + 1
    IF AmbCount& = 16000 THEN
        IF DoSounds%% THEN _SNDPLAY Ambience&
        AmbCount& = 0
    END IF

    'Keyboard input (Esc to Quit or Spacebar to Start Reel Spin)
    k$ = INKEY$
    IF k$ <> "" THEN
        IF ASC(k$) = 27 THEN
            Casino%% = False
        ELSEIF ASC(k$) = 32 AND Spin%%(2, 2) AND Winnings% = 0 THEN
            DispMagdha%% = False
            'Start rolling
            FOR Reel%% = 0 TO 2
                Spin%%(Reel%%, 0) = True
                Spin%%(Reel%%, 1) = True
                Spin%%(Reel%%, 2) = False
                SpinCount%(Reel%%, 0) = 0
            NEXT Reel%%
            Cash& = Cash& - 1
            IF Cash& < 0 THEN Cash& = 0
            WinCount% = 0
            MoreDosh%% = False
            WinDisp%% = False
            WinBan%% = False
            RANDOMIZE (TIMER)
            'Set fruit type in positions which are not visible
            FOR Reel%% = 0 TO 2
                FOR Posn%% = 0 TO 22
                    IF ReelPos!(Reel%%, Posn%%) < 4 * _PI / 23 AND ReelPos!(Reel%%, Posn%%) > -4 * _PI / 23 THEN
                        'Do nothing
                    ELSE
                        IF RandomReels%% THEN
                            'Fruit Type Not Dependent Upon Neighbouring Positions
                            P! = 1000 * RND
                            IF P! >= ReelStats%(Reel%%, 4) THEN
                                Reels%(Reel%%, Posn%%) = 4
                            ELSEIF P! >= ReelStats%(Reel%%, 3) THEN
                                Reels%(Reel%%, Posn%%) = 3
                            ELSEIF P! >= ReelStats%(Reel%%, 2) THEN
                                Reels%(Reel%%, Posn%%) = 2
                            ELSEIF P! >= ReelStats%(Reel%%, 1) THEN
                                Reels%(Reel%%, Posn%%) = 1
                            ELSEIF P! >= ReelStats%(Reel%%, 0) THEN
                                Reels%(Reel%%, Posn%%) = 0
                            ELSE
                                Reels%(Reel%%, Posn%%) = 5
                            END IF
                        ELSE
                            'Fruit Type Never The Same as Neighbouting Positions
                            Same%% = True
                            WHILE Same%%
                                P! = 1000 * RND
                                IF P! >= ReelStats%(Reel%%, 4) THEN
                                    'Bar
                                    IF Posn%% = 0 THEN
                                        IF Reels%(Reel%%, 22) = 4 OR Reels%(Reel%%, 1) = 4 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 4
                                            Same%% = False
                                        END IF
                                    ELSEIF Posn%% = 22 THEN
                                        IF Reels%(Reel%%, 0) = 4 OR Reels%(Reel%%, 21) = 4 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 4
                                            Same%% = False
                                        END IF
                                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 4 OR Reels%(Reel%%, Posn%% + 1) = 4 THEN
                                        'Same as either side
                                    ELSE
                                        Reels%(Reel%%, Posn%%) = 4
                                        Same%% = False
                                    END IF
                                ELSEIF P! >= ReelStats%(Reel%%, 3) THEN
                                    'Bell
                                    IF Posn%% = 0 THEN
                                        IF Reels%(Reel%%, 22) = 3 OR Reels%(Reel%%, 1) = 3 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 3
                                            Same%% = False
                                        END IF
                                    ELSEIF Posn%% = 22 THEN
                                        IF Reels%(Reel%%, 0) = 3 OR Reels%(Reel%%, 21) = 3 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 3
                                            Same%% = False
                                        END IF
                                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 3 OR Reels%(Reel%%, Posn%% + 1) = 3 THEN
                                        'Same as either side
                                    ELSE
                                        Reels%(Reel%%, Posn%%) = 3
                                        Same%% = False
                                    END IF
                                ELSEIF P! >= ReelStats%(Reel%%, 2) THEN
                                    'Strawberry
                                    IF Posn%% = 0 THEN
                                        IF Reels%(Reel%%, 22) = 2 OR Reels%(Reel%%, 1) = 2 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 2
                                            Same%% = False
                                        END IF
                                    ELSEIF Posn%% = 22 THEN
                                        IF Reels%(Reel%%, 0) = 2 OR Reels%(Reel%%, 21) = 2 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 2
                                            Same%% = False
                                        END IF
                                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 2 OR Reels%(Reel%%, Posn%% + 1) = 2 THEN
                                        'Same as either side
                                    ELSE
                                        Reels%(Reel%%, Posn%%) = 2
                                        Same%% = False
                                    END IF
                                ELSEIF P! >= ReelStats%(Reel%%, 1) THEN
                                    'Lemon
                                    IF Posn%% = 0 THEN
                                        IF Reels%(Reel%%, 22) = 1 OR Reels%(Reel%%, 1) = 1 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 1
                                            Same%% = False
                                        END IF
                                    ELSEIF Posn%% = 22 THEN
                                        IF Reels%(Reel%%, 0) = 1 OR Reels%(Reel%%, 21) = 1 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 1
                                            Same%% = False
                                        END IF
                                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 1 OR Reels%(Reel%%, Posn%% + 1) = 1 THEN
                                        'Same as either side
                                    ELSE
                                        Reels%(Reel%%, Posn%%) = 1
                                        Same%% = False
                                    END IF
                                ELSEIF P! >= ReelStats%(Reel%%, 0) THEN
                                    'Cheries
                                    IF Posn%% = 0 THEN
                                        IF Reels%(Reel%%, 22) = 0 OR Reels%(Reel%%, 1) = 0 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 0
                                            Same%% = False
                                        END IF
                                    ELSEIF Posn%% = 22 THEN
                                        IF Reels%(Reel%%, 0) = 0 OR Reels%(Reel%%, 21) = 0 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 0
                                            Same%% = False
                                        END IF
                                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 0 OR Reels%(Reel%%, Posn%% + 1) = 0 THEN
                                        'Same as either side
                                    ELSE
                                        Reels%(Reel%%, Posn%%) = 0
                                        Same%% = False
                                    END IF
                                ELSE
                                    'Joker
                                    IF Posn%% = 0 THEN
                                        IF Reels%(Reel%%, 22) = 5 OR Reels%(Reel%%, 1) = 5 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 5
                                            Same%% = False
                                        END IF
                                    ELSEIF Posn%% = 22 THEN
                                        IF Reels%(Reel%%, 0) = 5 OR Reels%(Reel%%, 21) = 5 THEN
                                            'Same as either side
                                        ELSE
                                            Reels%(Reel%%, Posn%%) = 5
                                            Same%% = False
                                        END IF
                                    ELSEIF Reels%(Reel%%, Posn%% - 1) = 5 OR Reels%(Reel%%, Posn%% + 1) = 5 THEN
                                        'Same as either side
                                    ELSE
                                        Reels%(Reel%%, Posn%%) = 5
                                        Same%% = False
                                    END IF
                                END IF
                            WEND
                        END IF
                    END IF
                NEXT Posn%%
            NEXT Reel%%
            IF DoSounds%% THEN _SNDPLAY SlotMachine&
        END IF
    END IF
    k$ = ""

WEND

'Free Images
_FREEIMAGE Bandit&
_FREEIMAGE Back&
_FREEIMAGE DollarSign&
_FREEIMAGE Payout&
_FREEIMAGE Star&
FOR S%% = 0 TO 2
    _FREEIMAGE Banner&(S%%)
NEXT S%%
FOR S%% = 0 TO 5
    _FREEIMAGE Pict&(S%%)
NEXT S%%
FOR S%% = 0 TO 9
    _FREEIMAGE NumImg&(S%%)
NEXT S%%
'Free Sounds
_SNDCLOSE SlotMachine&
_SNDCLOSE KerChing&
_SNDCLOSE Ambience&

SYSTEM

'DATA
SevenSegment:
DATA 0,0,0,-1,0,0,0
DATA 0,0,-1,-1,-1,0,0
DATA 0,-1,-1,-1,-1,-1,0
DATA -1,-1,-1,0,-1,-1,-1
DATA 0,0,-1,0,0,-1,0
DATA -1,0,-1,-1,-1,0,-1
DATA -1,0,-1,-1,0,-1,-1
DATA 0,-1,-1,-1,0,-1,0
DATA -1,-1,0,-1,0,-1,-1
DATA -1,-1,0,-1,-1,-1,-1
DATA -1,0,-1,0,0,-1,0
DATA -1,-1,-1,-1,-1,-1,-1
DATA -1,-1,-1,-1,0,-1,0
Blinks:
DATA 150,35
Plums:
DATA 3,10,20,50,100,250
DATA 1,1,2,2,4,5
ReelData:
DATA 5,168,496,666,800
DATA 5,404,596,766,900
DATA 50,500,593,764,900
SpinData:
DATA 500,800,1100
ThetaData:
DATA 0.008,0.009,0.01

FUNCTION HardwareImage& (ImageName&)
    HardwareImage& = _COPYIMAGE(ImageName&, 33)
    _FREEIMAGE ImageName&
END FUNCTION
Reply
#2
How much money do I lose when I get THREE STEVE'S IN A ROW!? Big Grin

Neat. Reminds me of TheBOB's slot machine from the past QBasic Era.

+2

Pete
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Pi-in-the-Sky Graphics Demonstration Program - PE Edition Magdha 0 154 01-17-2026, 11:03 AM
Last Post: Magdha

Forum Jump:


Users browsing this thread: