見出し画像

Pythonであっち向いてホイ

突然思い立ったのです。
そうだ、「あっち向いてホイ」をPythonで書いてみよう!と。

理由なんてないのです。

1.  どのキーが打鍵されたかを受け取る方法

msvcrtという標準モジュールの、getchというメソッドでキー入力を受け取ることが可能です。

inputと違うところは、文字列を受け取るのでなく、キー入力結果そのものを受け取れるところです。

試しに以下のコードを記載してみてください。

#msvcrtモジュールのgetchメソッドをインポート
from msvcrt import getch

#ループ処理でキーボード入力結果を整数でkey変数に格納し、出力
while True:
   key = ord(getch())
   print(key)

ordメソッドは、受け取ったキー情報を整数に変換してくれます。

では、コマンドプロンプトで実施してみます。

画像1

27、49、13という数字が出力されていますが、それぞれ、ESCキー、1、Enterキーの打鍵情報です。

今回、あっち向いてホイなので、矢印キー(↑、→、↓、←、Spaceキー)を調べたいと思います。

画像2

13以降を見てみると、224、72、224、77、224、80、224、75、32と続いています。

矢印キーは、どうやら2つ打鍵情報が返ってくるようになっているようです。

いずれにしても、キー情報を取得することはできそうです。

2. 「あっち向いてホイ」ゲームの概要

大まかには以下要件を充足すべく書いていきます。

① ゲーム開始入力をもとにゲームが開始
➁ プレイヤーのキー入力時に、コンピューターも上下左右正面の方向を決定
➂ プレイヤー・CPUの方向から勝敗を判定する
➃ 負けたら、そこで終了
➄ 回避した場合は、何回回避したかカウントする
➅ Ctrl+Cキーが押されたら、ゲームを中止する

これくらいでしょうか。

3. 完成したプログラムの実行結果

まずは、完成後の実行結果から。
コマンドプロンプトでPythonファイルを実行しています。

画像3

① 1を押したらゲーム開始
➁ ゲーム開始したら、ループ処理でキー入力をさせる
➂ 入力結果をもとにCPU側の方向と比較し、勝敗判定
➃ 負けたらループから抜けてプログラム終了
➄ 回避(勝った)場合は、回数をカウント

画像4

➅ Ctrl + Cでゲーム終了

4. コード全文

コード全文は以下の通りです。

ポイントは、2つ渡される矢印キーの入力情報をどう捌(さば)こうかってところかと思います。

あとは、コードが冗長にならないよう、方向判定と結果判定機能を関数でカプセル化したところかなと思います。
(細かいですが、あっち向いて・・・ホイッ!のところをtimeモジュールを使って少し、ドキドキ感を演出してみました・・・え?しない??)

 #あっち向いてほいゲーム from msvcrt import getch
import random
import time

#方向
directions = ['↑', '→', '↓', '←', '正面']

#方向判定
def direction_check(key, counter):
   if key == 72:
       player_direction = "↑"
       cpu_direction = random.choice(directions)
       print("-------------{}回目---------------".format(counter+1))
       return (player_direction, cpu_direction)
   elif key == 77:
       player_direction =  "→"
       cpu_direction = random.choice(directions)
       print("-------------{}回目---------------".format(counter+1))
       return (player_direction, cpu_direction)
   elif key == 80:
       player_direction =  "↓"
       cpu_direction = random.choice(directions)
       print("-------------{}回目---------------".format(counter+1))
       return (player_direction, cpu_direction)
   elif key == 75:
       player_direction =  "←"
       cpu_direction = random.choice(directions)
       print("-------------{}回目---------------".format(counter+1))
       return (player_direction, cpu_direction)
   elif key == 32:
      player_direction = "正面"
      cpu_direction = random.choice(directions)
      print("-------------{}回目---------------".format(counter+1))
      return (player_direction, cpu_direction)
       
#結果判定機能
def judge(cpu_direction, player_direction):
   if cpu_direction == player_direction:
       print("CPUの指は{}を向いている!!!、あなたは{}を向いている!".format(cpu_direction, player_direction))
       return 1
   else:
       print("CPUの指は{}を向いている!!!、あなたは{}を向いている!".format(cpu_direction, player_direction))
       return 0

#ゲーム開始
start_flg = 0

while start_flg == 0:
   input_num = input('ゲーム開始(1):')
   if input_num == '1':
       start_flg = 1
   else:
       continue
else:
   print("--------------------------------------------------")
   print("ゲームを開始します")
   time.sleep(1)
   print("あっち向いて・・・・(上:↑キー、右:→キー、左:←キー、正面:Spaceキーを入力してください)")
   print("※ゲームをやめる場合は、Ctrl+Cを押下")

   counter = 0
   while True:
       key = ord(getch())
       if key == 3:
           print("ゲーム中止")
           break
       elif key == 224:
           pass
       elif key == 72 or key == 77 or key == 75 or key == 80 or key == 32:
           print("\n")
           time.sleep(2)
           print("ホイッ!!!!!")
           direction = direction_check(key, counter)
           player_direction = direction[0]
           cpu_direction = direction[1]
           if judge(cpu_direction, player_direction):
               print("残念!敗北")
               print("結果:回避回数は・・・{}回".format(counter))
               if counter == 0:
                   print("どんまい、ついてないですね")
               elif counter < 4:
                   print("通常走行って感じですね")
               elif counter < 8:
                   print("結構ついてますね!")
               else:
                   print("すごい!今日はいけそう!")
               break
           else:
               counter += 1
               print("ナイス!{}回目の回避に成功!!".format(counter))
       else:
           continue

以上です。

最後まで読んでいただきありがとうございました!

この記事が気に入ったらサポートをしてみませんか?