質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

4652閲覧

プログラミングにおける同時入力について

okaki_net

総合スコア14

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/20 06:04

プログラミングにおける同時入力について

python3.7でゲームの作成をしようと考えています。

わたくし、プログラミング初心者の学生です。
現在初歩的なところからパイソンでのプログラミングを独学で勉強しています。

プログラミングについて私がわかってることといえば、コードはメイン文を上から順に実行されるということくらいです。

パイソンのキー入力といえばinput()関数や、モジュールを追加してのgetch() (エンターキーを不要とする1文字入力)がありますよね。

本題ですが、上から順に実行される上でどのような処理を施したら同時入力が可能になるのでしょうか?
調べ方もよくわからないので、その仕組みや検索ワードなどが知りたいです。

例としてはゲームのスーパーマリオで右移動("→キー"を押す)をしながらジャンプキー("スペースキー"を押す)という処理がありますが、どのように実装されているのか気になっています。

簡単なところから詳しいところまでなんでもいいので、回答宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Pythonでゲーム向き、すなわちキーリピートメッセージ無視してキー同時押しを取得、判定できるプラットフォーム非依存、汎用的な手法は意外となかったと記憶しています。
Windows限定なら以下のようなコードで可能ですが。
参考:How do I detect key presses and mouse clicks in Python?

Python

1def getKeyState(): 2 import win32api 3 VK_KEYS = [0x26,0x25,0x27,0x28] # 判定対象キーコード。上左右下 4 VK_STS = { 0x26:0x01, 0x25:0x02, 0x27:0x04, 0x28:0x08} # 同時押し結果はビットで返すように 5 ret = 0 6 for i in VK_KEYS: 7 if win32api.GetAsyncKeyState(i): 8 ret |= VK_STS[i] 9 return ret 10 11 12while True: 13 s = '' 14 keys = getKeyState() 15 if keys & 0x01: s += '上' 16 if keys & 0x08: s += '下' 17 if keys & 0x02: s += '左' 18 if keys & 0x04: s += '右' 19 if len(s) > 0: 20 print(s)

投稿2019/02/20 07:35

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

基本的に

if(スペースキー押下){ ジャンプ() } if(十字左キー押下){ x += 3; } if(十字右キー押下){ x -= 3; }

でジャンプしたまま移動は動くはずです。
if文を排他的にすればAキーを押している間はBとXは動かないとかも可能です。

投稿2019/02/20 06:23

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

okaki_net

2019/02/20 06:38

ひとえに「同時入力」といっても、実際に同時かどうかを判断させる必要はなくて、二重if文にするなどして入力に順番を持たせて、分岐させればいいってことなのでしょうか。 試しに一度プログラムを作って動かしてみます!理想通りに実行できれば成功ですね( ´∀`)
stdio

2019/02/20 07:06

そうですね。 二重if文なんて使わなくても「And」を使えば一行で済むけど... ただ格ゲーのようなコマンドは別。 あれは連想配列などで、次に押されるキーのタイミングを監視する必要があるから、管理が大変よ。 まぁ、しばらくはやらないだろうけど...
guest

0

コードは順番に実行され、キー入力も順番になされます。
が、その速度はクソ早いため、ニンゲンの感覚では同時入力に見えてしまいます。
ということで、そんな心配はいりません。

#って、ファミコンのコントローラはシリアル通信してて、それこそキー入力を同時には送ってませんぜw

投稿2019/02/20 06:14

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

okaki_net

2019/02/20 06:40

キーボードでの入力を前提に話していたので、シリアル通信という存在をまず知らなかったですし頭にもありませんでした! ゲームコントローラーがどんな出力をしているのかも調べてみようと思います! シリアル通信について学べるいいサイトなどご存知でしょうか?
y_waiwai

2019/02/20 07:01

シリアル通信と言っても一般によく行われているものではなく、SPIに近いようなオリジナルの通信なんで、そういうのは現物見るのが一番です ファミコンのコントローラをばらして、本体との接続線にどういう信号が流れているか、オシロスコープで見てみましょう。 そんな難しいことはしていない(というより難しいことはできない)ので、どういうふうに送ってるのかすぐわかると思います
stdio

2019/02/20 07:17

オシロスコープなんて、一般の家庭にはありませんよ。普通。 私も、高校時代に使ってましたけど...
y_waiwai

2019/02/20 07:27

高校のときにバイトして、5万円で10Mオシロをかってきてですね(トオイメ
stdio

2019/02/20 07:58

高校でオシロスコープ買うとか、すごいですね... 高専か工業系の高校通ってましたか? ちなみに私は工業系の高校卒ですが、オシロスコープ持ってないですね。 ポケコンなら持ってますが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問