0

So I have created a game that places treasure chests and bandits within a grid and allows the player to move through it. Essentially, if the player lands on a treasure chest, which are randomly placed within the grid, their coin total goes up by 10, and if the player lands on a bandit, the coin total is reset to 0.

However, I have attempted to get the program to turn a specific treasure chest into a bandit if it has been visited 3 times. I have used the lists visit[] and visited[] to do so, however I keep getting the error:

IndexError: list index out of range

and I don't know why? I have attached all my code for reference and outlined the section that seems to be causing the problem. How do I get rid of the error so that the chest turns into a bandit after it's third visit?(on it's fourth)

Traceback: 
line 130, in <module>
    visits[i] += 1
IndexError: list index out of range

choice = 0
b = 0
player_location = ' X '
x = 8
y = 0
coins = 0
bandits = 5
treas_chests = 10
a = 1
import random
x_move = 0
y_move = 0
no_of_bands = 5
size_of_grid = 8
chests = []
bandits = []
size_of_grid_n = 0
visits = []
visited = []
def menu(): 
    print('If you would like to play the Treasure Hunt , press 1') 
    choice = input('If not, press any key to exit \n') 
    if choice == '1': 
        print('Great! You have made the right choice :)') 
    else: 
        print('Goodbye.') 
        quit() 
menu() 
def board(): 
    new_board = [ ]
    top_row = [' 1 ',' 2 ',' 3 ',' 4 ',' 5 ',' 6 ',' 7 ',' 8 ']

    new_board.append(top_row)

    for x in range(0, 8):
        row = [' 0 '] * size_of_grid
        new_board.append(row)

    return new_board

def print_board(b):
  row_numbers = [' ', '1', '2', '3', '4', '5', '6', '7', '8']
  i = 0
  for row in b:
    print (row_numbers[i], ''.join(row))
    i = i + 1
current_x_loc = 0
current_y_loc = size_of_grid

def update_board(b, current_y_loc, current_x_loc):
    #b[current_y_loc-y_move][current_x_loc+x_move] = player_location
    while (-1 >= current_y_loc-y_move) or (current_y_loc -y_move > size_of_grid):
        print('INVALID INPUT')
        get_move()
    while (-1 >= current_x_loc + x_move) or (current_x_loc + x_move > size_of_grid):
        print('INVALID INPUT')
        get_move()
    b[current_y_loc - y_move][current_x_loc + x_move] = player_location
    current_y_loc -= y_move
    current_x_loc += x_move
    print("current location = ", current_x_loc, current_y_loc)
    return current_y_loc, current_x_loc

def chests_and_bandits():
    num = 0
    while num < treas_chests:
        y_c = random.randint(1, size_of_grid)  
        x_c = random.randint(1, size_of_grid)
        location = [y_c, x_c]
        while (location in location) or (location == [size_of_grid, 0]):
            y_c = random.randint(1, size_of_grid)
            x_c = random.randint(1, size_of_grid)
            location=[y_c, x_c]
        chests.append(location)
        num = num + 1

    num = 0
    print(chests)
    while num < no_of_bands:
        y_b = random.randint(1, size_of_grid)
        x_b = random.randint(1, size_of_grid)
        location=[y_b, x_b]
        while (location in location) or (location in chests) or (location == [size_of_grid, 0]):
            y_b = random.randint(1, size_of_grid)
            x_b i= random.randint(1, size_of_grid)
            location = [y_b, x_b]
        bandits.append(location)
        num = num + 1
    print(bandits)

while a == 1:
    chests_and_bandits()
    def get_move():
        advice = 'Please enter your move in two integers, vertical, then horizontal, separated by a space.  Use positive numbers for up and right, negative for down and left.'
        example = 'For example, an input of \'2 2\' would be 2 moves vertically, and 2 moves horizontally.'
        move = input(advice + example)
        coor=move.split()
        while len(coor) != 2:
            print('Invalid input- too many or too few co-ordinates')
            print('')
            advice = 'Please enter your move in two integers, vertical, then horizontal, separated by a space.  Use positive numbers for up and right, negative for down and left.'
            example = 'For example, an input of \'2 2\' would be 2 moves vertically, and 2 moves horizontally.'
            move = input(advice + example)
            coor = move.split()
        move = move.split()
        y_move, x_move = move
        x_move = int(x_move)
        y_move = int(y_move)
        return x_move, y_move

    while True:
        new_board = board()
        current_y_loc, current_x_loc = update_board(new_board, current_y_loc, current_x_loc)
        print_board(new_board)
        print(' ')
        print(current_x_loc, current_y_loc)
        cur_loc = [current_x_loc, current_y_loc]

The section below is where the lists that are bringing up the error are used

        for i in range (0, len(chests)):
            if cur_loc == chests[i]:
                coins += 10
                print('You have found a treasure chest')
                print('Number of coins: ',coins)
                print('')
                visits[i] += 1
                if visits[i] > 3:
                    visited[i] = True
                    bandits.append(chests[i])
                    var = chests[i]
            for i in range(0, len(visited)):
                chests.remove
                if visits[i] == 3:
                    treas_chests -= 1
                    no_of_bands += 1
                    bandits.append(chests[i])
                    var = chests[i]
        for i in range (0, len(bandits)):
            if cur_loc == bandits[i]:
                coins = 0
                print('You have hit a bandit')
                print('Number of coins: ', coins)
                print('')


        x_move, y_move = get_move()
4
  • When I run your code, I get an infinite loop, with the explorer stuck at 0,8 Commented Apr 27, 2017 at 0:19
  • It seems that chests is bigger than visits Commented Apr 27, 2017 at 0:20
  • @Prune I think that's because you only ran the first part of the code, and left out the code after the blockquote Commented Apr 27, 2017 at 0:26
  • Got it. Close vote retracted. Commented Apr 27, 2017 at 1:26

1 Answer 1

1

You do the iteration over range (0, len(chests)), and after that get an error in line visits[i] += 1. Looks like chests and visits hasn't equal length. I can't see any appends to the visits list, so it's basically empty.

Also, you are mixing up the counters in a nested loop:

for i in range (0, len(chests)):
    ...
    # you override the i value here
    for i in range(0, len(visited)):

Just do inner loop other other counter, e.g. j:

for i in range (0, len(chests)):
    ...
    for j in range(0, len(visited)):

Also you're using the len(visited), but go over visits[i], but there is no guarantee that these two arrays are equal length.

Sign up to request clarification or add additional context in comments.

4 Comments

I don't think this is the problem - it looks like the visits list has no values and he is trying to increment the value of visits[i] when it doesn't exist. He mixes up counters and needs to fix that, since that will lead to a different error
@VMAtm I'm just a bit confused as to why the arrays have to be of equal length?
You are accesing one array by index from other, so they have to be equal. Right now one of them is empty
@VMAtm okay, I see. Thanks

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.