"list indices must be integers or Slices, not Nonetype"

Asked

Viewed 3,056 times

1

I’m trying to develop an old game in python, which gets a user who will play against the computer, the output should say the winner of the game or got old. Almost everything is correct except when the game turns old, as I get the following error:

File "C: Users Pedroh Desktop 0.py old game", line 244, in define Game(board, computer, play)
File "C: Users Pedroh Desktop 0.py old game", line 99, in
defineJogada space[move] = letter Typeerror: list indices must be integers or Slices, not Nonetype

This is my code:

import random
import sys
import time

Computador = str('Computador')

def sorteioPrimeiraJogada(lista):
    sorteio=random.choice(lista)
    return sorteio




def desenhoDoTabuleiro(espaco):    
    print('      |      |')
    print('   ' + str(espaco[0]) + '  |   ' + str(espaco[1]) + '  | ' + str(espaco[2]))
    print('      |      |')
    print('--------------------')
    print('      |      |')
    print('   ' + str(espaco[10]) + '  |   ' + str(espaco[11]) + '  | ' + str(espaco[12]))
    print('      |      |')
    print('--------------------')
    print('      |      |')
    print('   ' + str(espaco[20]) + '  |   ' + str(espaco[21]) + '  | ' + str(espaco[22]))
    print('      |      |')

def posicaoTabuleiro():

    print('      |      |')
    print('  ' '00' '  |  ''01' '  | ' '02')
    print('      |      |')
    print('--------------------')
    print('      |      |')
    print('  ' '10' '  |  ''11' '  | ' '12')
    print('      |      |')
    print('--------------------')
    print('      |      |')
    print('  ' '20' '  |  ''21' '  | ' '22')
    print('      |      |')
    print(' ')
    print(' ')


def solicitaSimboloDoHumano ():
    while True:
        variavel=str(input('Com qual símbolo você prefere jogar(X ou O)? ')).upper()
        if variavel== 'X' or variavel=='x' :
            print('Você jogará contra o computador, que usará O.')
            break
        elif variavel== 'O' or variavel=='o':
            print('Você jogará contra o computador, que usará X.')
            break
        else:        
            print('Você não digitou um símbolo válido.')
    return variavel

def listaLetra():
    global variavel
    if variavel== 'X' or variavel=='x':
        letra = ['X','O']
    elif variavel== 'O' or variavel=='o' or variavel=='0':
        letra= ['O','X']
    return letra

def jogarNovamente():
    print('Você quer jogar novamente?(sim ou não)')
    jn=input().lower().startswith('s')
    while not jn:            
            print('Volte Sempre!')
            time.sleep(2)
            sys.exit()      

            return False
    return True    


def defineJogada(espaco, letra, jogada):
    espaco[jogada] = letra



def verificaVencedor(ep, var):

    return ((ep[0] == var and ep[1] == var and ep[2] == var) or 
    (ep[10] == var and ep[11] == var and ep[12] == var) or 
    (ep[20] == var and ep[21] == var and ep[22] == var) or 
    (ep[0] == var and ep[10] == var and ep[20] == var) or 
    (ep[1] == var and ep[11] == var and ep[21] == var) or 
    (ep[2] == var and ep[12] == var and ep[22] == var) or 
    (ep[0] == var and ep[11] == var and ep[22] == var) or 
    (ep[2] == var and ep[11] == var and ep[20] == var))



def copiaTabuleiro(espaco):

    copiaespaco = []

    for i in espaco:
        copiaespaco.append(i)

    return copiaespaco


def temEspacoLivre(espaco,jogada):  
    return espaco[jogada] == ' '



def jogadaHumana():
    print('Qual a sua jogada? (x e y[0,2])')
    jogada=input()
    return jogada



def validaJogada(espaco):

    global jogada
    while jogada not in '00 01 02 10 11 12 20 21 22'.split() or not temEspacoLivre(espaco,int(jogada)):

        print('Você não digitou uma jogada válida.')
        jogada = jogadaHumana()
    return int(jogada)

