RetroBASIC
Basicprogramming(.org) => Code and examples => Topic started by: B+ on October 17, 2018, 03:20:16 PM
-
Last night I made a first draft for Rosetta "Pig" Game:
QB64:RANDOMIZE TIMER
WHILE player < 100 AND AI < 100 'pig from Rosetta B+ started 2018-10-16
turn = (turn + 1) MOD 2
di = INT(RND * 6) + 1
PRINT: PRINT "Player:"; player; " AI:"; AI
accum = 0 '<<<<<<<<<<<<<<<<< EDIT one line instead of two
IF turn THEN 'player
DO
IF di = 1 THEN
INPUT "Player you rolled a 1, your turn is over, press enter..."; wate$
EXIT DO
ELSE
accum = accum + di
PRINT "Player you rolled a "; di; "your accumulated total is now "; accum
INPUT "Do you want to (r)oll again or (h)old, Enter r or h > "; choice$
IF choice$ = "r" THEN
di = INT(RND * 6) + 1
ELSE
player = player + accum
EXIT DO
END IF
END IF
LOOP
ELSE
FOR i = 1 TO 5
IF di = 1 THEN
INPUT "AI rolled a 1, it's turn is over, press enter..."; wate$
EXIT FOR
ELSE
accum = accum + di
PRINT "AI rolled a "; di; "it's total accumulated now is"; accum
IF i < 4 AND accum + AI < 100 THEN
PRINT "AI is rolling again."
INPUT "press enter..."; wate$
di = INT(RND * 6) + 1
ELSE
PRINT "AI is holding with"; accum; "added to it's score."
INPUT "press enter..."; wate$
AI = AI + accum
EXIT FOR
END IF
END IF
NEXT
END IF
WEND
PRINT: PRINT "Player: "; player; " AI: "; AI
IF player > AI THEN PRINT "Player wins!" ELSE PRINT "AI wins!"
END
I think this might be pared down to around 20 lines?
Ruby can do it in 1, right Tomaaz? ;D
After playing for awhile, begin to understand it's name. :)
-
Ruby can do it in 1, right Tomaaz? ;D
Wrong. ;D
-
38 lines aboslutely no :'s used
_TITLE "Pig 1 (Rosetta task)" ' attempt to pare down (no :'s) first version B+ started 2018-10-17
RANDOMIZE TIMER
WHILE player < 100 AND AI < 100 'pig from Rosetta B+ started 2018-10-16
turn = (turn + 1) MOD 2
IF turn THEN Who$ = "Player" ELSE Who$ = "AI"
PRINT "Player =" + STR$(player) + " AI =" + STR$(AI) + CHR$(10)
accum = 0
FOR i = 1 TO 100
di = INT(RND * 6) + 1
IF di = 1 THEN
PRINT Who$ + " rolled a 1, the turn is over, press enter...";
INPUT "", wate$
EXIT FOR
ELSE
accum = accum + di
PRINT Who$ + " rolled a" + RTRIM$(STR$(di)) + ", the accumulated total is" + STR$(accum)
IF turn THEN
INPUT "Do you want to (r)oll again or (h)old, Enter r or h"; choice$
IF choice$ <> "r" THEN player = player + accum
IF choice$ <> "r" THEN EXIT FOR
ELSE
IF i < 3 AND accum + AI < 100 THEN
PRINT "AI is rolling again,";
INPUT " press enter...", wate$
ELSE
PRINT "AI is holding with"; accum; "added to it's score,";
INPUT " press enter...", wate$
AI = AI + accum
EXIT FOR
END IF
END IF
END IF
PRINT
NEXT
PRINT
WEND
PRINT "Player =" + STR$(player) + " AI =" + STR$(AI)
IF player > AI THEN PRINT "Player wins!" ELSE PRINT "AI wins!"
I think next, attack the 2 prints at the end of blocks OR use Python and eliminate all the end code block lines! ;D
-
That was easy:
_TITLE "Pig 2 (Rosetta task)" ' attempt to pare down (no :'s) first version B+ started 2018-10-17
RANDOMIZE TIMER
WHILE player < 100 AND AI < 100 'pig from Rosetta B+ started 2018-10-16
turn = (turn + 1) MOD 2
IF turn THEN Who$ = "Player" ELSE Who$ = "AI"
accum = 0
FOR i = 1 TO 100
di = INT(RND * 6) + 1
IF di = 1 THEN
PRINT CHR$(10) + Who$ + " rolled a 1, the turn is over, press enter...";
INPUT "", wate$
EXIT FOR
ELSE
accum = accum + di
PRINT CHR$(10) + Who$ + " rolled a" + RTRIM$(STR$(di)) + ", the accumulated total is" + STR$(accum)
IF turn THEN
INPUT "Do you want to (r)oll again or (h)old, Enter r or h"; choice$
IF choice$ <> "r" THEN player = player + accum
IF choice$ <> "r" THEN EXIT FOR
ELSE
IF i < 3 AND accum + AI < 100 THEN
PRINT "AI is rolling again,";
INPUT " press enter... ", wate$
ELSE
AI = AI + accum
PRINT "AI is holding with"; accum; "added to it's score,";
INPUT " press enter...", wate$
EXIT FOR
END IF
END IF
END IF
NEXT
PRINT CHR$(10) + "Player =" + STR$(player) + " AI =" + STR$(AI)
WEND
IF player > AI THEN PRINT "Player wins!" ELSE PRINT "AI wins!"
36 lines only 16 more to go. ;-))
EDIT: moved score update line so don't need again at end of game, 35 lines!
-
32 lines with help from Steve at QB64 who pointed out something I overlooked about 100 times!
_TITLE "Pig 3 (Rosetta task)" ' attempt to pare down (no :'s) first version B+ started 2018-10-17
RANDOMIZE TIMER
WHILE player < 100 AND AI < 100 'pig from Rosetta B+ started 2018-10-16
IF Who$ <> "Player" THEN Who$ = "Player" ELSE Who$ = "AI"
accum = 0
FOR i = 1 TO 100
di = INT(RND * 6) + 1
IF di = 1 THEN
PRINT CHR$(10) + Who$ + " rolled a 1, the turn is over, press enter...";
INPUT "", wate$
EXIT FOR
ELSE
accum = accum + di
PRINT CHR$(10) + Who$ + " rolled a" + RTRIM$(STR$(di)) + ", the accumulated total is" + STR$(accum)
IF Who$ = "Player" THEN
INPUT "Do you want to (r)oll again or (h)old, Enter r or h"; choice$
IF choice$ <> "r" THEN player = player + accum
IF choice$ <> "r" THEN EXIT FOR
ELSE
IF i < 3 AND accum + AI < 100 THEN
INPUT "AI is rolling again, press enter... ", wate$
ELSE
AI = AI + accum
INPUT "AI is holding so accumulated amount added it's score, press enter", wate$
EXIT FOR
END IF
END IF
END IF
NEXT
PRINT CHR$(10) + "Player =" + STR$(player) + " AI =" + STR$(AI)
WEND
IF player > AI THEN PRINT "Player wins!" ELSE PRINT "AI wins!"
-
Ha! Steve found some more tricks. Check this out!
RANDOMIZE TIMER 'pig from Rosetta v4 B+ started 2018-10-16, Steve McNeill finished 2018-10-18
WHILE player < 100 AND AI < 100
IF Who$ <> "Player" THEN Who$ = "Player" ELSE Who$ = "AI"
accum = 0
FOR i = 1 TO 100
di = INT(RND * 6) + 1
IF di = 1 THEN accum = 0 ELSE accum = accum + di
IF di = 1 THEN PRINT CHR$(10) + Who$ + " rolled a" + RTRIM$(STR$(di)) + CHR$(10) ELSE PRINT CHR$(10) + Who$ + " rolled a" + RTRIM$(STR$(di)) + ", the accumulated total is" + STR$(accum) + CHR$(10);
IF di = 1 THEN INPUT "The turn is over, press enter...", wate$
IF di = 1 THEN EXIT FOR
IF Who$ = "Player" THEN INPUT "Do you want to (r)oll again or (h)old, Enter r or h"; choice$
IF Who$ = "Player" AND choice$ <> "r" THEN player = player + accum
IF Who$ = "Player" AND choice$ <> "r" THEN EXIT FOR
IF Who$ <> "Player" AND (i < 3 AND accum + AI < 100) THEN INPUT "AI is rolling again, press enter... ", wate$
IF Who$ <> "Player" AND (i >= 3 OR accum + AI >= 100) THEN AI = AI + accum
IF Who$ <> "Player" AND (i >= 3 OR accum + AI >= 100) THEN INPUT "AI is holding so accumulated amount added it's score, press enter", wate$
IF Who$ <> "Player" AND (i >= 3 OR accum + AI >= 100) THEN EXIT FOR
NEXT
PRINT CHR$(10) + "Player =" + STR$(player) + " AI =" + STR$(AI)
WEND
IF player > AI THEN PRINT "Player wins!" ELSE PRINT "AI wins!"
21 lines! No statement is double parked on a line.
Next up, I am going to try new AI strategies, this one is a little too easy to beat.
-
Whoa! Wait a minute... Steve not done:
_TITLE "Pig 5 (Rosetta task)" ' B+ started 2018-10-17 Steve McNeill finished 2018-10-19
WHILE player < 100 AND AI < 100
IF Who$ <> " Player" THEN Who$ = " Player" ELSE Who$ = " AI"
FOR i = 1 TO 100
di = INT(RND * 6) + 1
IF i = 1 AND di = 1 THEN accum = 0 ELSE IF i = 1 THEN accum = di ELSE IF di = 1 THEN accum = 0 ELSE accum = accum + di
IF di = 1 THEN PRINT CHR$(10) + Who$ + " rolled a" + RTRIM$(STR$(di)) + CHR$(10) ELSE PRINT CHR$(10) + Who$ + " rolled a" + RTRIM$(STR$(di)) + ", the accumulated total is" + STR$(accum) + CHR$(10);
IF di = 1 THEN INPUT " The turn is over, press enter...", wate$ ELSE RANDOMIZE TIMER
IF di > 1 AND Who$ = " Player" THEN INPUT " Do you want to (r)oll again or (h)old, Enter r or h"; choice$ ELSE IF di > 1 AND (i < 3 AND accum + AI < 100) THEN INPUT " AI is rolling again, press enter... ", wate$
IF di > 1 AND Who$ = " Player" AND choice$ <> "r" THEN player = player + accum
IF di > 1 AND Who$ <> " Player" AND (i >= 3 OR accum + AI >= 100) THEN AI = AI + accum
IF di > 1 AND Who$ <> " Player" AND (i >= 3 OR accum + AI >= 100) THEN INPUT " AI is holding so accumulated amount is scored, press enter", wate$
IF (Who$ <> " Player" AND (i >= 3 OR accum + AI >= 100)) OR (Who$ = " Player" AND choice$ <> "r") OR di = 1 THEN EXIT FOR
NEXT
PRINT CHR$(10) + " Player =" + STR$(player) + " AI =" + STR$(AI)
WEND
PRINT Who$; " wins!"
17 lines! not one has a double-parked statement. Dang, cleared the 20 line hurdle with room to spare!
-
BPlus variation on Pig, called Boink ( B+ oink ;-)) )
This pig is a prize look how fat it is!
_TITLE "Boink" ' for QB64 B+ started a version of Pig when/where the number of di is declared and rolled
' Boink rules:
' Start round by flipping coin who goes first
' Each player chooses number of dice to roll to start their round
' Dice rolled
' If 1 di is 1 then no points that turn,
' If 2 di are 1 then no points and the score is reset to 0,
' If 3 di are 1 then gameover that player lost,
' If 4 di are 1 then player wins game automatically,
' Otherwise the player gets the total of di added to their score.
RANDOMIZE TIMER
CONST wholeHog = 7
Sooie = 1
WHILE Sooie
IF RND < .5 THEN
GOSUB FarmerRound
IF Sooie THEN GOSUB HALRound
ELSE
GOSUB HALRound
IF Sooie THEN GOSUB FarmerRound
END IF
WEND
END
FarmerRound:
COLOR 11
Who$ = "Farmer"
COLOR 14
cp "Farmer, Enter how many dice to roll."
LOCATE , 38: INPUT ; hogHerd
COLOR 11
GOSUB RollEmRollEM
RETURN
HALRound:
COLOR 9
Who$ = "HAL"
hogHerd = INT(wholeHog * (100 - HAL) / 100 + .5)
IF hogHerd = 0 THEN hogHerd = 1
GOSUB RollEmRollEM
RETURN
RollEmRollEM:
pigsEye = 0: bacon = 0
s$ = Who$ + "'s, dice roll is:"
FOR pigglet = 1 TO hogHerd
Babe = INT(RND * 6) + 1
IF Babe = 1 THEN pigsEye = pigsEye + 1
bacon = bacon + Babe
s$ = s$ + " " + STR$(Babe)
NEXT
cp s$
SELECT CASE pigsEye
CASE 0
IF Who$ = "Farmer" THEN Farmer = Farmer + bacon ELSE HAL = HAL + bacon
cp Who$ + "," + STR$(bacon) + " has been added to your score."
IF Farmer >= 100 OR HAL >= 100 THEN Sooie = 0: cp Who$ + " wins!"
CASE 1
cp Who$ + " rolled a 1, so your score remains the same."
CASE 2
IF Who$ = "Farmer" THEN Farmer = 0 ELSE HAL = 0
cp Who$ + " rolled two 1's, so your score is reset to 0."
CASE 3
cp Who$ + ", sorry three 1's means you lost the game."
Sooie = 0
CASE ELSE
cp Who$ + " more than three 1's makes you the winner!"
Sooie = 0
END SELECT
cp "Press any..."
IF Sooie THEN
k$ = INKEY$
WHILE LEN(k$) = 0: k$ = INKEY$: _LIMIT 100: WEND
COLOR _RGB(255, 150, 170)
PRINT
cp "Boink Score Board: Farmer =" + STR$(Farmer) + " HAL =" + STR$(HAL)
PRINT
END IF
RETURN
SUB cp (s$)
LOCATE , (80 - LEN(s$)) / 2: PRINT s$
END SUB
-
Graphic Boink, my own version of Pig where you throw all the dice at once:
A di showing a 1 is a Pig's Eye:
1 Pig's Eye and get no pointsd for that turn
2 Pig's Eyes and you not only get no points but you loose all you have accumulated so far in game
3 Pig's Eyes and you loose the game.
4 or more Pig's Eyes and you win the game!
Otherwise the di roll is added to your score playing to 100.
Here is a snap: