Pig the dice game/Player: Difference between revisions

m
→‎{{header|Phix}}: syntax coloured
(Added Wren)
m (→‎{{header|Phix}}: syntax coloured)
Line 2,741:
 
=={{header|Phix}}==
<!--<lang Phix>constant maxScore = 100(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
 
<span style="color: #008080;">constant</span> <span style="color: #000000;">maxScore</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">100</span>
function one_game(sequence strategies)
integer numPlayers = length(strategies)
<span style="color: #008080;">function</span> <span style="color: #000000;">one_game</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">strategies</span><span style="color: #0000FF;">)</span>
sequence scores = repeat(0,numPlayers)
<span style="color: #004080;">integer</span> <span style="color: #000000;">numPlayers</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">strategies</span><span style="color: #0000FF;">),</span>
integer points = 0, -- points accumulated in current turn, 0=swap turn
<span style="color: #000000;">points</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- points accumulated in current turn, 0=swap turn</span>
rolls = 0, -- number of rolls
<span style="color: #000000;">rolls</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- number of rolls</span>
player = rand(numPlayers) -- start with a random player
<span style="color: #000000;">player</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">rand</span><span style="color: #0000FF;">(</span><span style="color: #000000;">numPlayers</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- start with a random player</span>
while true do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">scores</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">numPlayers</span><span style="color: #0000FF;">)</span>
integer roll = rand(6)
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
if roll=1 then
<span style="color: #004080;">integer</span> <span style="color: #000000;">roll</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">rand</span><span style="color: #0000FF;">(</span><span style="color: #000000;">6</span><span style="color: #0000FF;">)</span>
points = 0 -- swap turn
<span style="color: #008080;">if</span> <span style="color: #000000;">roll</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
else
<span style="color: #000000;">points</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- swap turn</span>
points += roll
<span style="color: #008080;">else</span>
if scores[player]+points>=maxScore then exit end if
<span style="color: #000000;">points</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">roll</span>
rolls += 1
<span style="color: #008080;">if</span> <span style="color: #000000;">scores</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">points</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">maxScore</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if not call_func(strategies[player],{scores,player,points,rolls}) then
<span style="color: #000000;">rolls</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
scores[player] += points
<span style="color: #004080;">integer</span> <span style="color: #000000;">play</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">strategies</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]</span>
points = 0 -- swap turn
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">play</span><span style="color: #0000FF;">(</span><span style="color: #000000;">scores</span><span style="color: #0000FF;">,</span><span style="color: #000000;">player</span><span style="color: #0000FF;">,</span><span style="color: #000000;">points</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rolls</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">scores</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">points</span>
end if
<span style="color: #000000;">points</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #000080;font-style:italic;">-- swap turn</span>
if points=0 then
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
player = mod(player,numPlayers) + 1
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
rolls = 0
<span style="color: #008080;">if</span> <span style="color: #000000;">points</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">player</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">player</span><span style="color: #0000FF;">,</span><span style="color: #000000;">numPlayers</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">1</span>
end while
<span style="color: #000000;">rolls</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
return player
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
 
<span style="color: #008080;">return</span> <span style="color: #000000;">player</span>
-- each strategy returns true to roll, false to hold.
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
function strategy1(sequence /*scores*/, integer /*player*/, points, /*rolls*/)
<span style="color: #000080;font-style:italic;">-- each strategy returns true to roll, false to hold.</span>
return points<20 -- roll until 20 or more
end function
<span style="color: #008080;">function</span> <span style="color: #000000;">strategy1</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000080;font-style:italic;">/*scores*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000080;font-style:italic;">/*player*/</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">points</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">/*rolls*/</span><span style="color: #0000FF;">)</span>
constant r_s1 = routine_id("strategy1")
<span style="color: #008080;">return</span> <span style="color: #000000;">points</span><span style="color: #0000FF;"><</span><span style="color: #000000;">20</span> <span style="color: #000080;font-style:italic;">-- roll until 20 or more</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function strategy2(sequence /*scores*/, integer /*player*/, /*points*/, rolls)
return rolls<4 -- roll 4 times
<span style="color: #008080;">function</span> <span style="color: #000000;">strategy2</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000080;font-style:italic;">/*scores*/</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000080;font-style:italic;">/*player*/</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">/*points*/</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">rolls</span><span style="color: #0000FF;">)</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">rolls</span><span style="color: #0000FF;"><</span><span style="color: #000000;">4</span> <span style="color: #000080;font-style:italic;">-- roll 4 times</span>
constant r_s2 = routine_id("strategy2")
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
function strategy3(sequence scores, integer player, points, /*rolls*/)
<span style="color: #008080;">function</span> <span style="color: #000000;">strategy3</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">scores</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">player</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">points</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">/*rolls*/</span><span style="color: #0000FF;">)</span>
-- roll until 20 or score>80
<span style="color: #000080;font-style:italic;">-- roll until 20 or score&gt;80</span>
return points<20 or scores[player]+points>80
<span style="color: #008080;">return</span> <span style="color: #000000;">points</span><span style="color: #0000FF;"><</span><span style="color: #000000;">20</span> <span style="color: #008080;">or</span> <span style="color: #000000;">scores</span><span style="color: #0000FF;">[</span><span style="color: #000000;">player</span><span style="color: #0000FF;">]+</span><span style="color: #000000;">points</span><span style="color: #0000FF;">></span><span style="color: #000000;">80</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
constant r_s3 = routine_id("strategy3")
 
