2017-06-29 7 views
0

xをクリックするとリストのスペースが埋まり、リストのza posをタップすると機能し、リストをタップすると機能するインベントリのコードを作成していますcリストが印刷されます。私はコードが非効率的であることを知っていますが、この段階でのテスト目的のためだけにif文にどの程度深く入り込むのを無視します。とにかく、if inv [0]がnoneの行で、そのセクションのすべての行にエラーが発生します。エラーは '範囲外のリストインデックス'です。誰かが私が間違っていることを知っていますか?'リストインデックスが範囲外です'エラー

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

コードには多くの問題があります。 noneをチェックし、コード内でNoneを置き換えます。あなたの最も内側にインデントされたelse条件に代入演算子 "="がありません。 'inv'は空のリストであり、反復するものは何もないので、indexErrorを取得します。 –

+0

@ d-coderああ、良いキャッチ。 –

答えて

0

を押したときは、空のリストを初期化しています最初は何も要素がありません。イベントキーK_xがトリガーされると、最初の条件がチェックされます。if inv[0] == None: の場合、if inv[4] == Noneをチェックすると5つの要素の範囲外になるため、さらに悪化します。

ただし、リストは空のため、0番目の要素はありません。あなたが代わりにやるべきことは、このような5つのNone要素を持つリストを作成することです:

inv = [None] * 5 

コメントのdコーダによって指摘されているように別のエラーという最も内側にある2番目のコードリストでは、声明ifは構文上正しくありません。これはすべきです

+0

ありがとうございました!まだ試してみませんでしたが、正確であるように見えますし、試してみて、効果があるかどうかをお知らせします。 –

+0

途中で 'inv = [None] * 5'にする必要があります。 – DaveBensonPhillips

+1

@DaveBensonPhillipsありがとうございました! –

0

私は興味深いです、あなたはスタックをしていますが、このゲームでスタック操作を使用していません。前の投稿にスタ​​ック操作を示しました。

私はちょうど(whateverIsBeingPushed)をinv.push使用するほとんどのオープンスポットにプッシュし、あなたにinv.pop()コマンドを与えた

これは大幅にあなたのコードを減らすでしょう。

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) 
関連する問題