"list indices must be integers or slices, not NoneType"

1

I'm trying to develop a game of old in python, which receives a user who will play against the computer, the output should tell the winner of the game or if it got old. Almost everything is correct, except when the game gets old, because I get the following error:

  

File "C: \ Users \ Pedroh \ Desktop \ 0.py old game", line 244, in       definePlay (board, computer, play)
    File "C: \ Users \ Pedroh \ Desktop \ 0.py old game", line 99, in
   define game       space [move] = letter   TypeError: list indices must be integers or slices, not NoneType

Here's 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 clarify what error I am getting, and how can I fix it.

    
asked by anonymous 17.11.2017 / 00:55

1 answer

1

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

Then just follow where you call this function, and you will find that in the move of the computer, sometimes you will get 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 - has a condition where it returns None . This causes your mistake. (If the board is not full yet, there may also be an error in your "possible plays").

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.

    
17.11.2017 / 12:42