<span style="color: #008080;">function</span> <span style="color: #000000;">strategy4</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">scores</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">player</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">points</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">/*rolls*/</span><span style="color: #0000FF;">)</span>
function strategy4(sequence scores, integer player, points, /*rolls*/)
<span style="color: #000080;font-style:italic;">-- roll until 20 or any player has >&gt;71</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">scores</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
for i=1 to length(scores) do
<span style="color: #008080;">if</span> <span style="color: #000000;">scores</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]></span><span style="color: #000000;">71</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">true</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if scores[i]>71 then return true end if
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">return</span> <span style="color: #000000;">points</span><span style="color: #0000FF;"><</span><span style="color: #000000;">20</span>
return points<20
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
end function
constant r_s4 = routine_id("strategy4")
<span style="color: #008080;">constant</span> <span style="color: #000000;">strategies</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">strategy1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">strategy2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">strategy3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">strategy4</span><span style="color: #0000FF;">},</span>
 
<span style="color: #000000;">numStrategies</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">strategies</span><span style="color: #0000FF;">),</span>
constant strategies = {r_s1,r_s2,r_s3,r_s4}
<span style="color: #000000;">numOpponents</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">numStrategies</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
 
-- play each strategy 1000 times against all combinations of other strategies
<span style="color: #000080;font-style:italic;">-- play each strategy 1000 times against all combinations of other strategies</span>
for s=1 to length(strategies) do
<span style="color: #008080;">for</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">numStrategies</span> <span style="color: #008080;">do</span>
sequence opponents = strategies
<span style="color: #004080;">integer</span> <span style="color: #000000;">strategy</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">strategies</span><span style="color: #0000FF;">[</span><span style="color: #000000;">s</span><span style="color: #0000FF;">],</span>
opponents[s..s] = {}
<span style="color: #000000;">mask</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">numOpponents</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span>
integer mask = power(2,length(opponents))-1
<span style="color: #000000;">wins</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
integer wins = 0
<span style="color: #004080;">sequence</span> <span style="color: #000000;">opponents</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">strategies</span><span style="color: #0000FF;">)</span>
for m=1 to mask do -- (all possible bit settings, bar 0, eg/ie 1..7)
<span style="color: #000000;">opponents</span><span style="color: #0000FF;">[</span><span style="color: #000000;">s</span><span style="color: #0000FF;">..</span><span style="color: #000000;">s</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> <span style="color: #000080;font-style:italic;">-- (ie all others only)</span>
sequence game = {strategies[s]}
<span style="color: #008080;">for</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">mask</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- (all possible bit settings, bar 0, eg/ie 1..7)</span>
for g=1 to length(opponents) do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">game</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">strategy</span><span style="color: #0000FF;">}</span>
if and_bits(m,power(2,g-1)) then
<span style="color: #008080;">for</span> <span style="color: #000000;">g</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">numOpponents</span> <span style="color: #008080;">do</span>
game &= opponents[g]
<span style="color: #008080;">if</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">g</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">))</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">game</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">opponents</span><span style="color: #0000FF;">[</span><span style="color: #000000;">g</span><span style="color: #0000FF;">]</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
for n=1 to 1000 do
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
wins += one_game(game)=1
<span style="color: #008080;">for</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1000</span> <span style="color: #008080;">do</span>
end for
<span style="color: #000000;">wins</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">one_game</span><span style="color: #0000FF;">(</span><span style="color: #000000;">game</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">1</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
printf(1,"strategy %d: %d wins\n",{s,wins})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for</lang>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"strategy %d: %d wins\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">wins</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</lang>-->
{{out}}
<pre>
7,803

edits