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

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

ただいまの
回答率

90.22%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 409

okaki_net

score 5

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

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

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

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

def getKeyState():
    import win32api
    VK_KEYS = [0x26,0x25,0x27,0x28] # 判定対象キーコード。上左右下
    VK_STS = { 0x26:0x01, 0x25:0x02, 0x27:0x04, 0x28:0x08} # 同時押し結果はビットで返すように
    ret = 0
    for i in VK_KEYS:
        if win32api.GetAsyncKeyState(i):
            ret |= VK_STS[i]
    return ret


while True:
    s = ''
    keys = getKeyState()
    if keys & 0x01: s += '上'
    if keys & 0x08: s += '下'
    if keys & 0x02: s += '左'
    if keys & 0x04: s += '右'
    if len(s) > 0:
        print(s)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

基本的に

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/20 15:38

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

    キャンセル

  • 2019/02/20 16:06

    そうですね。
    二重if文なんて使わなくても「And」を使えば一行で済むけど...

    ただ格ゲーのようなコマンドは別。
    あれは連想配列などで、次に押されるキーのタイミングを監視する必要があるから、管理が大変よ。
    まぁ、しばらくはやらないだろうけど...

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/20 16:17

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

    キャンセル

  • 2019/02/20 16:27

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

    キャンセル

  • 2019/02/20 16:58

    高校でオシロスコープ買うとか、すごいですね...
    高専か工業系の高校通ってましたか?

    ちなみに私は工業系の高校卒ですが、オシロスコープ持ってないですね。
    ポケコンなら持ってますが...

    キャンセル

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる