1

現在、BBC micro:bit 用の小さな 2 ボタン ゲームを開発しようとしています。micro:kit は広く利用できるわけではないので、私の問題を詳細に説明しようと思います。

グリッドの最後の行に固定されている「可動」ライトである、プレーヤーのコントロールを作成しようとしています。A ボタンはライトを 1 列左に移動し、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 から 1 を引いて( 2 に等しい)、それによってdisplay.show(player_locs[player_index])がplayer_loc2の代わりにimage player_loc1を表示することになっています。 B ボタンは反対のことを行い、1 つ追加します。これにより、player_loc3が表示されるはずです。


私が抱えている問題は、A または B ボタンを押すと、17 行目の display.show(player_locs[player_index])で IndexError, list index is out of range が発生することです。インデックスは決して範囲外であってはなりません。リストplayer_locsには、0 ~ 4 の範囲のインデックスがあります。インデックス 1 と 3 は範囲外ではありませんが、IndexError out of range メッセージが表示されます。player_index を削除し、整数 0 ~ 4 で実行すると動作します。


これは、ボタンを押さずにスクリプトを実行したときの画像です。ボタンを押すとすぐに、エラー メッセージが表示されます。どんな助けでも大歓迎です。

LED画像

4

2 に答える 2

0

素人なのでまだまだ勉強中です。早い段階で行き詰まってイライラしたので、古いコードを破棄しました。変化するプリセット画像を使用するのではなく、より「整数ベース」のスクリプトを思いつきました。単純な整数を使用すると、イメージを変更してテストするよりも、制御フローの使用、整数 (したがってイメージ) の操作が容易になると考えました。私もこれで2つのボタンを使って電卓を作ろうと思っていたので、アドバイスが重宝します。でも助けてくれてありがとう!


疑問に思っている場合に備えて、更新されたコードを次に示します。現在、ランダムな敵/壁の生成を追加しようとしています:

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()
于 2016-05-20T18:49:51.033 に答える