Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como implementar um jogo de dados no python

0 votos
23 visitas
perguntada Nov 2 em Ciência da Computação por Alan Antunes Rosendo (41 pontos)  

Escreva um programa que simule o lançamento de dois dados, cada um pode assumir os valores \(1,2,...,6 \) com probabilidades iguais. Se o total for 7 ou 11 no primeiro lançamento, o jogo é uma vitória; o total 2,3 ou 12, é uma derrota; e se o total for outro valor, chame ele de pontos e continue lançando dados até que o total seja 7 (derrota) ou os pontos ocorram novamente (vitória).

Exercício 3 da seção 6 do Cap. 3 do livro "The art of computer programming, Vol. 2 - 3ª edição" de Donald Knuth.

Compartilhe

1 Resposta

+1 voto
respondida Nov 2 por Alan Antunes Rosendo (41 pontos)  

Primeiro criamos uma função para lançar dois dados:

import random

  def random_dice():
      dice1=random.randint(1,6)
      dice2=random.randint(1,6)
   return dice1, dice2enter code here

Posteriormente crio uma função que é o jogo propriamente dito, irei explicar cada etapa da função separadamente:

Lança os dados e cria a soma deles:

def game():
    dice1,dice2=random_dice()
    soma=dice1+dice2
    print(f'dice 1 (sorteio 1):{dice1}')
    print(f'dice 2 (sorteio 1):{dice2}')

Ainda dentro dessa função, verifico se as condições foram satisfeitas:

    if soma==7 or soma==11:
            print('won')
    elif soma==2 or soma==3 or soma==12:
            print('loss')

Caso as condições não tenha sido satisfeitas, crio um vetor para guardar o valor da soma dos dados e lanço eles novamente:

    else:
            total=[]
            total.append(soma)
            print(f'total:{total}')
            dice1,dice2=random_dice()
            print(f'dice 1 (sorteio 2):{dice1}')
            print(f'dice 2 (sorteio 2):{dice2}')
            a=1
            soma=dice1+dice2

Daí crio uma função que enquanto não satisfizer as novas condições, continua lançando os dados:

  while soma!=7 and soma not in total:
        total.append(soma)
        dice1,dice2=random_dice()
        soma=dice1+dice2
        a+=1
        print(f'dice 1 (sorteio {a+1}):{dice1}')
        print(f'dice 2 (sorteio {a+1}):{dice2}')
        print(f'total:{total}')

Quando a função sair do loop, o jogo terá sido finalizado e verifico o seu resultado:

        if soma==7:
                    print('loss')
        else:
                    print('won')

Com isso finalizo a função game.
Concluindo a questão, utilizo o seguinte comando para rodar o jogo 10 vezes:

if __name__ == '__main__':
    for i in range(1,11):
        print(f'este é o jogo {i}')
        game()

Como exemplo, ao rodar o código, obtive o seguinte resultado:
Este é o jogo 1
Dice 1 (sorteio 1):3
Dice 2 (sorteio 1):4
won
Este é o jogo 2
Dice 1 (sorteio 1):6
Dice 2 (sorteio 1):6
Loss
Este é o jogo 3
Dice 1 (sorteio 1):1
Dice 2 (sorteio 1):6
won
Este é o jogo 4
Dice 1 (sorteio 1):5
Dice 2 (sorteio 1):2
won
Este é o jogo 5
Dice 1 (sorteio 1):5
Dice 2 (sorteio 1):2
won
Este é o jogo 6
Dice 1 (sorteio 1):2
Dice 2 (sorteio 1):2
Total:[4]
Dice 1 (sorteio 2):5
Dice 2 (sorteio 2):3
Dice 1 (sorteio 3):6
Dice 2 (sorteio 3):5
Total:[4, 8]
Dice 1 (sorteio 4):2
Dice 2 (sorteio 4):5
Total:[4, 8, 11]
Loss
Este é o jogo 7
Dice 1 (sorteio 1):2
Dice 2 (sorteio 1):1
Loss
Este é o jogo 8
Dice 1 (sorteio 1):6
Dice 2 (sorteio 1):1
won
Este é o jogo 9
Dice 1 (sorteio 1):5
Dice 2 (sorteio 1):6
won
Este é o jogo 10
Dice 1 (sorteio 1):3
Dice 2 (sorteio 1):2
Total:[5]
Dice 1 (sorteio 2):3
Dice 2 (sorteio 2):5
Dice 1 (sorteio 3):4
Dice 2 (sorteio 3):6
Total:[5, 8]
Dice 1 (sorteio 4):1
Dice 2 (sorteio 4):5
Total:[5, 8, 10]
Dice 1 (sorteio 5):5
Dice 2 (sorteio 5):6
Total:[5, 8, 10, 6]
Dice 1 (sorteio 6):3
Dice 2 (sorteio 6):5
Total:[5, 8, 10, 6, 11]
Won

comentou Nov 5 por Sergio Costa (11 pontos)  
editado Nov 6 por Sergio Costa
Caro Alan,

Parabéns pela solução. Acho que sobrou um 'enter code here' na função random_dice() e o indent no início 'def random_dice()' está com um espaço a mais. Por último, o while fica dentro da primeira condicional, certo?! Talvez fosse melhor colar todo o código junto depois.

No enunciado da questão havia um pedido para um comentário sobre o resultado dos dados, embora eu entenda meio desnecessário.

Essa última parte poderia ser resolvida com um dicionário de 6 palavras, combinando no resultado do dado 1 com o resultado do dado 2.

Foram apenas breves observações, gostei muito da solução, código simples e fácil de entender.

Um abraço,

Sergio
...