简体   繁体   中英

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)

在此处输入图像描述

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 )

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM