Je suis nouveau dans la programmation et j'ai une tâche que je ne peux pas comprendre par moi-même.

La tâche est de créer un programme qui vous permet de décider du nombre de dés à lancer, de 1 à 5, en vérifiant si vous faites une mauvaise entrée. Après chaque lancer, le numéro du dé s'affiche et le total à ce jour. Si le dé donne un 6, il n'est pas inclus dans le total et vous obtenez plus de lancers. C'est là que je suis coincé. Je veux que mon programme redémarre la boucle si le dé tourne un 6 et juste 2 lancers vers les sumDices et continue la boucle, mais je ne peux pas le faire fonctionner.

Voici mon code:

import random
numDices=0
total = 0
print("------------")
print("DICE ROLLING")
print("------------")
print()
exit=False
reset=False
while True:
    while True:
        numDices=int(input("How many dices to throw? (1-5) "))
        if numDices<1 or numDices>5:
            print("Wrong input, try again")
            break
        while True:
            if reset==True:
                break
            for i in range(numDices):
                dicesArray = list(range(numDices))
                dicesArray[i] = random.randint(1, 6)
                print(dicesArray[i])
                total += dicesArray[i]
                if dicesArray[i] == 1:
                    print("You rolled a one, the total is: ",str(total))
                elif dicesArray[i] == 2:
                    print("You rolled a two, the total is: ",str(total))
                elif dicesArray[i] == 3:
                    print("You rolled a three, the total is: ",str(total))
                elif dicesArray[i] == 4:
                    print("You rolled a four, the total is: ",str(total))
                elif dicesArray[i] == 5:
                    print("You rolled a five, the total is: ",str(total))
                elif dicesArray[i] == 6:
                    total-=6
                    numDices+=2
                    print("You rolled a six, rolling two new dices")
                    reset=True
        print("The total sum is",str(total),"with",numDices,"number of rolls.")
        print()
        restart=(input("Do you want to restart press Enter, to quit press 9. "))
        if restart=="9":
            exit=True
            break
        else:
            print()
            break
    if exit==True:
        break
0
Martin Machl 30 mai 2020 à 16:28

4 réponses

Meilleure réponse

Vous pouvez le faire de la manière suivante, en modifiant légèrement votre code, en comptant les dés disponibles. J'y ai aussi réduit les boucles imbriquées

import random
numDices=0
total = 0
print("------------")
print("DICE ROLLING")
print("------------")
print()
start = True
while start:
    numDices=int(input("How many dices to throw? (1-5) "))
    if numDices<1 or numDices>5:
        print("Wrong input, try again")
        break
    total = 0
    dices_counter = 0
    while numDices > 0 :
        eyes = random.randint(1, 6)
        dices_counter+=1 
        total += eyes
        if eyes == 1:
            print("You rolled a one, the total is: ",str(total))
            numDices-=1
        elif eyes == 2:
            print("You rolled a two, the total is: ",str(total))
            numDices-=1
        elif eyes == 3:
            print("You rolled a three, the total is: ",str(total))
            numDices-=1
        elif eyes == 4:
            print("You rolled a four, the total is: ",str(total))
            numDices-=1
        elif eyes == 5:
            print("You rolled a five, the total is: ",str(total))
            numDices-=1
        elif eyes == 6:
            total-=6
            numDices+=2
            print("You rolled a six, rolling two new dices")
    print("The total sum is",str(total),"with",dices_counter,"number of rolls.")
    print()
    start=(input("Do you want to restart press Enter, to quit press 9. "))
    if start=="9":
        break
    else:
        print()
        start = True
0
Nico Müller 30 mai 2020 à 13:46

Utilisation d'une fonction récursive

import random

total = 0
diceRollList = []

# Define dice rolling function
def rollDice():
    rollResult = random.randint(1, 6)
    if rollResult == 6:
        # If 6 Rolled run two more rolls and sum the results
        print("Rolled a 6 Rolling 2 more")
        return sum([rollDice() for _ in range(2)])
    # If 6 not rolled return the result
    print(f"Rolled a {rollResult}")
    return rollResult

while True:

    numberOfDice = int(input("How many Die to throw: "))

    if numberOfDice not in range(1, 6):
        print("Number of dice should be between 1 and 5")
        break

    for dice in range(numberOfDice):
        print(f"Rolling Dice {dice}")
        # Add result to the total
        total += rollDice()
        print(f"Running Total: {total}")
0
Tom 30 mai 2020 à 14:14
for i in range(numDices):

Votre boucle for limite le nombre d'itérations dès que range(numDices) est évalué / exécuté. Lorsque vous essayez d'augmenter le nombre d'itérations avec numDices+=2, cela n'a aucun effet car range(numDices) n'est évalué qu'une seule fois.

Si vous voulez pouvoir changer le nombre d'itérations, utilisez une autre boucle while et utilisez i comme compteur. Quelque chose comme.

i = 0
while i <= numDices:
    ...
    ...
    if ...:
        ...
    elif ...:
    ...
    i += 1

Ensuite, dans la suite pour elif dicesArray[i] == 6: l'instruction numDices += 2 augmentera effectivement le nombre d'itérations.


Je vois un autre problème que vous n'avez pas mentionné. Vous commencez avec une liste de longueur fixe basée sur la valeur d'origine de numDices et vous utilisez i comme index pour cette liste.

dicesArray = list(range(numDices))`
...
dicesArray[i]
...

Si i peut potentiellement être supérieur à l ' original numDices (supérieur à len(dicesArray)), vous obtiendrez finalement une IndexError. Vous devriez probablement commencer avec une liste vide et y ajouter. Pour obtenir le jet de dés le plus récent, utilisez dicesArray[-1] au lieu de dicesArray[i].

...
dicesArray = []
i = 0
while i <= numDices:
    dicesArray.append(random.randint(1, 6))
    total += dicesArray[-1]
    if dicesArray[-1] == 1:
        ...
    ...

6.3.2. Abonnements

0
wwii 30 mai 2020 à 14:12

Pour résoudre votre problème, je remplacerais votre boucle for actuelle par une boucle while

De plus, je vois beaucoup de choses inutiles dans votre code, je vais essayer de les lister:

  • Pourquoi utilisez-vous autant de "while True"?

  • Pourquoi n'utilisez-vous pas simplement la fonction exit () pour quitter au lieu d'utiliser un variable?

  • Est-ce que toute la partie est vraiment nécessaire, ne pouvez-vous pas simplement imprimer le numéro?

Voici ma proposition:

import random
remaining_dices=0
total = 0
print("------------")
print("DICE ROLLING")
print("------------")
print()

while True:
    remaining_dices=int(input("How many dices to throw? (1-5) "))
    if remaining_dices<1 or remaining_dices>5:
        print("Wrong input, try again")
        break
    dicesArray = list()
    while remaining_dices>0:
        dice_value = random.randint(1, 6)
        dicesArray.append(dice_value)
        print(dice_value)
        total += dice_value
        remaining_dices -= 1
        if(dice_value == 6):
            total-=6
            remaining_dices +=2
            print("You rolled a 6, rolling two new dices")
        else:
            print("You rolled a " + str(dice_value) + ", the total is : " +str(total))

    restart=(input("Do you want to restart press Enter, to quit press 9. "))
    if restart=="9":
        exit()
    else:
        print()
0
Clementine 30 mai 2020 à 13:48
62103140