Rock-paper-scissors: Difference between revisions

no edit summary
(added qbasic)
No edit summary
Line 768:
You chose...wisely. You win!
...</pre>
 
=={{header|Liberty BASIC}}==
<lang lb>
dim rps( 2), g$( 3)
 
g$( 0) ="rock": g$( 1) ="paper": g$( 2) ="scissors"
global total
 
total =0: draw =0: pwin =0: cwin =0
 
rps( 0) =1: rps( 1) =1: rps( 2) =1 ' at first computer will play all three with equal probability
 
c =int( 3 *rnd( 1)) ' first time, computer response is random
 
' In the following code we set three integer %ages for the <human>'s biassed throws.
' set up the <human> player's key frequencies as %ages.
' Done like this it's easy to mimic the <human> input of q$
' It allows only integer %age frequency- not an important thing.
rockP =45 ' <<<<<<<<< Set here the <human>'s %age of 'rock' choices.
for i =1 to rockP: qF$ =qF$ +"R": next i
 
paprP =24 ' <<<<<<<<< Set here the %age of 'paper' choices.
for i =1 to paprP: qF$ =qF$ +"P": next i
 
scisP =100 -rockP -paprP ' <<<<<<<<< %age 'scissors' calculated to make 100%
for i =1 to scisP: qF$ =qF$ +"S": next i
'print qF$
 
do
'do: input q$:loop until instr( "RPSrpsQq", q$) ' for actual human input... possibly biassed. <<<<<<<<<<<<< REM one or the other line...
q$ =mid$( qF$, int( 100 *rnd( 1)), 1) ' simulated <human> input with controlled bias. <<<<<<<<<<<<<
 
if total >10000 then q$ ="Q"
 
g =int( ( instr( "RrPpSsQq", q$) -1) / 2)
if g >2 then [endGame]
 
total =total +1
rps( g) =rps( g) +1 ' accumulate plays the <human> has chosen. ( & hence their (biassed?) frequencies.)
'print " You chose "; g$( g); " and I chose "; g$( c); ". "
 
select case g -c
case 0
draw =draw +1 ':print "It's a draw"
case 1, -2
pwin =pwin +1 ':print "You win!"
case -1, 2
cwin =cwin +1 ':print "I win!"
end select
 
r =int( total *rnd( 1)) ' Now select computer's choice for next confrontation.
select case ' Using the accumulating data about <human>'s frequencies so far.
case r <=rps( 0)
c =1
case r <=( rps( 0) +rps( 1))
c =2
case else
c =0
end select
 
scan
loop until 0
 
[endGame]
print
print " You won "; pwin; ", and I won "; cwin; ". There were "; draw; " draws."
if cwin >pwin then print " I AM THE CHAMPION!!" else print " You won this time."
print
print " At first I assumed you'd throw each equally often."
print " This means I'd win 1 time in 3; draw 1 in 3; lose 1 in 3."
print " However if I detect a bias in your throws,...."
print " ....this allows me to anticipate your most likely throw & on average beat it."
print
print " In fact, keyboard layout & human frailty mean even if you TRY to be even & random..."
print " ... you may be typing replies with large bias. In 100 tries I gave 48 'P's, 29 'R' & 23 'S'!"
print
print " This time I played.."
print " Rock "; using( "##.##", rps( 2)* 100 /total); "% Paper "; using( "##.##", rps( 0) *100 /total); "% Scissors "; using( "##.##", rps( 1) *100 /total); "%."
print
print " ( PS. I have since learned your actual bias had been.."
print " Rock "; using( "##.##", rockP); "% Paper "; using( "##.##", paprP ); "% Scissors "; using( "##.##", ( 100 -rockP -paprP)); "%.)"
print
print " The advantage I can gain gets bigger the further the 'human' entries are biassed."
print " The results statistically smooth out better with large runs."
print " Try 10,000,000, & have a cuppa while you wait."
print
print " Can you see what will happen if, say, the 'human' is set to give 'Rock' EVERY time?"
print " Try different %ages by altering the marked code lines."
print
print " Thanks for playing!"
end
</lang>
You won 3204, and I won 3669. There were 3128 draws.
I AM THE CHAMPION!!
At first I assumed you'd throw each equally often.
This means I'd win 1 time in 3; draw 1 in 3; lose 1 in 3.
However if I detect a bias in your throws,....
....this allows me to anticipate your most likely throw & on average beat it.
In fact, keyboard layout & human frailty mean even if you TRY to be even & random...
... you may be typing replies with large bias. In 100 tries I gave 48 'P's, 29 'R' & 23 'S'!
This time I played..
Rock 30.17% Paper 45.93% Scissors 23.94%.
( PS. I have since learned your actual bias had been..
Rock 45.00% Paper 24.00% Scissors 31.00%.)
The advantage I can gain gets bigger the further the 'human' entries are biassed.
The results statistically smooth out better with large runs.
Try 10,000,000, & have a cuppa while you wait.
Can you see what will happen if, say, the 'human' is set to give 'Rock' EVERY time?
Try different %ages by altering the marked code lines.
 
 
 
=={{header|OCaml}}==
Anonymous user