wheelgame3.frink

View or download wheelgame3.frink in plain text format


// Simulator for the big-wheel-spinnin' game on The Price Is Right
// This produces the probabilties (and best plays) for each player.

players = eval[input["Enter number of players: "]]
beat = eval[input["Enter score to beat: [0] ", 0]]

pe1 = pe[beat, 1, players]

println["Projected earnings for player 1 are $pe1"]

// Find projected earnings for player, given a score to beat, the player
// number, and the number of players.
pe[beat, player, players] :=
{
   if player == players
      return spinToBeat[beat]
   
   sum = 0
   for s = 5 to 100 step 5
   {
      p = makeProjections[s, beat, player, players]
      sum = sum + p
   }
   return sum / 20
}


// Make projections for a player, given their total is already sum,
// Value to beat is beat, their player number is player, and
// players is the total number of players.
makeProjections[sum, beat, player, players] :=
{
   spin = projSpin[sum, beat, player, players]
   stay = projStay[sum, beat, player, players]

   if player == 1
   {
      println["$sum"]
      println["  Stay: " + stay]
      println["  Spin: " + spin]
   }
   
   if spin > stay
      return spin
   else
      return stay
}


// Gets projected value for spinning the wheel.
projSpin[num, beat, player, players] :=
{
   pe = 0
   
   for s = 5 to 100 step 5
   {
      sum = s + num
      if player == 1
      {
         if sum >= beat
            if sum <= 100
               pe = pe + (1-pe[sum, player+1, players])
      } else
      {
         // Not first player
         if sum > beat
            if sum <= 100
               pe = pe + 1  // Beat first player.
            else            // Too high, defer to next player
               pe = pe + pe[beat, player+1, players]
         else
            if sum == beat
               pe = pe + (1 - 1/2 * (1 - pe[beat, player+1, players]))
            else
               pe = pe + pe[beat, player+1, players]
       }
   }

   return pe/20      
}

// Gets projected value from staying.
projStay[num, beat, player, players] :=
{
   if player == 1
      if num < beat
         return 0
      else
         return (1 - pe[num, player+1, players])
   else
      if num > beat
         return 1
      else  // This player can't win, return pe of next player(s)
         if num == beat
            return 1 - (1/2 * (1 - pe[num, player+1, players]))
         else
            return pe[beat, player+1, players]
}


// Return probability that you'll beat the value
// given by beat.  This should only be called for the last player.
spinToBeat[beat, val=0, spinNum=1] :=
{
   if beat > 100
      return 1    // Other guy busted, you win
   
   if val > beat
      return 1    // Don't spin... you've won.

   if spinNum > 2  // You have no more spins
      if val == beat
         return 1/2  // Tie
      else
         return 0    // Lost

   pe = 0
   
   for n = 5 to 100 step 5
   {
      sum = n + val
      if sum <= 100
         if sum > beat   
            pe = pe + 1      // You've beat it
         else
            pe = pe + spinToBeat[beat, sum, spinNum+1] // Spin again
   }

   return pe/20      
}

max[a,b] := a > b ? a : b


View or download wheelgame3.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 17649 days, 5 hours, 45 minutes ago.