2017-05-25 19 views
0

私はテキストゲーム用のリアルタイムバトルシステムを作成しようとしています。 NPCが同じことをしている間に、プレイヤーが行動して再び行動できるようになるまで数秒待たなければならないようにしたい。Pythonでスレッドを再利用

私は小さな例を書いた:

import threading 
import time 

def playerattack(): 
    print("You attack!") 
    time.sleep(2) 


def npcattack(): 
    while hostile == True: 
     print("The enemy attacks!") 
     time.sleep(3) 

p = threading.Thread(target=playerattack) 
n = threading.Thread(target=npcattack) 

hostile = False 

while True: 
    if hostile == True: 
     n.start() 
    com = input("enter 'attack' to attack:") 
    if 'attack' in com: 
     hostile = True 
     p.start() 

の例では、最初の攻撃のために正常に動作します: 私は「攻撃」を入力し、敵対的なフラグがTrueに設定されている、NPCの攻撃スレッドが開始され、私は 'RuntimeError:スレッドは一度しか起動できません'というメッセージが表示されることがあります。

エラーを発生させずにそのスレッドを再利用する方法はありますか?それとも私はこれについて間違っているのだろうか?

+1

はい。あなたはスレッドなしでこのことを書いた方が良いです。 – pvg

+1

この例題でスレッドが必要な理由をラバーダックに説明できますか? – zwer

+0

あなたはPythonで直接スレッドを殺すことはできませんが、マルチスレッドではスレッドによく似ています。スレッドの使用方法を学ぶためにスレッドを使用している可能性があります。 – thesonyman101

答えて

0

問題はスレッドがすでに実行されているため、whileループがn.start()を再度呼び出すため、実行中のスレッドを再び開始できないということです。

スレッドが停止した後でも、スレッドインスタンスを再初期化してから再起動する必要があります。古いインスタンスを開始することはできません。

while Trueループでは、スレッドを複数回起動しようとしています。スレッドインスタンスが起動していない場合は、スレッドが実行中であるかどうかを確認してください。

import threading 
import time 

def playerattack(): 
    print("You attack!") 
    time.sleep(2) 


def npcattack(): 
    while hostile: 
     print("The enemy attacks!") 
     time.sleep(3) 

p = threading.Thread(target=playerattack) 
n = threading.Thread(target=npcattack) 

hostile = False 

while True: 
    if hostile and not n.is_alive(): 
     try: 
      n.start() 
     except RuntimeError: #occurs if thread is dead 
      n = threading.Thread(target=npcattack) #create new instance if thread is dead 
      n.start() #start thread 

    com = input("enter 'attack' to attack:") 

    if 'attack' in com: 
     hostile = True 
     if not p.is_alive(): 
      try: 
       p.start() 
      except RuntimeError: #occurs if thread is dead 
       p = threading.Thread(target=playerattack) #create new instance if thread is dead 
       p.start() 
+0

これは完璧です! 私は同じ正確なスレッドを再利用しないでしょう、私は同じ機能を実行する新しいスレッドを生成するでしょう。 ありがとう、本当にありがとう! 編集:また、私はあなたの答えを投票しようとした、それはそれを記録したが、私は15未満の評判を持っているため、それを公開しません。ごめんなさい! –

+0

はい、同じスレッドを何度も何度も何度も再利用することはできません。新しいスレッドインスタンスを初期化し、必要に応じて異なる変数で実行する必要があります。 – Harwee

+0

'もし敵対的なら== True'は冗長です。 'もし敵対的ならば'を使うだけです。 – zondo

関連する問題