Python problem: Craps game using Monte Carlo estimation in a dice game - python

Here is the game: the player throws a pair of standard, six-sided dice.
If the player rolls a total of 7 or 11, the player wins.
If the player rolls a total of 2, 3, or 12, the player loses.
For all other roll values, the player will repeatedly roll the pair of dice until either she rolls the initial value again (in which case they win) or 7 (bet is lost.)
Here is my code:
from random import seed, randint
def simulate():
win_count = 0
die1 = randint(1, 6)
die2 = randint(1, 6)
roll = die1 + die2
if roll == 7 or roll == 11:
return True
win_count += 1
elif roll == 2 or roll == 3 or roll == 12:
return False
else:
die1 = randint(1, 6)
die2 = randint(1, 6)
new_roll = die1 + die2
while roll != new_roll and roll != 7:
if new_roll == roll:
return True
win_count += 1
elif new_roll == 7:
return False
return win_count
## Main
for trials in range(1000):
simulate()
print(win_count / 1000)
I also need to find the probability of winning the "pass bet", which is what the rules are described above. The number of trials is 1000. However, nothing returns from this code. Where am I going wrong?

Related

Producing probability of wins in Python craps game

I have the logic down for this game of craps. My only problem right now is that I can't seem to get any output for finding the probability of wins for the game. Here is the code:
from random import seed, randint
def simulate():
die1 = randint(1, 6)
die2 = randint(1, 6)
roll = die1 + die2
first_roll = roll
if first_roll == 7 or first_roll == 11:
return True
elif first_roll == 2 or first_roll == 3 or first_roll == 12:
return False
else:
second_roll = randint(1, 6) + randint(1, 6)
while second_roll != first_roll and second_roll != 7:
if second_roll == first_roll:
return True
elif second_roll == 7:
return False
## Main
def probability(n):
simulate()
wins = 0
for i in range(n):
if simulate() == 1:
wins += 1
return
print(probability(10000))
I want to find the probability of wins for 10000 trials. However, I don't get any output when running this code. Nothing shows up. Where am I going wrong on this? I have tried for a couple hours but nothing seems to be working for me. Please include code and what I was doing wrong. I know for a fact that it should be 49% but I can't seem to arrive at that answer.
I am sorry for my latest answer, I didn't read that its craps game.
from random import seed, randint
def simulate():
die1 = randint(1, 6)
die2 = randint(1, 6)
roll = die1 + die2
first_roll = roll
if first_roll == 7 or first_roll == 11:
return True
elif first_roll == 2 or first_roll == 3 or first_roll == 12:
return False
else:
while True:
second_roll = randint(1, 6) + randint(1, 6)
if second_roll == first_roll:
return True
elif second_roll == 7:
return False
# Main
def probability(n):
wins = 0
for i in range(n):
if simulate() == 1:
wins += 1
return wins
print(probability(100000))
I think its the answer, I changed the second part of simulate()
where its returning True, when second_roll == first_roll, returning False when second_roll==7, and repeats that while loop by continue, if second_roll is equal to other number.

Python: how to let dice not roll same value

In my Python program I want to roll a dice 8 times, but without it repeating the same value. I am trying different things but can't find a solution. My code is all follows:
if time%2 == 0 and counter_agents<max_agents:
succeeded=False
teller=0
while (not(succeeded)and teller<10):
dice = random.randint (0,7)
combis = []
if dice == 0:
pos_x=20
pos_y=75
elif dice == 1:
pos_x=21
pos_y=75
elif dice == 2:
pos_x=60
pos_y=75
elif dice == 3:
pos_x=61
pos_y=75
elif dice == 4:
pos_x=100
pos_y=75
elif dice == 5:
pos_x=101
pos_y=75
elif dice == 6:
pos_x=140
pos_y=75
elif dice == 7:
pos_x=141
pos_y=75
if counter_agents+1<=max_agents: #field[pos_y,x_pos]==0 and
succeeded=True
teller=teller+1
I believe this function does the job
import random
def roll_dice(min, max) -> int:
numbers = set()
for _ in range(max - min + 1):
while (dice_value := random.randint(min, max)) in numbers:
pass
numbers.add(dice_value)
yield dice_value
You can call it like this:
dice = roll_dice(0, 7)
dice_value = next(dice)
To get all values:
list(roll_dice(0, 7))
You can use this:
#Importing the library
import numpy as np
#create a function "def"
def roll():
numbers = list(np.random.choice(range(8), 8, replace=False))
return numbers
#calls the function
roll()

Caught in a Python infinite loop

