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. 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.
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