2
votes

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()
3
Once the while(choose1=="y") loop is entered, nothing can change choose1, so it'll never exit that loop. You might want to try to fix that part of the logic and see if you still have issues. - Random Davis

3 Answers

0
votes

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
0
votes

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. 
-1
votes

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.")