2016-07-26 34 views
3

私はプログラミングに慣れておらず、2秒ごとにスコアから1を差し引くカウンターを追加したいと考えています。申し訳ありません タイマーは、Pythonでスレッディングなし?

chr 
import random 
import time 
radians2 = None 
ans = None 
score = 0 

radians1 = ['0', 'π/6', 'π/3', 'π/4', 'π/2', '2π/3', '3π/4', '5π/6', 'π', '7π/6', '4π/3', '5π/4', '3π/2', '5π/3', '7π/4', '11π/6', '2π'] 
while radians2 == ans or ans == None: 

radians3 = (random.choice(radians1)) 
ans = input(radians3) 
if radians3 == '0': 
    radians2 = 0 

elif radians3 == 'π/6': 
    radians2 = 30 

elif radians3 == 'π/3': 
    radians2 = 60 

elif radians3 == 'π/4': 
    radians2 = 45 

elif radians3 == 'π/2': 
    radians2 = 90 

elif radians3 == '2π/3': 
    radians2 = 120 

elif radians3 == '3π/4': 
    radians2 = 135 

elif radians3 == '5π/6': 
    radians2 = 150 

elif radians3 == 'π': 
    radians2 = 180 

elif radians3 == '7π/6': 
    radians2 = 210 

elif radians3 == '4π/3': 
    radians2 = 240 

elif radians3 == '5π/4': 
    radians2 = 225 

elif radians3 == '3π/2': 
    radians2 = 270 

elif radians3 == '5π/3': 
    radians2 = 300 

elif radians3 == '7π/4': 
    radians2 = 315 

elif radians3 == '11π/6': 
    radians2 = 330 

elif radians3 == '2π': 
    radians2 = 360 
score = score + 1 

if radians2 == ans: 
    print('Correct!') 
    print "You've got %d in a row" % score 
print "You lose, the correct answer was %d" % radians2 
(私は私のスコアの増加を作るためにすぐに答えなければならないように)コードが /汚いの長さである場合、私は、私は基本的にのようなものを実行することを考え出し:

while 1: 
    time.sleep(2) 
    score = score - 1 

プログラムの残りの部分と同時に実行されることはなく、スレッド(これは代替手段と思われる)が非常に混乱しているだけです。

+1

申し訳ありませんが、「同時に」スレッドする必要があります。そして、はい、スレッドは混乱する可能性がありますが、それに潜って悪化しています。 –

+0

スレッドの代わりに - メインループ - はおそらくもっと混乱します。スレッディングはそれほど難しいことではありません。 –

+4

um、あなたは時間を測定できません( 'time.clock()'または 'datetime.datetime.now()')してから、ユーザに質問してから、違いは、答えに時間がかかります。スレッドやループは必要ありません。 –

答えて

1

次のコードを使用して新しいスレッドを開始し、その機能ロジックをrun()メソッドに記述することができます。

import threading 
import time 

class RepeatEvery(threading.Thread): 
    def __init__(self, interval): 

     threading.Thread.__init__(self)  
     self.interval = interval # seconds between calls 
     self.runable = True 

    def run(self): 
     global score # make score global for this thread context 
     while self.runable: 
      time.sleep(self.interval) 
      if self.runable:  
       score = score - 1 
       self.runable = False 

    def stop(self): 
     self.runable = False 

スレッド(self.runable = true)を実行可能であるので、2秒後に実行メソッド内1とループによってスコアをデクリメントするまでの上記のコードは繰り返します破壊し、終了します。

したがって、上記のスレッドを呼び出すには、これを実行します。

score_thread = RepeatEvery(2) 
score_thread.start()  

これはのinitスレッドのコンストラクタを呼び出しますし、2秒または任意の値、ここから渡されたとの間隔変数を初期化します。

スレッドを停止するには、stop()メソッドを呼び出します。

スレッドが実行を完了するまで待つためにjoin()メソッドを呼び出すこともできます。

score_thread.join() 

はとても混乱に見えません:)

+0

スレッドを呼び出そうとすると、RepeatEveryが定義されていないと表示されます。私はコードのどこにスタートラインを置くべきかわからない。 – Warstolrem

+0

はまだ答えを編集しました –

+0

まだ問題が発生しています、モジュールがない(スレッドがあります)とRepeatEveryが定義されていないと言います – Warstolrem

1

あなたが任意のスレッドを使用したくない場合、あなたは発電機の次のメソッドを呼び出すたびに、それは経過時間を得られますcorutineを使用することができます。

def timer(): 
    prev_time = new_time = 0 
    while True: 
     prev_time, new_time = new_time, time.clock() 
     time_delta = new_time - prev_time 
     yield time_delta 

>>> t = timer() 
>>> t.next() 
4.399568842253459e-06 
>>> t.next() 
1.7571719571481994 
>>> t.next() 
0.8449679931366727 
関連する問題