i've coded a game of Russian roulette design for two players
here is the code:
Code: Select all
#INCLUDE "fbsound_dynamic.bi"
#INCLUDE "fbgfx.bi"
ENUM colors
fbRed = RGBA(255, 0,0,255)
fbWhite = RGBA(255,255,255,255)
END ENUM
TYPE player
PRIVATE:
AS STRING _player_name
AS INTEGER _score
PUBLIC:
AS boolean isTurn
DECLARE CONSTRUCTOR()
DECLARE DESTRUCTOR()
DECLARE PROPERTY player_name AS STRING
DECLARE PROPERTY player_name (BYVAL player_name1 AS STRING)
DECLARE PROPERTY score AS INTEGER
DECLARE PROPERTY score (BYVAL score1 AS INTEGER)
END TYPE
CONSTRUCTOR player
_score = 5000
END CONSTRUCTOR
DESTRUCTOR player
END DESTRUCTOR
PROPERTY player.player_name AS STRING
RETURN this._player_name
END PROPERTY
PROPERTY player.player_name(BYVAL player_name1 AS STRING)
this._player_name = player_name1
END PROPERTY
PROPERTY player.score AS INTEGER
RETURN this._score
END PROPERTY
PROPERTY player.score(BYVAL score1 AS INTEGER)
this._score = score1
END PROPERTY
DIM AS SHORT scr_w = 800, scr_h = 600
DIM num_players AS INTEGER
DIM AS INTEGER gun(1 TO 6)
RANDOMIZE TIMER
Function rnd_range (first As Double, last As Double) As Double
Function = Rnd * (last - first) + first
End FUNCTION
SUB SleepEx()
sleep
While Inkey <> "":Wend
end SUB
SUB cprint(row AS INTEGER, s AS STRING)
LOCATE row, (LOWORD(WIDTH) - LEN(s)) SHR 1 : PRINT s
END SUB
FUNCTION _
getKeys(_
BYREF keysToCatch AS CONST STRING) _
AS STRING
DIM AS STRING _
k
DO
k = > INKEY()
SLEEP(1 , 1)
LOOP UNTIL (INSTR(keysToCatch , k))
'CLEAR keyboard buffer
DO WHILE (LEN(INKEY()) > 0)
SLEEP(1 , 1)
LOOP
RETURN(k)
END FUNCTION
SUB SOUND(f AS STRING , t AS INTEGER)
DIM AS Integer hWave
fbs_Load_WAVFile(f , @hWave)
fbs_Play_Wave(hWave , t)
SLEEPEX()
fbs_Destroy_Wave(@hWave)
END SUB
SUB roulette(gun() AS INTEGER, p1 AS player, p2 AS player)
CLS
DIM AS INTEGER bank = 2500
p1.isTurn = TRUE
DIM AS boolean isShot = FALSE
DIM shot AS INTEGER
DIM k AS STRING
DIM bullet AS INTEGER = 1
CPRINT 2, "press 1 to load revolver"
k = GETKEYS("1")
IF k = "1" THEN
gun(INT(RND*(rnd_range(1, 7)))) = bullet
SOUND("gun_ready.wav",1)
CPRINT 15, "gun is loaded with one bullet"
sleep
ENDIF
DO
CLS
CPRINT 2,"Russian Roulette"
CPRINT 3, "------------------"
IF p1.isTurn = TRUE THEN
CPRINT 4, "it's : " & p1.player_name & " TURN"
p2.isTurn = FALSE
ELSE
CPRINT 4, "it's :" & p2.player_name & " TURN"
p2.isTurn = TRUE
ENDIF
CPRINT 6, "press key 'r' to roll revolver"
CPRINT 8, "press space bar to pull the trigger"
CPRINT 10, "press ESC to quit game"
CPRINT 12, "press key 'd' for vodka"
CPRINT 14, "player 1 " & p1.player_name & " " & "player 2 " & p2.player_name
CPRINT 15, "Russian ruble: " & p1.score & " " & "Russian ruble: " & p2.score
CPRINT 16, "Roulette Bank: " & bank & " Russian ruble"
k = GETKEYS("rd"+ CHR(32) + CHR(27))
IF k = "r" THEN
isShot = TRUE
SOUND("gun_roll.wav",1)
shot = gun(INT(rnd_range(1, 7)))
ELSEIF k = CHR(32) THEN
IF shot = 0 THEN
IF isShot = FALSE THEN
CPRINT 17, "empty shot - roll over revolver"
SLEEPEX()
ELSEIF isShot = TRUE THEN
'FOR i AS INTEGER = 1 TO 6
' PRINT gun(i)
'NEXT
SOUND("empty_gun.wav",1)
isShot = FALSE
IF p1.isTurn = TRUE THEN
p1.score = p1.score + 1000
p2.score = p2.score - 1000
p1.score = p1.score + bank
p1.isTurn = FALSE
ELSE
p2.score = p2.score + 1000
p1.score = p1.score - 1000
p2.score = p2.score + bank
p1.isTurn = TRUE
ENDIF
ENDIF
ELSEIF shot = 1 THEN
CLS
COLOR colors.fbRed
IF p1.isTurn = TRUE THEN
CPRINT 17, p1.player_name & " YOU LOST!"
ELSE
CPRINT 17, p2.player_name & " YOU LOST!"
ENDIF
SOUND("gun_shot.wav",1)
IF p1.isTurn = TRUE THEN
p2.score = p2.score + p1.score
p1.score = 0
ELSE
p1.score = p1.score + p2.score
p2.score = 0
ENDIF
EXIT SUB
ENDIF
ELSEIF k = CHR(27) THEN
CLS
CPRINT 17, "chicken $%#@!"
SOUND("laugh.wav",1)
EXIT SUB
ELSEIF k = "d" THEN
CLS
CPRINT 17, "another round of vodka!"
SOUND("vodka.wav", 1)
ENDIF
bank += 750
loop
END SUB
SUB main(gun() AS INTEGER, p1 AS player, p2 AS player)
DO
CLS
COLOR colors.fbWhite
DIM k AS STRING
CPRINT 2,"Russian Roulette"
CPRINT 3, "------------------"
CPRINT 5, "press 'd' to drink some vodka"
CPRINT 7, "press esc to quit game"
CPRINT 9, "press 'r' to play Russian Roulette"
CPRINT 11, "player 1 " & p1.player_name & " " & "player 2 " & p2.player_name
CPRINT 12, "Russian ruble: " & p1.score & " " & "Russian ruble: " & p2.score
k = GETKEYS("rd" + CHR(27))
IF k = CHR(27) THEN
CLS
CPRINT 15, "you quit the game"
IF p1.score > p2.score THEN
CPRINT 16, p1.player_name & " YOU WIN!"
ELSE
CPRINT 16, p2.player_name & " YOU WIN!"
ENDIF
SOUND("laugh.wav", 1)
END
ELSEIF k = "d" THEN
CLS
CPRINT 15, "another round of vodka!"
SOUND("vodka.wav", 1)
ELSEIF k = "r" THEN
ROULETTE(gun(), p1, p2)
ENDIF
LOOP
END SUB
SUB opening(f AS STRING, t AS INTEGER, p1 AS player, p2 AS player)
DIM k AS STRING
DIM AS Integer hWave
CPRINT 15, "Russian roulette"
SLEEPEX()
COLOR colors.fbRed
CLS
CPRINT 15, "Russian roulette"
fbs_Load_WAVFile(f , @hWave)
fbs_Play_Wave(hWave , t)
SLEEPEX()
COLOR colors.fbWhite
fbs_Destroy_Wave(@hWave)
CLS
CPRINT 4, "this game is for two players"
INPUT "player 1 enter your name: ", k
p1.player_name = k
INPUT "player 2 enter your name: ", k
p2.player_name = k
END SUB
IF fbs_Init()=false then
print "error: FBS_INIT() " & FBS_Get_PlugError()
beep : sleep : end 1
end IF
SCREENRES scr_w, scr_h, 32
WIDTH scr_w \ 8, scr_h \ 16
DIM AS player p1, p2
OPENING("gun_shot.wav", 1, p1, p2)
MAIN(gun(), p1, p2)
SLEEP
the game works as expected except for one time it crashed after a long play... please try it - Code criticism is welcome as well as code review or any issues you may find...
ron77