PYTHON - NIM game (problem with computer fix starting or not)

Asked

Viewed 2,029 times

-1

Goal

You must write a program in the Python language, version 3, that allows a "victim" to play the NIM against the computer. The computer, of course, must follow the winning strategy described above.

Let n be the initial number of pieces and m the maximum number of pieces it is possible to remove in a round. To ensure that the computer always wins, you need to consider the two possible scenarios for the start of the game:

If n is a multiple of (m+1), the computer must be "generous" and invite the player to start the match; Otherwise, the computer takes the initiative to start the game. Once the game is started, the computer’s winning strategy is to always leave a number of tiles that is multiple (m+1) to the player. If this is not possible, you should take as many pieces as possible.

Your job, then, will be to implement the Game and make the computer use the winning strategy.

See an example of how the game should work:

$ > python3 jogo_nim.py

Bem-vindo ao jogo do NIM! Escolha:

1 - para jogar uma partida isolada
2 - para jogar um campeonato 2

Voce escolheu um campeonato!

**** Rodada 1 ****

Quantas peças? 3
Limite de peças por jogada? 1

Computador começa!

O computador tirou uma peça.
Agora restam 2 peças no tabuleiro.

Quantas peças você vai tirar? 2

Oops! Jogada inválida! Tente de novo.

Quantas peças você vai tirar? 1

Você tirou uma peça.
Agora resta apenas uma peça no tabuleiro.

O computador tirou uma peça.
Fim do jogo! O computador ganhou!

**** Rodada 2 ****

Quantas peças? 3
Limite de peças por jogada? 2

Voce começa!

Quantas peças você vai tirar? 2 
Voce tirou 2 peças.
Agora resta apenas uma peça no tabuleiro.

O computador tirou uma peça.
Fim do jogo! O computador ganhou!

**** Rodada 3 ****

Quantas peças? 4
Limite de peças por jogada? 3

Voce começa!

Quantas peças você vai tirar? 2
Voce tirou 2 peças.
Agora restam 2 peças no tabuleiro.

O computador tirou 2 peças.
Fim do jogo! O computador ganhou!

**** Final do campeonato! ****

Placar: Você 0 X 3 Computador

