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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Q&A

1回答

176閲覧

PyQt5でTetris: ボードを監視し続け、あらかじめ用意したボード状態に等しいとき、特定のキー入力を発生させたい。

kasanegi

総合スコア20

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

0グッド

0クリップ

投稿2018/10/03 20:34

現状

こちらのサイト(http://zetcode.com/gui/pyqt5/tetris/)に沿ってPyQt5でTetrisを作成。

途中で、ボード状態を保存するリストに無駄な部分が加わるバグを修正。

ーー修正前
これだと呼ばれるごとにどんどんリストのサイズが大きくなっていってしまう。

python3

1 def clearBoard(self): 2 '''clears shapes from the board''' 3 4 for i in range(Board.BoardHeight * Board.BoardWidth): 5 self.board.append(Tetrominoe.NoShape)

ーー修正後

python3

1 def clearBoard(self): 2 '''clears shapes from the board''' 3 self.board = [] # ここで初期化 4 for i in range(Board.BoardHeight * Board.BoardWidth): 5 self.board.append(Tetrominoe.NoShape)

やりたいこと

ボード状態を監視し続け、あるボードの状態を検知したとき、あらかじめ設定された(もしくはその状態からRNNなどによって導かれた)キー入力を(一度だけ)即実行したい。

疑問

①どのようにしてボードの状態を、ほかの処理(一定時間ごとに現在操作可能なピースを一段落とす処理など)を邪魔せず監視できるか。
②また監視結果が、目的のボード状態にマッチしたときに、これまたほかの処理(一定時間ごとに現在操作可能なピースを一段落とす処理など)を邪魔せず、対応するキー操作を実行できるか。

ためしたこと

ピースを落とす処理の実装にならい、比較イベントを発生させるタイマーを別に用意し、以下のように使おうとした。
「100msec(実験的に設定した根拠のない値)ごとに現状のボード状態を目的の状態と比較→一致すればキー入力イベントを発生させる。」
しかし、キー入力イベントが終わる前にまた比較イベントが発生し、まだボード状態が変わっていないため、さらにおなじキー入力イベントが発生してしまうなど、タイミングの問題が残る。
また対策としてタイマー間隔を広げてしまうと、人間の不定期キー入力によるボード状態の変化もあるため、目的の状態を見逃してしまう恐れがある。


このような問題をどのように解決すればよいのでしょうか?
マルチスレッドなどを使うものと考えていますが、特にPyQt5を使うにあたって具体的にどのように実装すればよいのかわかりません。
スレッド系の問題は煩わしいものと思いますが、もし解決策をご存知でしたらご教授いただければ幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

素直に、状態が変化するたびにobserverを呼んで状態を比較し、一致していれば処理を走らせる、で良いのでは?

逆にタイマーとかでどうにかなる問題でもないと思いますが……

投稿2018/10/03 23:17

hayataka2049

総合スコア30933

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

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

kasanegi

2018/10/04 16:59

返信遅れまして申し訳ありません。 回答ありがとうございます! 教えていただいた方法を試してみたところ、タイミングの問題はかなり軽減されました。 しかしながらほかの部分でまだバグが残っている状態なので、そこを直していけばうまく動きそうです。 余談かもしれませんが、よりゲームとプレイヤーのプログラムが疎結合なデザインとして、人間をゲームをプレイするスレッドに見立て、その動作を再現するCOMスレッドのようなものは作れるでしょうか? つまり同時に実行される別プログラム(スレッド、プロセス?)の疎結合な連絡はどのようにして実現できるのでしょうか? もし何かご存知でしたら、お教え願いたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問