python, list logic - remove item

Asked

Viewed 54 times

0

I’m developing a game based on zombie Dice, in Python.

I’m having trouble with the use of the list specifically copo[] , where I need to remove the played dice and then put them back into the game using the function adicionar_dados() I defined, but when running the program I end up finding the error:

Indexerror: list index out of range.

Where am I going wrong?

Follow the code below:

import random


comeca_partida = False

#define dados
dado_verde = "C,P,C,T,P,C"  # 6 dados verdes
dado_amarelo = "T,P,C,T,P,C"  # 4 dados amarelos
dado_vermelho = "T,P,T,C,P,T"  # 3 dados vermelhos

copo = []


def adicionar_dados():    #adicionar os dados
    for i in range(0, 6):
        copo.append(dado_verde)
    for i in range(0, 4):
        copo.append(dado_amarelo)
    for i in range(0, 3):
        copo.append(dado_vermelho)


turno = 0

numero_jogadores = int(input("Digite o número de jogadores na partida: \n"))
lista_jogadores = []
for ind in range(0, numero_jogadores):
    nome = input("Qual o nome do jogador? \n")

if numero_jogadores >= 2:
    comeca_partida = True # iniciar a partida
    cerebros = 0
    tiros = 0
    adicionar_dados()
    i = 1
    while (i < numero_jogadores +1):
        player = dict({'jogador': i, 'cerebros': 0, 'tiros': 0})
        lista_jogadores.append(player)
        i = i + 1

        print("Partida iniciada! ")

        while comeca_partida == True:
            for player[i] in lista_jogadores:
                try:
                    print("\n olá, {}, digite o que deseja fazer:".format(nome))
                    jogar = int(input("[1] - Jogar os dados, [2] Finalziar turno ou [3] Trocar de jogador: \n"))
                except:
                    print("valor inválido!")

                if jogar == 1:
                    for i in range(0, 3):
                        num_sorteado = int(random.randrange(0, 12))
                        print("Dado sorteado {}: {} ".format((i + 1), num_sorteado))

                        dado_sorteado = copo[num_sorteado]  # 'lança' o dado e verifica qual a face sorteada
                        face_dado = int(random.randrange(0, 5))  # obtem a face do dado

                        if dado_sorteado[face_dado] == "C":  # tirou "cerebro no dado
                            print("Você comeu um cérebro!!")
                            cerebros = cerebros + 1
                            copo.remove(dado_sorteado)

                        elif dado_sorteado[face_dado] == "T":  # tirou tiro no dado
                            print("Você levou um tiro!!")
                            tiros = tiros + 1
                            copo.remove(dado_sorteado)

                        else:
                            print("A vítima escapou!!")


                elif jogar == 2:
                    pontos = cerebros
                    print("Turno finalizado! Fez", pontos, "pontos!")
                    print(lista_jogadores)
                    turno += 1
                    tiros = 0

                elif jogar == 3:
                    print("Próximo jogador!")
                    adicionar_dados()
                    #trocar jogador ???

    else:
        print("O jogo precisa de 2 ou mais jogadores!")
  • Hello, Ricardo, the error is happening because you remove the items from the list copo each round, but the variable num_sorteado continues raffling a number from 0 to 11, so when your dice only have, for example, 6 remaining items, and you draw the number 9, you will return this error.

1 answer

1


As Felipe warned in the question comment, this error is happening after you start the match when the player selects the option '1'. At this point you draw a random number between [0,11] with the intention of selecting one of the game dice and then removing it from the 'dice box' so that the player does not have a chance to withdraw this dice again (at least until the next turn).

But when you use the method .remove(), an element is removed from the list, and eventually this causes problems, because you keep drawing a random number between [0, 11], but your list no longer has the 12 initial elements.

One way you can fix this is instead of drawing a random number between [0,11] draw at halftime [0, len(copo)]:

...
if jogar == 1:
  for i in range(0, 3):
    num_sorteado = int(random.randrange(0, len(copo)))
    print("Dado sorteado {}: {} ".format((i + 1), num_sorteado))
...

Good luck with the program!

Browser other questions tagged

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