Geminiの思考モードと高速モードのコード比較
1. はじめに
n番煎じな気もしますが、思考モードと高速モードで同じプロンプトでテトリスのGUIアプリを作らせた時にどのような違いが出るかを見ていきたいと思います
2. 比較実験の概要
プロンプトは「Pythonとtkinterでテトリスを作って」を使用し、思考モードと高速モードでコードを作成してみます
3. 思考モードによるテトリスコード生成
コードは長くなってしまうのでGitHubに載せておきます
思考モード生成コード
生成結果のテキスト部分は以下
Pythonとtkinter(標準ライブラリ)のみを使用した、シンプルで動作するテトリスのコードを作成しました。外部ライブラリのインストールは不要です。
以下のコードをコピーして、tetris.py などの名前で保存し、実行してください。
Tetris (Python + tkinter) コード
---省略---
遊び方と機能
1. 起動: Pythonがインストールされた環境で上記コードを実行してください。
2. 操作方法:
- 矢印キー 左 (←) / 右 (→): ブロックを左右に移動
- 矢印キー 上 (↑): ブロックを回転
- 矢印キー 下 (↓): ブロックを加速して落とす
3. ルール:
- 横一列が揃うとラインが消え、スコアが加算されます(1行につき100点)。
- ブロックが上まで積み上がると "GAME OVER" と表示され、操作できなくなります。
4. 実装のポイント(解説)
- クラス構造: TetrisGame クラスですべてのゲームロジックを管理しています。
- after メソッド: tkinter の root.after(ms, function) を使って、一定時間ごとに自然落下処理 (update_clock) を呼び出し、ゲームループを作っています。
- 座標管理: 盤面は self.board という二次元リストで管理しています(0なら空、それ以外なら色の文字列)。
- 描画: draw_board メソッドで一度 canvas.delete("all") して全消去し、現在の盤面と落下中のピースを再描画するというシンプルな方式を採用しています。
他に機能を追加したい場合(例:次に落ちてくるブロックの表示、レベルアップ機能など)は、お気軽にお申し付けください。
生成されたコードを実行した結果
- ブロックが上まで積み上がると "GAME OVER" と表示され、操作できなくなります。
の部分だけが正常に実行されず、上まで積み上げても"GAME OVER"と表示されず、操作だけができなくなりました。
4. 高速モードによるテトリスコード生成
思考モード同様コードはGitHubに載せます
高速モード生成コード
以下生成テキスト
承知いたしました。テトリス全体を動かすための、Tkinterを使ったオブジェクト指向のコード例を提供します。
このコードは、テトリミノの定義、描画、移動、回転、衝突判定、そしてライン消去とゲームオーバー判定といったテトリスの主要な機能をすべて含んでいます。
🐍 Python/Tkinter テトリス 全体コード
---省略---
🎮 実行方法
1. 上記のコードをtetris.pyなどのファイル名で保存します。
2. コマンドラインまたはターミナルで、python tetris.pyを実行します。
これで、基本的なテトリスのウィンドウが開き、キー操作でブロックを動かして遊べるようになります。
🔑 操作方法
- ← / → (Left/Right): テトリミノを左右に移動
- ↓ (Down): テトリミノを1マス落下 (高速落下)
- ↑ (Up): テトリミノを回転
📌 コードのポイント
- オブジェクト指向 (OOP): TetrisGameというクラスにすべての機能を集約し、ゲームの状態(self.boardなど)を一元管理しています。
- ゲームループ: self.master.after(FALL_SPEED_MS, self.game_loop)を使って、指定した間隔(FALL_SPEED_MS)で自動的にgame_loopを呼び出し、ブロックを落下させています。
- 衝突判定 (check_collision): 移動や回転の前に、新しい位置にブロックを置いても問題ないか(壁、床、固定ブロックと重ならないか)を常にチェックしています。
- ライン消去 (clear_lines): ボードを逆順にチェックすることで、揃ったラインを効率よく削除し、上の行を一度に落としています。
このコードをベースにして、次のテトリミノ表示やポーズ機能、ハードドロップといった機能を追加していくことも可能です。
こちらは"GAME OVER"はでるものの、途中置いたミノが消えるなど致命的なバグが起きたりしています。
5. 両モードの比較と分析
両方とも完璧に作成できたわけではありませんが、再度バグを伝えると正確なものに修正してくれました
コードとしては、ミノの定義等が変わっています
- 思考モードの形状定義
# テトリミノの形状定義 (中心からの相対座標)
SHAPES = [
[(-1, 0), (0, 0), (1, 0), (2, 0)], # I (水色)
[(-1, -1), (-1, 0), (0, 0), (1, 0)], # J (青)
[(1, -1), (-1, 0), (0, 0), (1, 0)], # L (オレンジ)
[(0, 0), (1, 0), (0, 1), (1, 1)], # O (黄色)
[(-1, 0), (0, 0), (0, -1), (1, -1)], # S (緑)
[(-1, 0), (0, 0), (1, 0), (0, -1)], # T (紫)
[(-1, -1), (0, -1), (0, 0), (1, 0)], # Z (赤)
]
- 高速モードの形状定義
# テトリミノの形状
# 1はブロックが存在するセルを示す。各要素は4x4グリッド内の形状。
# I, J, L, O, S, T, Z の順に対応。
TETROMINOS = [
# 1. I (Cyan)
[
[[0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0]], # 0度
[[0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0]], # 90度
[[0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0]], # 180度
[[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]] # 270度
],
# 2. J (Blue)
[
[[2, 0, 0], [2, 2, 2], [0, 0, 0]],
[[0, 2, 2], [0, 2, 0], [0, 2, 0]],
[[0, 0, 0], [2, 2, 2], [0, 0, 2]],
[[0, 2, 0], [0, 2, 0], [2, 2, 0]]
],
# 3. L (Orange)
[
[[0, 0, 3], [3, 3, 3], [0, 0, 0]],
[[0, 3, 0], [0, 3, 0], [0, 3, 3]],
[[0, 0, 0], [3, 3, 3], [3, 0, 0]],
[[3, 3, 0], [0, 3, 0], [0, 3, 0]]
],
# 4. O (Yellow)
[
[[4, 4], [4, 4]],
],
# 5. S (Green)
[
[[0, 5, 5], [5, 5, 0], [0, 0, 0]],
[[0, 5, 0], [0, 5, 5], [0, 0, 5]],
[[0, 0, 0], [0, 5, 5], [5, 5, 0]],
[[5, 0, 0], [5, 5, 0], [0, 5, 0]]
],
# 6. T (Purple)
[
[[0, 6, 0], [6, 6, 6], [0, 0, 0]],
[[0, 6, 0], [0, 6, 6], [0, 6, 0]],
[[0, 0, 0], [6, 6, 6], [0, 6, 0]],
[[0, 6, 0], [6, 6, 0], [0, 6, 0]]
],
# 7. Z (Red)
[
[[7, 7, 0], [0, 7, 7], [0, 0, 0]],
[[0, 0, 7], [0, 7, 7], [0, 7, 0]],
[[0, 0, 0], [7, 7, 0], [0, 7, 7]],
[[0, 7, 0], [7, 7, 0], [7, 0, 0]]
]
]
全体を見ても思考モードの方がスマートな実装となっています
もうちょっと差が明確に出て欲しかったんですが、テトリスだと簡単すぎたのかなと反省しています…
今後もGeminiに限らず新たな生成AIは出てくると思うので、どっちがすぐれてるのかを自分の用途にあてはまる形で精度比較できるように何か準備しておく必要がありそうかなと感じました