I am trying to write a program to play 100 games of Craps and print out the overall results. I have an infinite loop at the end of my code.
Does anyone see the problem?
I assume my 2nd function could be calling diceRoll again for secondRoll. Trying that now...
Specs:
The player must roll two six-side dice and add the total of both
dice.
The player will win on the first roll if they get a total of 7 or 11
The player will lose on the first roll if they get a total of 2, 3,
or 12
If they get any other result (4, 5, 6, 8, 9, 10), they must roll
again until they either match their first roll (a win) or get a
result of 7 (a loss)
Use at least two functions in your program
from random import randrange as rd
winTuple = 7, 11
lossTuple = 2, 3, 12
wins = 0
losses = 0
x = 1
def diceRoll (number, type = 6):
result = 0
for i in range(number):
result += rd(1, type +1)
return result
while x < 101:
firstRoll = diceRoll(2)
if firstRoll in winTuple:
wins += 1
elif firstRoll in lossTuple:
losses += 1
else:
secondRoll = diceRoll(2)
while secondRoll != 7 or secondRoll != firstRoll:
if secondRoll == 7:
wins += 1
elif secondRoll == firstRoll:
wins += 1
else:
secondRoll = diceRoll(2)
x += 1
print("wins: ", wins)
print("losses: ", losses)
Looks like you need to eliminate your inner loop. First, the loop conditions are in direct conflict with your conditional statements, so the loop never exits. Second, why would you want a loop here? Even if you fixed it, all it would do is keep rolling the second dice until a win is scored.
while x < 101:
firstRoll = diceRoll(2)
if firstRoll in winTuple:
wins += 1
elif firstRoll in lossTuple:
losses += 1
else:
secondRoll = diceRoll(2)
if secondRoll == 7 or secondRoll == firstRoll:
wins += 1
x += 1
In response to your comment, this is how you create your second loop. You make an infinite loop with while True and break out of it when the conditions are met.
while x < 101:
firstRoll = diceRoll(2)
if firstRoll in winTuple:
wins += 1
elif firstRoll in lossTuple:
losses += 1
else:
while True:
secondRoll = diceRoll(2)
if secondRoll == 7:
losses += 1
break
elif secondRoll == firstRoll:
wins += 1
break
x += 1
If your firstRoll != 7 (let's say firstRoll = 8) then your script cannot exit the second nested loop because either secondRoll != 7 or secondRoll = 7 and therefore firstRoll != secondRoll (7 != 8)
I am not sure how your program goes through 100 games of craps, here is an example of a program I wrote quick that goes through 100 games. Games being times you either hit or don't hit the point.
Clearly you need to understand how craps works to make something like this, so I am assuming you do. The program you were trying to write, even though you were stuck in the loop, was not actually playing a full game of craps.
You can choose the amount of games you want and the only thing it stores is if you won or lost.
You can add other statistics if you would like, for example points hit and which points they were etc.,
I added text to, also, make it user friendly if this is for a school project.
There are many different ways to do this, I used a main while loop and created two functions for whether the button is on or off.
You could obviously condense this, or write a class instead but I simply put this together quick to give you an idea and see how it goes through every loop and statement.
I am still a novice, so I apologize to anyone else reading, I know the below is not the most efficient/does not perfectly follow PEP8 especially the long if statement in the main loop.
This does perform what you wanted and feel free to change the number of games. Enjoy!
import random
wins = 0
losses = 0
gamenum = 0
#Used a list to pull the dice numbers from but not mandatory
dicenum = [2,3,4,5,6,7,8,9,10,11,12]
#Function when point is off
def roll_off():
#Random roll from list
roll = random.choice(dicenum)
if roll == 2:
print("2 craps")
elif roll == 3:
print("3 craps")
elif roll == 4:
print("Point is 4")
return(4)
elif roll == 5:
print("Point is 5")
return(5)
elif roll == 6:
print("Point is 6")
return(6)
elif roll == 7:
print("Winner 7")
elif roll == 8:
print("Point is 8")
return(8)
elif roll == 9:
print("Point is 9")
return(9)
elif roll == 10:
print("Point is 10")
return(10)
elif roll == 11:
print("Yo 11")
elif roll == 12:
print("12 craps")
#Function when point is on
def roll_on(x):
#Random roll from list
roll = random.choice(dicenum)
if roll == 2:
print("2 craps")
elif roll == 3:
print("3 craps")
elif roll == 4:
print("You rolled a 4")
elif roll == 5:
print("You rolled a 5")
elif roll == 6:
print("You rolled a 6")
elif roll == 7:
print("7 out")
elif roll == 8:
print("You rolled a 8")
elif roll == 9:
print("You rolled a 9")
elif roll == 10:
print("You rolled a 10")
elif roll == 11:
print("Yo 11")
elif roll == 12:
print("12 craps")
#Check if you hit the point
if x == 4 and roll == 4:
print("You win!")
return (True)
elif x == 5 and roll == 5:
print("You win!")
return (True)
elif x == 6 and roll == 6:
print("You win!")
return (True)
elif x == 7 and roll == 7:
print("You win!")
return (True)
elif x == 8 and roll == 8:
print("You win!")
return (True)
elif x == 9 and roll == 9:
print("You win!")
return (True)
elif x == 10 and roll == 10:
print("You win!")
return (True)
#Check if you 7'ed out
if roll == 7:
print("You lose!")
return (False)
#Main game, change the amount of games you want to play
while gamenum < 100:
diceresult = roll_off()
#If statement to check the point
if diceresult == 4 or diceresult == 5 or diceresult == 6 or diceresult == 8 or diceresult == 9 or diceresult == 10:
active = True
print("The point is on!")
while active == True:
curentstate = roll_on(diceresult)
if curentstate == False:
gamenum += 1
losses += 1
print("------------")
print("Games:", gamenum)
print("Losses:", losses)
print("Wins:", wins)
print("------------")
break
elif curentstate == True:
gamenum += 1
wins += 1
print("------------")
print("Games:", gamenum)
print("Losses:", losses)
print("Wins:", wins)
print("------------")
break

Random Die Generator

Can someone tell me why my program doesn't work? Even when I set s as 10000.
When I printed out wins and plays it just shows up as 0 and 1.
def manyCraps(s):
wins = 0
plays = 0
dice1 = randint(1,6)
dice2 = randint(1,6)
total = dice1 + dice2
for i in range(s):
if total == 7 or total == 11:
wins = wins + 1
plays = plays + 1
else:
if total == 2 or total == 3 or total == 12:
plays = plays + 1
else:
plays = plays + 1
dice3 = randint(1,6)
dice4 = randint(1,6)
total = dice3 + dice4

Dice-rolling game doesn't change results

Doing a dice Rolling game in python, and whenever I start my second round I still end up getting the same dice results from the previous round.
import random
import time
#gets the dice side
def roll_dice(sides):
dice_results = list()
for side in sides:
roll_result = random.randint(1,side+1)
dice_results.append(roll_result)
return dice_results
#pulls a dice out from the list
def dice_fell(roll_result):
player1_dice = player1_dice_results
player2_dice = player2_dice_results
for item in player1_dice:
if item % 4 == 0:
player1_dice.remove(item)
return player1_dice
for item in player2_dice:
if item % 4 == 0:
player2_dice.remove(item)
return player2_dice
# variables
dice_set1=[4, 6, 8, 10, 12, 20, 100]
dice_set2=[4, 6, 8, 10, 12, 20, 100]
player1_dice_results = roll_dice(dice_set1)
player2_dice_results = roll_dice(dice_set2)
player1_final_results = dice_fell(player1_dice_results)
player2_final_results = dice_fell(player2_dice_results)
player1_total= sum(player1_dice_results)
player2_total= sum(player2_dice_results)
player1_score = 0
player2_score = 0
while player1_score < 3 or player2_score < 3:
# This part just announces what happens
exit= input(str("Press Enter to start! Press 'q' to leave after each round! \n"))
if exit != "q":
print("Let's begin! Be careful for the small table!")
elif exit == "q":
quit()
print("You are rolling...")
time.sleep(2)
print("You have rolled: ",player1_final_results)
if len(player1_final_results) < 7:
print("Sorry player 1, some of your dice have fallen off the table!")
print()
print("Your total is: ",player1_total)
print()
print("Player 2 is rolling...")
time.sleep(2)
print("Player 2 has rolled:" ,player2_final_results)
if len(player2_final_results) < 7:
print("Sorry player 2, some of your dice have fallen off the table!")
print()
print("Player 2's total is: ",player2_total)
print()
if player1_total > player2_total:
print()
print("You have won the round with,",player1_total,"!"),
player1_score += 1
print("Your score is: ",player1_score)
elif player2_total > player1_total:
print()
print("Player 2 has won the round with,",player2_total,"!"),
player2_score += 1
print("Player 2's score is: ",player2_score)
if player1_score == 3:
print("Congratulations, you won!")
elif player2_score == 3:
print("Player 2 wins! Better luck next time champ!")
I believe that I've fixed the indentation problems.
I have reproduced the problem.
As Kevin said, your immediate problem is that you roll the dice only once, before you enter your while loop. Here's what it looks like with the rolls inside the loop, but after the player decides whether to continue.
dice_set1=[4,6,8,10,12,20,100]
dice_set2=[4,6,8,10,12,20,100]
player1_score = 0
player2_score = 0
while player1_score < 3 or player2_score < 3:
# This part just announces what happens
exit = raw_input(str("Press Enter to start! Press 'q' to leave after each round! \n"))
if exit != "q":
print("Let's begin! Be careful for the small table!")
elif exit == "q":
quit()
player1_dice_results = roll_dice(dice_set1)
player2_dice_results = roll_dice(dice_set2)
player1_final_results = dice_fell(player1_dice_results)
player2_final_results = dice_fell(player2_dice_results)
player1_total= sum(player1_dice_results)
player2_total= sum(player2_dice_results)
print("You are rolling...")
... # remainder of code omitted
That said, do note that you have several other problems with the program. You won't terminate until both players have won three times -- use and instead of or in the while condition.
Most of my other comments are more appropriate for the codeReview group; you might post there when you're done debugging.

Categories

Resources