I made the code on top of Anderson’s code Carlos Woss (https://ideone.com/GfaZyF) that’s the one:

tipo_jogo = 0
 
def computador_escolhe_jogada(n, m):
    if n <= m:
        return n
    else:
        quantia = n % (m+1)
        if quantia > 0:
            return quantia
        return m
 
def usuario_escolhe_jogada(n, m):
    jogada = 0
    while jogada == 0:
        jogada = int(input("Quantas peças você vai tirar? "))
        if jogada > n or jogada < 1 or jogada > m:
            print("Oops! Jogada inválida! Tente de novo.")
            jogada = 0
    return jogada
 
def partida(): 
    print(" ")
    n = int(input("Quantas peças? "))
    m = int(input("Limite de peças por jogada? "))

    is_computer_turn = True
    if False:
        print("O computador começa!")
    if n % (m+1) == 0: is_computer_turn = False
    if True:
        print("Você começa!")

    while n > 0: 
        if is_computer_turn:
            jogada = computador_escolhe_jogada(n, m)
            is_computer_turn = False
            print("Computador tirou {} peças.".format(jogada))
        else:
            jogada = usuario_escolhe_jogada(n, m)
            is_computer_turn = True
            print("Você tirou {} peças.".format(jogada))
        n = n - jogada
        print("Agora restam {} peças no tabuleiro.\n".format(n))
    if is_computer_turn:
        print("Você ganhou!")
        return 1
    else:
        print("Fim de jogo! O computador ganhou!")
        return 0
 
def campeonato():
    usuario = 0
    computador = 0
    for _ in range(3):
        vencedor = partida()
        if vencedor == 1:
            usuario = usuario + 1
        else:
            computador = computador + 1
    print("******* Final do campeonato! *******")
    print("Placar: Você  {} x {}  Computador".format(usuario, computador))
 
while tipo_jogo == 0:
    print("Bem-vindo ao jogo do NIM! Escolha:")
    print(" ")
    print("1 - Para jogar uma partida isolada")
    print("2 - Para jogar um campeonato")

    tipo_jogo = int(input("Sua opção: "))
    print(" ")

    if tipo_jogo == 1:
        print("Voce escolheu partida isolada!")
        partida()
        break
    if tipo_jogo == 2:
        print("Voce escolheu um campeonato!")
        campeonato()
        break
    else:
        print("Opção inválida!")
        tipo_jogo = 0

  • The statement of the quoted question says: "If n is a multiple of (m+1), the computer must be "generous" and invite the player to start the match". The code snippet that executes this logic is on line 60, using the values of n and m read on lines 53 and 54. For example, if you put the game for 6 pieces with a tile limit equal to 2, the user will start playing as 6 is multiple of (2+1).

  • Okay, so there’s some part of the code that makes the computer not start, and I can’t find it, I put the code up there to take a look.

  • "The test result with his program was: ***** [0.32 points]: Checking single match (n = 5, m = 3, plays = (1,)) - Failed ***** Assertionerror: Should start with the computer ***** [0.32 points]: Checking single match (n = 5, m = 3, plays = (2,)) - Failed ***** Assertionerror: Should start with computer ***** [0.32 points]: Checking single match (n = 11, m = 3, plays = (2, 3)) - Failed ***** Assertionerror: Should start with computer" These are the errors

  • It seems that you are testing the code with some tool and probably the code I asked in the other question does not fit all the requirements of your problem. Edit the question and put the statement of your question that will be easier to analyze what needs to be adapted.

  • Okay, it’s edited out.

  • Is it exactly the same statement or did you just copy it? Note that the expected output is different from what the code generates, you will need to adapt the messages.

  • I copied, this is a statement of the site, this is what you ask to be done, and the program is an example too.

  • I just needed a light, I’m kind of lost in the exercises.

  • 2

    There is no need to edit the title by "solved" or "unresolved". We do not function as forums. As you did not get an answer to solve the problem, follow the recommendations I made to you in the other question.

  • It’s edited now. Someone can help me?

  • The text of the other is much better and smaller than this, it is much easier to understand, it is not easier to take the body of the other question as an edition of this?

  • Redacted.

Show 7 more comments

2 answers

1

Just adjust the following code snippet. This way your application will question who should start the game.

# Define uma variável para controlar a vez do computador:
inicio = input("Deseja ser você o primeiro a jogar? S/N ").strip().lower()
is_computer_turn = False if inicio in ['s', 'y', 'sim', 'yes'] else True

Tips:
strip() causes white spaces at the beginning or end of the line to be removed
Lower() makes the whole text lowercase
This makes it easier to use a string comparison.

  • That helps a lot, thanks, but it makes a mistake because it was not what was asked

0

I used the Code below, which was a contribution of friends and I gave an improved

def computador_escolhe_jogada(n, m):
    computadorRemove = 1

    while computadorRemove != m:
        if (n - computadorRemove) % (m+1) == 0:
            return computadorRemove

        else:
            computadorRemove += 1

    return computadorRemove


def usuario_escolhe_jogada(n, m):
    jogadaValida = False

    while not jogadaValida:
        jogadorRemove = int(input('Quantas peças você vai tirar? '))
        if jogadorRemove > m or jogadorRemove < 1:
            print()
            print('Oops! Jogada inválida! Tente de novo.')
            print()

        else:
            jogadaValida = True

    return jogadorRemove


def campeonato():
    nRodada = 1
    while nRodada <= 3:
        print()
        print('**** Rodada', nRodada, '****')
        print()
        partida()
        nRodada += 1
    print()
    print('Placar: Você 0 X 3 Computador')


def partida():
    n = int(input('Quantas peças? '))

    m = int(input('Limite de peças por jogada? '))

    vezDoPC = False

    if n % (m+1) == 0:
        print()
        print('Voce começa!')

    else:
        print()
        print('Computador começa!')
        vezDoPC = True

    while n > 0:
        if vezDoPC:
            computadorRemove = computador_escolhe_jogada(n, m)
            n = n - computadorRemove
            if computadorRemove == 1:
                print()
                print('O computador tirou uma peça')
            else:
                print()
                print('O computador tirou', computadorRemove, 'peças')

            vezDoPC = False
        else:
            jogadorRemove = usuario_escolhe_jogada(n, m)
            n = n - jogadorRemove
            if jogadorRemove == 1:
                print()
                print('Você tirou uma peça')
            else:
                print()
                print('Você tirou', jogadorRemove, 'peças')
            vezDoPC = True
        if n == 1:
            print('Agora resta apenas uma peça no tabuleiro.')
            print()
        else:
            if n != 0:
                print('Agora restam,', n, 'peças no tabuleiro.')
                print()

    print('Fim do jogo! O computador ganhou!')

print('Bem-vindo ao jogo do NIM! Escolha:')
print()

print('1 - para jogar uma partida isolada')

tipoDePartida = int(input('2 - para jogar um campeonato '))

if tipoDePartida == 2:
    print()
    print('Voce escolheu um campeonato!')
    print()
    campeonato()
else:
    if tipoDePartida == 1:
        print()
        partida()

Browser other questions tagged

You are not signed in. Login or sign up in order to post.