简体   繁体   中英

Ending a while loop

I'm currently writing code for a dice game in Python 3.6 I understand my coding is a little off in this, however, I'm really just wondering how to start my while loop. The instructions of the game are as follows...

  • A human player plays against the computer.

  • Player 1 rolls until they either win, decide to hold, or roll a 1.Same for player 2.

  • They take turns rolling two dice, and the totals of the dice are added together Unless a 1 is rolled.

  • If a one 1 is rolled, you get no score added and it's the next person's turn. If two 1's are rolled, you lose all of your points and its the next person's turn.

  • The first player to 100 score, wins the game.

My game works fine until Player 1 and Player 2 both hit "y" to hold back to back. Then the game quits switching between player's until "n" to not hold is hit again. Any idea why? I was told I need variables to decide who's turn it is but I'm not sure how to incorporate them into my code. Any help would be appreciated.

import random
def main():

    print("Welcome to the Two Dice Pig Game. You are Player 1!")

    Player1 = 0
    Player2 = 0

    while(Player1<100 and Player2<100):

        p1dice=random.randrange(1,7)
        p1dice2=random.randrange(1,7)
        Player1+=p1dice+p1dice2
        print("Player 1 dice 1 =",p1dice)
        print("Player 1 dice 2 =",p1dice2)
        print("Player 1 dice total =",Player1)
        print("Does player 1 want to hold?")
        choose1 = input("Enter y for yes or n for no.")
        if(choose1=="n"):
            p1dice=random.randrange(1,7)
            p1dice2=random.randrange(1,7)
            Player1+=p1dice+p1dice2
            print("Player 1 dice 1 =",p1dice)
            print("Player 1 dice 2 =",p1dice2)
            print("Player 1 dice total =",Player1)
            if(Player1>=100):
                print("Player 1 wins!")
            else:
                print("Does player 1 want to hold?")
                choose1 = input("Enter y for yes or n for no.")
        while(choose1=="y"):

            print("It's player 2's turn.")
            p2dice=random.randrange(1,7)
            p2dice2=random.randrange(1,7)
            Player2+=p2dice+p2dice2
            print("Player 2 dice 2 =",p2dice)
            print("Player 2 dice 2 =",p2dice2)
            print("Player 2 dice total =",Player2)
            print("Does player 2 want to hold?")
            choose2 = input("Enter y for yes or n for no.")
            while(choose2=="n"):
                p2dice=random.randrange(1,7)
                p2dice2=random.randrange(1,7)
                Player2+=p2dice+p2dice2
                print("Player 2 dice 2 =",p2dice)
                print("Player 2 dice 2 =",p2dice2)
                print("Player 2 dice total =",Player2)
                print("Does player 2 want to hold?")
                choose2 = input("Enter y for yes or n for no.")
            while(choose2=="y"):
                print("It's player 1's turn.")
                p1dice=random.randrange(1,7)
                p1dice2=random.randrange(1,7)
                Player1+=p1dice+p1dice2
                print("Player 1 dice 2 =",p1dice)
                print("Player 1 dice 2 =",p1dice2)
                print("Player 1 dice total =",Player1)
                print("Does player 1 want to hold?")
                choose2 = input("Enter y for yes or n for no.")

main()

You would want to simplify your code by doing something like this:

# Keep track of whose turn it is
player = 1

# Keep a dictionary of scores for each player (1 or 2)
scores = {1: 0, 2: 0}
choice = 'n'

# While neither player has > 100
while max(d.values()) < 100:

    # Roll until current player decides to keep roll
    while choice == 'n':
        print('Player', player, 'turn')
        roll = random.randrange(1,7) + random.randrange(1,7)
        print('You rolled', roll)
        choice = input('Keep roll? y/n')

    # Increment that player's score
    scores[player] += roll
    choice = 'n'

    # Change to other player
    player = (player % 2) + 1

Use a dict to keep a score per player name, switch a turn that holds the player currently throwing dice.

Implemented some logic as when to change turn from one to the other:

import random

def score(players):
    for k in players:
        print("{} has {} points".format(k,players[k]))

def hold(player):
    if input("Does {} want to hold? [y or anything]".format(player)).lower().strip() == "y":
        return "y"
    return "n"


def main():

    dice = range(1,7)
    players = {"p1":0, "p2":0}
    turn = ""
    change_player = "y"

    print("Welcome to the Two Dice Pig Game. You are Player 1!")

    while all(x < 100 for x in players.values()):
        # initially changePlayer is 
        if change_player == "y":
            # print both scores on player changed
            score(players)
            turn = "p1" if turn != "p1" else "p2"

        dice1, dice2 = random.choices(dice,k=2)
        print("{} threw {} and {} for a total of {}".format(turn,d1,d2,d1+d2))

        if dice1 + dice2 == 2:
            players[turn] = 0
            print("Two 1 - you're done for now. Your points go back to 0.")
            change_player = "y"
        elif dice1 == 1 or dice2 == 1:
            print("One 1 - you're done for now.")
            change_player  = "y"
        else:
            # only case where we need to add values and print new score
            players[turn] += dice1 + dice2
            print("Your score: {}".format(players[turn]))
            if turn == "p1":
                change_player = hold(turn)
            else:
                change_player = "n" # computer is greedy, never stops

    winner, points = max(players.items(),key=lambda x: x[1])
    print("The winner is {} with {} points.".format(winner,points))


main() 

Output:

Welcome to the Two Dice Pig Game. You are Player 1!
p1 has 0 points
p2 has 0 points
p1 threw 5 and 1 for a total of 6
One 1 - you're done for now.
p1 has 0 points
p2 has 0 points
p2 threw 3 and 6 for a total of 9
Your score: 9
p2 threw 6 and 2 for a total of 8
Your score: 17
p2 threw 4 and 1 for a total of 5
One 1 - you're done for now.
p1 has 0 points
p2 has 17 points
p1 threw 4 and 5 for a total of 9
Your score: 9
Does p1 want to hold? [y or anything]
p1 threw 2 and 6 for a total of 8
Your score: 17
Does p1 want to hold? [y or anything]
p1 threw 4 and 6 for a total of 10
Your score: 27

[snipp]

One 1 - you're done for now.
p1 has 91 points
p2 has 51 points
p1 threw 6 and 4 for a total of 10
Your score: 101
Does p1 want to hold? [y or anything]
The winner is p1 with 101 points. 

Because once you've set a choice for choose1 , it never gets set again. The quick way to fix this would be to add an input after the two while loops for choose2 , although you may want to look into making your code neater through making functions for the common logic

while(choose2=="y"):
     ....
choose1 = input("Enter y for yes or n for no.")

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