Ошибка индекса: "за пределами" python Othello
Я получаю ошибку индекса за пределами допустимого диапазона, хотя я думаю, что я убедился, что он не отправляет ничего, что выходит за границы. Я добавил функцию печати, и она не распечатывает 4, так как возникает ошибка. Так что не знаю, что здесь делать. В моем коде, очевидно, есть много других недостатков, но именно с этим я сейчас имею дело - в функции validMove, которая вызывается из move_left.
Вот мой код:
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
1 ответ
Вы печатаете на Строке 175 (что нормально до нее). После этого вы входите в цикл While в строке 176, а в строке 177 вы увеличиваете счетчик на 1, а в строке 178 вы добавляете 1 поверх уже увеличенного счетчика. Итак, когда цикл while проходит следующую итерацию, он теперь выходит за рамки. Вы можете узнать о поведении, добавив следующую строку после строки 178. Я думаю, вы сможете определить проблему.
print(adjacent) ## Add me after line 178
К сожалению, я не могу предложить больше или выявить другие проблемы, так как я не понимаю, как работает игра. Надеюсь, это поможет.