10年ぶりのプログラム「引退したプログラマーがPythonでAIプログラミングに挑戦する」-13:開発_キーボード操作
チェスのコマの動きに関するプログラムは前回までで終了しています。今回はAIの前の最後のコーディングとして、キーボード操作を実装します。
今回の対象となるファイルはchess_main.pyのみです。
実装方針
今回はキーボードのボタンを押下することにより
・終了 → Qボタン
・リセット → Rボタン
・投了 → Xボタン
の3つを実装できるようにします。
また、デバッグのために作ったZボタンも、このまま残そうと思います。
その結果
・終了 → Qボタン
・リセット → Rボタン
・投了 → Xボタン
・やり直し → Zボタン
という4つのボタンを実装することになります。
なおZボタンについて補足があります。
このあとAIを実装しますが、AIは高速で打ち返してきますので、人間対AIをやった場合には、人間が自分の手に対してZボタンを押したつもりでも、その瞬間にAIは手を指していますので、AIの手に対してZボタンを押したことになってしまいます。その場合でもAIは高速で手を打ち直してきますので、人間の手を戻すことはできません。これについてはご了承ください。
PygameのKeyDown
キーボード操作のためには、PygameのKeyDownという機能を使います。
p.K_{キー}と記載することにより、キーボード操作ができるようになります。
ゲーム終了(Qボタン)
このボタンを押したときに、ゲームを終了し、画面を閉じます。そのためにはwhile文の条件として使っているflg_runningをFalseにするだけです。
リセット(Rボタン)
ゲームの初期状態に戻します。そのためにはmainの上部で行った処理と同じことを行います。
投了(Xボタン)
画面上に投了というメッセージを出すこととします。チェックメイトやステイルメイトと同様にゲーム終了とします。
やり直し(Zボタン)
すでに実装済みですので説明を除外します。
実装
初期設定
main関数のwhileの前に二つのフラグを設定します。下記の黄色い部分を追加してください。
flg_resigneは、投了したときにTrueになります。
flg_gameoverは、投了、ドロー、ステイルメイト、チェックメイトのときにTrueになります。これがTrueになるとキーボード操作をできないようにします。
MOUSEBUTTONDOWN
flg_gameover = Trueのときには、このif文に入れないようにします。その結果、マウスによるコマの移動ができないということになります。
MOUSEBUTTONDOWNの直下に
if not flg_gameover:
をセットし、全体のインデントをずらします。
p.KEYDOWN
全体像はこのようになります。
Zボタン
flg_resigne = False
flg_gameover = False
を追加します。
これは、投了やチェックメイトなどのゲーム終了後に、ゲームをやり直しすることへの対応です。
Qボタン
ゲーム自体を終了するために、flg_running=Falseにします。
Rボタン
初期状態に戻します。
そのために、chess_mainのmain()の直下でやっている作業と同じことを行います。ただし、pygameの設定とコマのロードは不要です。
Xボタン
投了ですので、下記フラグをTrueにします。
flg_resigne = True
flg_gameover = True
終了メッセージの追加
flg_resign=Trueの場合には、投了というメッセージを表示させます。その変更は下記になります。黄色い部分を追加してください。
なお上記で
flg_gameover = True
としています。
これは、投了とドローの場合にはマウス操作ができないようするためです。(11:開発_ゲーム終了で言及したのはこのことです。)
以上がキーボード操作となります。
確認してOKでしたら終了となります。
次回からいよいよ本題であるAIに入ります。
使用しているチェスのコマは、下記からダウンロードしました。
By jurgenwesterhof (adapted from work of Cburnett) - http://commons.wikimedia.org/wiki/Template:SVG_chess_pieces, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=35634436
この記事が気に入ったらサポートをしてみませんか?