目前正试图为BBC micro:bit开发一款小型双键游戏。由于micro:kit没有广泛使用,我将尝试详细解释我的问题。
我正在尝试为播放器创建一个控件,一个可移动的'粘在网格最后一行的灯光。 A按钮应该将光线向左移动一列,B按钮应该将光线向右移动1列。
我为矩阵创建了5个单独的图像(称为 player_loc#),每个图像都是LED的可能位置。
from microbit import *
import random
player_index = 2
player_loc0 = Image('00000:00000:00000:00000:50000')
player_loc1 = Image('00000:00000:00000:00000:05000')
player_loc2 = Image('00000:00000:00000:00000:00500')
player_loc3 = Image('00000:00000:00000:00000:00050')
player_loc4 = Image('00000:00000:00000:00000:00005')
player_locs = [player_loc0, player_loc1, player_loc2, player_loc3, player_loc4]
# Indexes 0 1 2 3 4
while True:
display.show(player_locs[player_index])
if button_a.is_pressed():
player_index += 1
elif button_b.is_pressed():
player_index -= 1
A按钮应该从 player_index (等于2)中减去1,从而使 display.show(player_locs [player_index])显示图像 player_loc1 而非 player_loc2 。
B按钮相反,它会添加一个,这将导致显示 player_loc3 。
我遇到的问题是,当我按下A或B按钮时,我得到一个IndexError,列表索引超出范围,在第17行, display.show(player_locs [player_index]) 即可。该指数绝不应超出范围。在列表 player_locs 上,我的索引范围为0-4。索引1和3不在范围之外,但它显示IndexError超出范围的消息。当我删除player_index,并使用任何整数0-4运行它,它的工作原理。
这是我在不按任何按钮的情况下运行脚本的图像。按下按钮后,会显示错误消息。 任何帮助将不胜感激。
答案 0 :(得分:0)
你在while循环中使用is_pressed方法没有任何延迟,所以基本上会发生的事情是循环执行得非常快,并且有足够的时间在按下任何按钮时迭代几次,甚至如果你觉得媒体真的很快在每次迭代中,循环都会按下按钮状态,并且会将player_index增加或减少足够的次数,使其超出有效范围。
另外,您可以使用was_pressed跟踪单个印刷机,并按预期方式工作。
如果您想确保您的索引永远不会超出范围,您甚至可以添加额外的检查以确保程序不会崩溃:
while True:
display.show(player_locs[player_index])
if button_a.was_pressed() and player_index < (len(player_locs) - 1):
player_index += 1
elif button_b.was_pressed() and player_index > 0:
player_index -= 1
答案 1 :(得分:0)
我是业余爱好者,所以我还在学习。我废弃了我的旧代码,因为我很早就被卡住而感到沮丧。我提出了一个更“基于整数”的脚本,而不是使用更改的预设图像。我认为使用简单的整数将允许更容易的控制流使用,整数(因此图像)的操纵,而不是必须改变和测试图像。我也想用这两个按钮创建一个计算器,所以建议会派上用场。谢谢你帮助我!
如果您想知道,这是更新的代码。我目前正在尝试添加随机敌人/墙一代:
from microbit import *
import random
game_over == False
player_x = 2
player_y = 4
#starting coords for 'player' pixel
light = 5
wall_light = 7
#brightness. self explanatory
wall_pos_x = [0, 1, 2, 3, 4]
wall_y = 0
#all possible coords of wall. y coords
#are changed in function
#generates enemy wall with a randomly generated hole
def enemy_wall():
open_x = random.randint(0,4)
open_y = 0
for wall_xs in range(open_x-1, open_x, -1)
wall_pos_x[wall_xs]
pass
#for loops will iterate over all possible x coords except
#the open hole's coords. for loop will use iteration and
#display all possible x coords except open_x.
def player(x, y, bright):
if x <= -1:
x = 0
elif x >= 5:
x = 4
display.set_pixel(x,y,bright)
return x
#if x coord is +- 1 more than available coords,
#doesnt move/change position at edge
#updated newer player control. push of button changes x coord by -+ 1
#cannot change y coord
while game_over != True:
player(player_x,player_y,light)
sleep(750)
#player coords re/displayed, and button cooldown 750ms
if button_a.is_pressed():
player_x = player(player_x-1,player_y,light)
display.clear()
#runs through player(), then clears display of
#previous pixel *player*.
elif button_b.is_pressed():
player_x = player(player_x+1,player_y,light)
display.clear()