2016-05-19 8 views
1

現在、BBCマイクロビット用の小さな2ボタンゲームを開発しようとしています。 micro:kitは広く入手できないので、私は自分の問題を詳細に説明しようとします。MicroPythonでマイクロビットモジュールを使用しているときのインデックスエラー

私はプレーヤーのコントロールを作成しようとしています。移動可能なライトは、グリッドの最後の行に貼り付けられています。 Aボタンはライトを1列左に移動させ、Bボタンはライトを1列右に移動させます。

Iは行列に対する(PLAYER_LOC位呼ばれる)5枚の別々の画像、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  

ボタンことによりdisplay.show(player_locs [player_index])表示画像player_loc1代わりにplayer_loc2を行う、(2に等しい)player_indexから1を引くことになっています。
Bボタンは逆の動作を行い、1つ追加すると、player_loc3が表示されます。


私がいる問題は、私はAまたはBボタンを押したとき、私ははIndexErrorを取得し、リストインデックスは、17行目で、範囲外のdisplay.show(player_locs [player_index])であるということです。インデックスは決して範囲外であるべきではありません。 player_locsのリストには、0から4の範囲のインデックスがあります。インデックス1と3は範囲外ですが、範囲外のIndexErrorメッセージが表示されます。 player_indexを削除して0〜4の整数で実行すると、動作します。


これは、ボタンを押さずにスクリプトを実行したときの画像です。ボタンを押すとエラーメッセージが表示されます。 ご協力いただければ幸いです。あなたがいずれかのボタンを押しながら

LEDpicture

+0

あなたは 'if'文を渡していますか? 'button_x.is_pressed()'は実際に期待どおりに動作していますか?さらに、 '.is_pressed'は応答のためのループを保持していますか、それとも単にループを実行させますか? – Pouria

答えて

0

あなたは、遅延なく、whileループのis_pressedメソッドを使用しているので、基本的に何が起こるかループが本当に速い実行し、数回反復するのに十分な時間を持っているということですたとえあなたが本当に素早く報道機関を知っていたとしても。これらの繰り返しのそれぞれで、ループはボタンの状態を押された状態で読み込み、player_indexを有効な範囲外にするのに十分な時間を増減します。

また、was_pressedを使用することもできます。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 
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() 
関連する問題