0

変数を 5 減らし、新しい変数を出力し、X 時間後に変数を再度増やして変数を出力しようとしています。これは、何人かの人々を遠ざけ、一定時間戻ってこない小さなテキストベースのゲーム用です。

import time

TimeReturned = time.time() + 5
Survivors = 10

Test = raw_input("Run Script?")
if Test == "Yes":
    print Survivors
    if TimeReturned > time.time():
        Survivors -= 5
        print Survivors
    Survivors += 5
    print Survivors

出力が 10, 5, 10 であるため、すぐに得られるのはすべて、時間をまったく遅らせません。これは私の最初の質問ですので、あいまいでしたら申し訳ありません。

  1. このコードが変数を即座に返す原因となっているのは何ですか?

  2. 残りの生存者を送り出すなど、スクリプトで他のことをしたい場合、このスクリプトの実行中にそれは可能ですか、それとも 5 秒待つ必要がありますか?

お待ち頂きまして、ありがとうございます:)

4

3 に答える 3

1

スクリプトを待機させるには、 を使用しますtime.sleep(num_seconds)time.time()現在の時刻を返すだけです。何も待たせることはありません。

一部のコードがスリープ状態であるにもかかわらず、他のコードが同時に実行され、別のことを実行している可能性があります。ただし、これを行うには、慣れるまでに時間がかかるスレッドを使用する必要があります。おそらく、このチュートリアルは役に立ちます。

編集:ああ、スレッドなしでこれを行うことも可能ですが、変数を注意深く追跡する必要があります。あなたは数学を少し台無しにしました。time.time() が 1000 のときにコードが実行されたとします。次にTimeReturned1005 です。ユーザーが入力するのに 1 秒かかったとしYesます。次に、if TimeReturned > time.time()チェックしますif 1005 > 1001。これは True です。本当に確認したかったのはif time.time() > TimeReturned、現在の時刻が より遅いかどうかですTimeReturned

また、スクリプトはインタラクティブではないため、進行状況を確認するのは困難です。このスクリプトを実行してみてください:

import time

survivors = 15
survivor_return_seconds = 10.0
time_survivors_left = None

while True:
    action = raw_input("Type 'x' to make survivors leave, ENTER to see how many are left: ")

    #check if survivors returned
    if time_survivors_left is not None:
        if time.time() >= time_survivors_left + survivor_return_seconds:
            survivors += 5
            time_survivors_left = None
            print "Survivors came back!"

    if action == 'x':
        if time_survivors_left is not None:
            print "Survivors already left! Wait a bit!"
        else:
            survivors -= 5
            time_survivors_left = time.time()

    print "There are %s survivors left." % (survivors,)
    if time_survivors_left is not None:
        print "5 survivors will return in %.2fs" % (
            time_survivors_left + survivor_return_seconds - time.time())

出力例:

Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 15 survivors left.
Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 15 survivors left.
Type 'x' to make survivors leave, ENTER to see how many are left: x
There are 10 survivors left.
5 survivors will return in 9.99s
Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 10 survivors left.
5 survivors will return in 9.05s
Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 10 survivors left.
5 survivors will return in 7.66s
Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 10 survivors left.
5 survivors will return in 6.45s
Type 'x' to make survivors leave, ENTER to see how many are left: x
Survivors already left! Wait a bit!
There are 10 survivors left.
5 survivors will return in 5.73s
Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 10 survivors left.
5 survivors will return in 4.15s
Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 10 survivors left.
5 survivors will return in 2.90s
Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 10 survivors left.
5 survivors will return in 1.72s
Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 10 survivors left.
5 survivors will return in 0.48s
Type 'x' to make survivors leave, ENTER to see how many are left: 
Survivors came back!
There are 15 survivors left.
Type 'x' to make survivors leave, ENTER to see how many are left: 
There are 15 survivors left.
Type 'x' to make survivors leave, ENTER to see how many are left: 
于 2013-03-12T14:55:18.690 に答える
0

でやりたいことができますTimer。指定された秒数実行された後、指定された機能を実行します。Aは、2番目のスレッドを使用する簡単な方法です。これが、モジュールTimer内にある理由です。threading

from threading import Timer
import time

Survivors = 10

def increase_survivors():
    global Survivors
    Survivors += 5

# start execution
print Survivors
Survivors -= 5

t = Timer(5, increase_survivors)
t.start()
for i in range(10):
    print Survivors
    time.sleep(1)

最後のビットは、それがどのように機能するかを示しています。ただし、そのステートメントよりも変数を管理するためのより良い方法がおそらくありglobalます-私はいくつかの提案を得ると確信しています。

于 2013-03-12T15:34:02.843 に答える
0

ええと...スクリプトを停止して待機させるために何もしませんでした。

if TimeReturned > time.time():

これは、条件が真であるかどうかを確認し、それに応じて処理を進めるだけで、待機するように指示するものではありません。

関数を使用してtime.sleep(secs)、コードの実行を目的の時間だけ停止する必要があります。

ただし、スリープ時間中は何も実行されないことに注意してください。そのため、一部のバックグラウンド プロセスを実行し続け、言及した人だけを待機させたい場合は、スクリプトのその部分を独自のスレッドで実行する必要があります。

于 2013-03-12T14:56:45.697 に答える