0

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
  • I am guessing that .. the number of rows in the board is 4 while adjacent [0] is also 4. So when you are running, it becomes board[4][adjacent[1]] and that's why Out of Bound error. I am sorry this is a guess .. I have not been able to spend enough time with the code. – Amit Jan 05 '20 at 10:04
  • Yeah, but as you can see the terminal prints out: 1 1 1 1 1 2 from the print(adjacent[0], adjacent[1]) from inside the if-string, which means that 4 is never passed into the if-string. So I don´t understand why it says that there is any index 4. The isOnBoard function makes sure that anything that is out of bounds is not passed into the indexes. – Eva Narvestad Jan 05 '20 at 10:22
  • 1
    Ok .. What was the value of size (as input) ...so that I can try to replicate the error here? .. In other words ..how can I replicate the error? – Amit Jan 05 '20 at 10:39
  • The size = 4 :) – Eva Narvestad Jan 05 '20 at 12:09

1 Answers1

0

You are printing at Line 175 (which is fine till there). 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. So when the while loop is going through next iteration it is out of bounds now. You can know the behavior by adding the following line after line 178. I think you will be able to spot the problem.

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.

Amit
  • 2,018
  • 1
  • 8
  • 12