2017-06-29 168 views
0

我正在编制库存代码,当我点击x,列表中的空间被填充,当我点击列表中的za pos被删除时,以及当我点击c列表被打印。我知道代码效率很低,但这只是为了在这个阶段进行测试,所以忽略if语句的深度。无论如何,如果inv [0]没有行以及该部分中的所有内容,我在我的错误。错误是'列表索引超出范围'有没有人知道我做错了什么?'列表索引超出范围'错误

import pygame, sys 
    pygame.init() 

    i= 1 

    inv = [] 
    #Code below will add an item to that list. 
    w, h = 1000, 600 
    DISPLAYSURF = pygame.display.set_mode((w, h)) 
    while True: 
      DISPLAYSURF.fill((255, 255, 255)) 
      for event in pygame.event.get(): 
        if event.type == pygame.QUIT: 
          pygame.quit() 
          sys.exit() 
      elif event.type == pygame.KEYDOWN: 

这是为了填补名单

    if event.key == pygame.K_x: 
          if inv[0] == None: 
            inv[0] = 'an_item' 

          elif inv[1] == None: 
            inv[1] = 'an_item' 

          elif inv[2] == None: 
            inv[2] = 'an_item' 

          elif inv[3] == None: 
            inv[3] = 'an_item' 

          elif inv[4] == None: 
            inv[4] = 'an_item' 

          else: 
            print("No inventory space") 

这是当按下一键清空列表中的位置的位置。我知道这是低效的,但我不认为它应该影响它:

    if event.key == pygame.K_z 
          if inv[4] == none: 
            if inv[3] == None: 
              if inv[2] == None: 
                if inv[1] == None: 
                  if inv[0] == None: 
                    print('Nothing to drop!') 
                  else: inv[0] None 

                else: 
                  inv[1] = None 
              else: 
                inv[2] = None 
            else: 
              inv[3] = None 
          else: 
            inv[4] = None 

这句话是打印列表,当按下C键

    if event.key == pygame.K_c: 
          print(inv) 
+0

从您发布的代码中,您可以通过inv [0]访问空列表'inv'。不过,请发布完整的追溯。 –

+0

你的代码有很多错误。检查没有,并在您的代码中替换为无。在内部最缩进的else条件中缺少赋值运算符“=”。 'inv'只是空列表,没有什么可迭代的,所以你得到indexError。 –

+0

@ d-coder哦,很好。 –

回答

0

你初始化一个空列表一开始没有任何元素。当触发事件密钥K_x时,将检查第一个条件:if inv[0] == None:对于密钥K_z,情况更糟糕,因为当您检查if inv[4] == None时,您超出了5个元素的范围。

但是,事情是,没有第零个元素,因为你的列表是空的。你应该做的,而不是,是创建5个None元素像这样的列表:

inv = [None] * 5 

另一个错误,通过在评论d编码器指出,是在第二个代码清单,在最里面的声明if在语法上不正确。它应该是

inv[0] = None 
+0

非常感谢您的帮助!还没有尝试,但似乎准确,我会测试它,让你知道它是否工作。 –

+0

它应该是'inv = [None] * 5'顺便说一句 – DaveBensonPhillips

+1

@DaveBensonPhillips感谢您的发现! –

0

我很好奇,你在做一个堆栈,但不使用堆栈操作这个游戏。我在之前的文章中向您展示了堆栈操作。

我给你的inv.pop()命令,推到最开放的地区,仅有使用inv.push(whateverIsBeingPushed)

这将减少你的代码很大。

if event.key == pygame.K_x: 
    if len(inv) < 4: #inventory isn't full, 4 is max size of inventory. 
     inv.push("an_item")      
    else: #inventory == 4, therefore no space. 
     print("No inventory space") 
if event.key == pygame.K_z: 
    if len(inv) == 0: #length of inventory is 0, meaning no items to drop. 
     print("Nothing else to drop, inventory is already empty.") 
    else: 
     inv.pop() #removes the most recently added item (which is what your code is doing currently)