简体   繁体   English

索引错误:“越界” python Othello

[英]Index error: "out of bounds" python Othello

I`m getting index error out of bounds even though I think I´ve made sure it doesn´t send in anything that is out of bounds.尽管我认为我已经确保它不会发送任何超出范围的内容,但我仍然收到超出范围的索引错误。 I´ve added a print-function and it does not print out 4, as the error is complaining about.. So not sure what to do here.我添加了一个打印功能,它没有打印出 4,因为错误正在抱怨......所以不知道在这里做什么。 There are obviously many other flaws in my code, but this is the one I´m dealing with right now -- in the function validMove which is called from moves_left.我的代码中显然还有许多其他缺陷,但这是我现在正在处理的缺陷——在从 move_left 调用的函数 validMove 中。

Here is my code:这是我的代码:

import numpy as np 
size = input ("Welcome to Othello! Please choose size of board: ")

def makeBoard(size):
    board = np.zeros((size, size))
    first = int((size/2)-1)
    second = int(size/2)
    board[first][first] = 1
    board[first][second] = 2
    board[second][first] = 2
    board[second][second] = 1
    print(board)
    return board

def make_a_move(board, player, size):
    accepted = moves_left(board, player, int(size))
    while accepted:
        print("Player", player)
        block = input("Choose where to put chip: ")
        choice_row, choice_col = block[0], block[1]
        if valid_input(choice_row, choice_col, int(size)):
            choice_row, choice_col = int(block[0])-1, int(block[1])-1
            flipList = validMove(choice_row, choice_col, board, player)
        else:
            continue 
        if allowed_input(flipList, choice_row, choice_col, board):
            pass
        else:
            continue
        flipChips(board, flipList, player, choice_row, choice_col)
        return board

def valid_input(choice_row, choice_col, size): 
    try:
        choice_row = int(choice_row)
        choice_col = int(choice_col)
    except:
        print("You need to choose a positive number. ")
        return False
    if choice_row <= size and choice_col <= size: 
        return True
    else:
        print("You need to choose a row and column within the board. ")
        return False 
    return True

def isOnBoard(row, col, size): 
    if 0 <= row <= size-1 and 0 <= col <= size-1:
        return True
    else:
        return False

def allowed_input(flipList, choice_row, choice_col, board):
    if board[choice_row][choice_col] != 0:
        print("There is already a chip at this block. Choose an empty block. ")
        return False
    elif len(flipList) == 0:
        print("This is not a valid move. Place your chip so you can flip others. ")
        return False
    else:
        return True

def moves_left(board, player, size):
    for row_element in range(size): 
        for col_element in range(size):
            flipList = validMove(row_element, col_element, board, player) 
            if len(flipList) != 0:
                return True 
    print("There are no valid moves for player", player, "now. Wait your turn. ")
    return False


def validMove (row, col, board, player):
    #player 1: white or 2: black
    flipList = []
    otherplayer = 2 
    if player == 2:
        otherplayer = 1

    adjacent = (row, col+1) 
    counter = 0
    if isOnBoard(adjacent[0], adjacent[1], int(size)):
        while board[adjacent[0]][adjacent[1]] == otherplayer:
            counter += 1
            adjacent = (row, col+1+counter)
        if isOnBoard(adjacent[0], adjacent[1], int(size)) and board[row][col+counter+1] == player:
            for i in range(counter):
                flipList.append((row, col + i + 1))

    adjacent = (row, col - 1)
    counter = 0
    #if (col-1) != -1:
    if isOnBoard(adjacent[0], adjacent[1], int(size)):
        while board[adjacent[0]][adjacent[1]] == otherplayer:
            counter += 1
            adjacent = (row, col - 1 - counter)
        if isOnBoard(adjacent[0], adjacent[1], int(size)) and board[row][col-counter-1] == player:
            for i in range(counter):
                flipList.append((row, col - i - 1))

    adjacent = (row + 1, col)
    counter = 0
    if isOnBoard(adjacent[0], adjacent[1], int(size)):
        while board[adjacent[0]][adjacent[1]] == otherplayer:
            counter += 1
            adjacent = (row  + 1 + counter, col)
            if isOnBoard(adjacent[0], adjacent[1], int(size)) and board[row  + 1 + counter][col] == player:
                for i in range(counter):
                    flipList.append((row + i + 1, col))

    adjacent = (row - 1, col)
    counter = 0
    if isOnBoard(adjacent[0], adjacent[1], int(size)):
        while board[adjacent[0]][adjacent[1]] == otherplayer:
            counter += 1
            adjacent = (row - 1 - counter, col)
            if isOnBoard(adjacent[0], adjacent[1], int(size)) and board[row - 1 - counter][col] == player:
                for i in range(counter):
                    flipList.append((row - i - 1, col))

    adjacent = (row + 1, col + 1) 
    counter = 0
    if isOnBoard(adjacent[0], adjacent[1], int(size)):
        print(adjacent[0], adjacent[1])
        while board[adjacent[0]][adjacent[1]] == otherplayer: #THIS IS LINE 176
            counter += 1
            adjacent = (row + 1 + counter, col + 1 + counter)
            if isOnBoard(adjacent[0], adjacent[1], int(size)) and board[row + 1 + counter][col + 1 + counter] == player:
                for i in range(counter):
                    flipList.append((row + i + 1, col + i + 1))

    adjacent = (row + 1, col - 1)
    counter = 0
    if isOnBoard(adjacent[0], adjacent[1], int(size)):
        while board[adjacent[0]][adjacent[1]] == otherplayer:
            counter += 1
            adjacent = (row + 1 + counter, col - 1 - counter)
            if isOnBoard(adjacent[0], adjacent[1], int(size)) and board[row + 1 + counter][col - 1 - counter] == player:
                for i in range(counter):
                    flipList.append((row + i + 1, col - i - 1))

    adjacent = (row - 1, col - 1)
    counter = 0
    if isOnBoard(adjacent[0], adjacent[1], int(size)):
        while board[adjacent[0]][adjacent[1]] == otherplayer:
            counter += 1
            adjacent = (row - 1 - counter, col - 1 - counter)
            if isOnBoard(adjacent[0], adjacent[1], int(size)) and board[row - 1 - counter][col - 1 - counter] == player:
                for i in range(counter):
                    flipList.append((row - i - 1, col - i - 1))


    adjacent = (row - 1, col + 1)
    counter = 0
    if isOnBoard(adjacent[0], adjacent[1], int(size)):
        while board[adjacent[0]][adjacent[1]] == otherplayer:
            counter += 1
            adjacent = (row - 1 - counter, col + 1 + counter)
            if isOnBoard(adjacent[0], adjacent[1], int(size)) and board[row - 1 - counter][col + 1 + counter] == player:
                for i in range(counter):
                    flipList.append((row - i - 1, col + i + 1))

    return flipList

def flipChips(board, flipList, player, choice_row, choice_col):
    if player == 2:
        board[choice_row][choice_col] = 2
        for element in flipList:
            board[element[0]][element[1]] = 2
    if player == 1:
        board[choice_row][choice_col] = 1
        for element in flipList:
            board[element[0]][element[1]] = 1
    print(board)
    return board

def countChips(board):
    blackChips = []
    whiteChips = []
    for list in board:
        for brick in list:
            if brick == 2:
                blackChips.append(brick)
            if brick == 1:
                whiteChips.append(brick)
    print("Black Chips:", len(blackChips), "White Chips:", len(whiteChips))
    if len(blackChips)>len(whiteChips):
        winner = "black"
    else:
        winner = "white" 
    return winner


def main():
    board = makeBoard(int(size))
    print("")
    first_player = 2
    second_player = 1
    round = 0
    while moves_left(board, first_player, int(size)) or moves_left(board, second_player, int(size)):
        if round % 2 == 0:
            board = make_a_move(board, first_player, size)
        else:
            board = make_a_move(board, second_player, size)
        round += 1
    winner = countChips(board)
    print("The game is over. The winner is", winner)

main()

This is the error I´m getting:

1 1
1 1
1 2
Traceback (most recent call last):
  File "reversi.py", line 289, in <module>
    main()
  File "reversi.py", line 284, in main
    board = make_a_move(board, second_player, size)
  File "reversi.py", line 41, in make_a_move
    accepted = moves_left(board, player, int(size))
  File "reversi.py", line 99, in moves_left
    flipList = validMove(row_element, col_element, board, player) 
  File "reversi.py", line 176, in validMove
    while board[adjacent[0]][adjacent[1]] == otherplayer:
IndexError: index 4 is out of bounds for axis 0 with size 4

You are printing at Line 175 (which is fine till there).您正在第 175 行打印(直到那里都很好)。 After that you are entering a While loop in Line 176 and in Line 177 you are incrementing the Counter by 1 and in line 178 you are adding 1 on top of the already incremented Counter.之后,您将在第 176 行和第 177 行中输入一个 While 循环,将 Counter 递增 1,在第 178 行中,您将在已递增的 Counter 之上添加 1。 So when the while loop is going through next iteration it is out of bounds now.因此,当 while 循环进行下一次迭代时,它现在越界了。 You can know the behavior by adding the following line after line 178. I think you will be able to spot the problem.您可以通过在第 178 行之后添加以下行来了解行为。我想您将能够发现问题。

print(adjacent) ## Add me after line 178

I am sorry I can not suggest more or spot more problems since I don't understand how the game operates.很抱歉,我无法提出更多建议或发现更多问题,因为我不了解游戏的运作方式。 Hope it helps.希望能帮助到你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM