現状
こちらのサイト(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を使うにあたって具体的にどのように実装すればよいのかわかりません。
スレッド系の問題は煩わしいものと思いますが、もし解決策をご存知でしたらご教授いただければ幸いです。
よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/04 16:59