こんにちは、Tech Samuraiです!
今回は、PythonとGUIライブラリ`PySide6`を使い、古典的な記憶力ゲーム「パターン記憶(Simon Says)」を開発した際の、**企画から完成までの全ステップ**を振り返ります。
このプロジェクトは、単に私がコードを書いただけではありません。ユーザー(今回は、私の開発パートナーであるGemini)からのフィードバックや問題提起を受け、**対話を繰り返しながら、段階的にアプリケーションを「育てて」いきました。**
この開発の物語を通して、基本的な機能の実装から、デバッグ、バグ修正、UI/UXの改善、そして最終的な仕上げまで、アジャイル開発のような実践的なプロセスを追体験していただければ幸いです。
Step 1: ゲームの基本機能の実装 (v1)
最初の目標:
「光ったボタンの順番を記憶して、同じ順番で押す」という、ゲームの基本的なプレイが可能な最初のバージョンを素早く作り上げること。
実装内容:
`PySide6`を使い、4つの色付きボタンを2×2のグリッドに配置。コンピュータが生成した色のシーケンスを`QTimer`で順番に点灯させ、プレイヤーの入力を判定する、というコアロジックを実装しました。この段階で、ゲームとしては一応遊べるものが完成しました。
Step 2: デバッグ機能の追加と安定化 (v2)
ユーザーからの問題提起:
「どうもバグっている気がする。間違えたときに、何が正解で、自分がどう押したのか分からないと不便だ。」
実装内容:
フィードバックを受け、まずは`QTimer`の制御ロジックをより安定したものにリファクタリング。さらに、ゲームオーバー時に**「正解シーケンス」**と**「プレイヤーの入力シーケンス」**の両方を画面に表示するデバッグ機能を追加しました。これにより、ユーザーは自分のミスなのか、プログラムのバグなのかを明確に切り分けられるようになりました。
Step 3: 致命的なクラッシュバグ (`KeyError: False`) の修正
ユーザーからの問題提起:
「v2のコードを実行すると、ボタンをクリックした瞬間にKeyError: False
というエラーでクラッシュする。」
原因分析と修正:
調査の結果、`QPushButton`の`clicked`シグナルが、予期せぬブール値`False`を引数として渡していることが原因でした。ボタンクリックのイベント処理に渡す`lambda`関数をlambda c=color: ...
からlambda checked=False, c=color: ...`
に修正。余計な引数を受け流し、本来渡したかった色名`c`だけを正しくメソッドに渡すことで、この致命的なバグを解決しました。
Step 4: UI/UX(操作感)の大幅改善
ユーザーからの要望:
「ボタンを押したときの反応がなくて分かりにくい。コンピュータの点灯も見えにくい。」
実装内容:
ボタンを点灯させる共通メソッド`flash_button`を新設。点灯エフェクトを、単なる色の変化から**「背景色変更+白い枠線(ボーダー)の追加」**に強化し、視認性を大幅に向上させました。さらに、プレイヤーがボタンをクリックした瞬間にも、このメソッドを短い時間で呼び出すことで、**クリック時にボタンが「パッ」と光る**気持ちの良いフィードバックを実装しました。
Step 5: ルール説明ページの追加と最終仕上げ (v4)
ユーザーからの質問と要望:
「レベルが進んでもシーケンスの最初が同じなのは仕様か?」「ゲーム開始前にルール説明が欲しい。」
実装内容:
まず、シーケンスが累積していくのが「Simon Says」の正しいルールであることを明確化。その上で、UI全体を**`QStackedWidget`**で管理するように構造を変更し、複数の画面(ページ)切り替えを可能にしました。
- 1ページ目として、ゲームのタイトルと遊び方を説明する「ウェルカムページ」を作成。
- 「ゲーム開始」ボタンで、2ページ目の「ゲーム画面」に切り替わるように変更。
- ゲームオーバー画面に「ルールに戻る」ボタンを追加し、ウェルカムページに戻れるようにした。
これにより、初めてプレイする人にも親切な、完成されたアプリケーションとなりました。
完成したコード
この一連の「アジャイルな」開発プロセスを経て完成したスクリプトの全コードは、以下のGitHubリポジトリで公開しています。
- GitHubリポジトリ: memory_games – brain_training
まとめ
今回のプロジェクトは、完璧なものを一度で作ろうとするのではなく、まず**基本的な機能(v1)を素早く作り上げ、ユーザーからのフィードバックを元に、デバッグ、バグ修正、UI/UX改善、機能追加と、段階的にソフトウェアを「育てていく」**という、非常に実践的な開発プロセスを辿りました。
この反復的な開発サイクルこそが、ユーザーに本当に喜ばれるアプリケーションを生み出すための鍵なのかもしれません。この開発の物語が、あなたのプロジェクトの進め方のヒントになれば幸いです!
コメント