我为库存制作代码,当我点击x时,列表中的空格被填充,当我点击z时,列表中的pos被删除,当我点击c时,列表被打印。我知道代码效率低下,但它只是用于此阶段的测试目的,因此忽略它在语句中的深度。无论如何,如果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 :(得分:0)
您首先在没有任何元素的情况下初始化一个空列表。触发事件键K_x
时,会检查第一个条件:if inv[0] == None:
键K_z
的情况更糟,因为当您检查{{{}时,您将超出5个元素的范围1}}。
然而,问题是,没有第0个元素,因为你的列表是空的。你要做的是创建一个包含5个if inv[4] == None
元素的列表:
None
d-coder在评论中指出的另一个错误是,在第二个代码清单中,最里面的inv = [None] * 5
中的语句在语法上是不正确的。它应该是
if
答案 1 :(得分: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)