def escolheJogadaAleatoriaDaLista(espaco, listaDeJogadas):

    jogadasPossiveis = []
    for i in listaDeJogadas:
        if temEspacoLivre(espaco, i):
            jogadasPossiveis.append(i)

    if len(jogadasPossiveis) != 0:
        return random.choice(jogadasPossiveis)
    else:
        return None

def jogadaComputador(espaco, computadorlet):

    if computadorlet == 'X':
        jogadorlet = 'O'
    else:
        jogadorlet = 'X'


    for i in range(0, 23):
        copia = copiaTabuleiro(espaco)
        if temEspacoLivre(copia, i):
            defineJogada(copia, computadorlet, i)
            if verificaVencedor(copia, computadorlet):
                return i


    for i in range(0, 23):
        copia = copiaTabuleiro(espaco)
        if temEspacoLivre(copia, i):
            defineJogada(copia, jogadorlet, i)
            if verificaVencedor(copia, jogadorlet):
                return i


    jogada = escolheJogadaAleatoriaDaLista(espaco, [0, 2, 20, 22])
    if jogada != None:
        return jogada


    if temEspacoLivre(espaco, 11):
        return 11


    return escolheJogadaAleatoriaDaLista(espaco, [21, 10, 12, 1])


def verificaVelha(espaco):

    for i in range(0, 23):
        if temEspacoLivre(espaco, i):
            return False

    return True


while True:
    tabuleiro = [' ']*23

    nome_ok = False
    while nome_ok == False:        
            nome=input('Qual é o seu nome(ou apelido)? ')
            if nome:
                nome_ok = True


    lista = [nome, Computador]
    variavel = solicitaSimboloDoHumano()
    jogadorlet, computadorlet = listaLetra()
    vez = sorteioPrimeiraJogada(lista)
    print ('A partida começará por %s.' %vez)
    jogoAcontecendo = True
    while jogoAcontecendo:
        if vez == nome:
            posicaoTabuleiro()
            desenhoDoTabuleiro(tabuleiro)
            jogada = jogadaHumana()
            movimento = validaJogada(tabuleiro)
            defineJogada(tabuleiro,jogadorlet,movimento)
            if verificaVencedor(tabuleiro, jogadorlet):
                posicaoTabuleiro()
                desenhoDoTabuleiro(tabuleiro)
                print('Vencedor: %s' %nome)
                jogoAcontecendo = False
            else:
                if verificaVelha(tabuleiro):

                    desenhoDoTabuleiro(tabuleiro)
                    print('Deu velha!')
                    break
                else:
                    vez = Computador

        else:

            jogada = jogadaComputador(tabuleiro, computadorlet)
            defineJogada(tabuleiro, computadorlet, jogada)

            if verificaVencedor(tabuleiro, computadorlet):
                posicaoTabuleiro()
                desenhoDoTabuleiro(tabuleiro)
                print('Vencedor: Computador')
                jogoAcontecendo = False
            else:
                if verificaVelha(tabuleiro):

                    desenhoDoTabuleiro(tabuleiro)
                    print('Deu velha!')
                    break
                else:
                    vez = nome

    if not jogarNovamente():
        break

I would like someone to explain to me what mistake I’m getting, and how I can fix it.

1 answer

1

The error message you have is very clear: when trying to access the list espaco, the variable jogada that you use as index contains None instead of a whole.

So just follow where you call this function, and you will find that in the computer move, sometimes you will catch the return of this function:

def escolheJogadaAleatoriaDaLista(espaco, listaDeJogadas):

    jogadasPossiveis = []
    for i in listaDeJogadas:
        if temEspacoLivre(espaco, i):
            jogadasPossiveis.append(i)

    if len(jogadasPossiveis) != 0:
        return random.choice(jogadasPossiveis)
    else:
        return None

And look there - there’s a condition in which she returns None. This causes your error. (If the board is not full yet, there may also be an error in your "possible moves").

Congratulations on the project. You could use a dictionary instead of a list, and keep the fixed coordinate scheme you are using - but there will be no blank positions in your "space" variable that has nothing to do with the game.

  • Good morning jsbueno, what would you recommend me to fill the return of the function with something that has the same craft as None? Because it is necessary to return None to check if the board is full, as well you must understand..

Browser other questions tagged

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