0

WASDプレーヤーからの入力を得るために、ゲームプロセスを停止せずにプレーヤーがキーを押す必要があるスネークゲームを作成しています。したがってinput()、ゲームが入力を取得するためにティックを停止するため、この状況には使用できません。

getch()エンターを押さなくてもすぐに入力できる機能を見つけたのですが、この機能もゲームのカチカチ音を止めて のような入力をしてくれますinput()getch()threading モジュールを使用して、別のスレッドで入力を取得することにしました。問題は、別のスレッドで getch() が機能しないことです。その理由はわかりません。

import threading, time
from msvcrt import getch

key = "lol" #it never changes because getch() in thread1 is useless

def thread1():
    while True:
        key = getch() #this simply is almost ignored by interpreter, the only thing it
        #gives is that delays print() unless you press any key
        print("this is thread1()")

threading.Thread(target = thread1).start()

while True:
    time.sleep(1)
    print(key)

では、なぜgetch()にあると役に立たないのthread1()でしょうか。

4

2 に答える 2

5

問題は、既存の変数を上書きするのではなく、key内部にローカル変数を作成していることでした。迅速で簡単な解決策は、内部でグローバルでthread1あることを宣言することです。keythread1

最後に、ロックの使用を検討する必要があります。必要かどうかはわかりませんが、key同時に印刷しながらスレッドに値を書き込もうとすると、おかしなことが起こるのではないかと思います。

作業コード:

import threading, time
from msvcrt import getch

key = "lol"

def thread1():
    global key
    lock = threading.Lock()
    while True:
        with lock:
            key = getch()

threading.Thread(target = thread1).start()

while True:
    time.sleep(1)
    print(key)
于 2012-12-26T17:30:38.653 に答える
0

getchを使ってみましたが、うまくいきませんでした...(ここではwin7)。

tkinterモジュールを使ってみることができます//それでもスレッドで実行させることはできません

# Respond to a key without the need to press enter
import tkinter as tk    #on python 2.x use "import Tkinter as tk"

def keypress(event):
    if event.keysym == 'Escape':
        root.destroy()
    x = event.char
    if x == "w":
        print ("W pressed")
    elif x == "a":
        print ("A pressed")
    elif x == "s":
        print ("S pressed")
    elif x == "d":
        print ("D pressed")
    else:
        print (x)

root = tk.Tk()
print ("Press a key (Escape key to exit):")
root.bind_all('<Key>', keypress)
# don't show the tk window
root.withdraw()
root.mainloop()

Michael0x2aが言うように、ゲーム作成用に作成されたライブラリ(pygameまたはpyglet)を使用してみてください。

@EDIT @ Michael0x2a:コードが機能してもよろしいですか?何を押しても、常に同じキーが出力されます。

@ EDIT2:ありがとう!

于 2012-12-26T17:29:51.813 に答える