はじめに
日本語プログラミング言語Mindのバージョン9でAI仕様駆動開発とVibeコーディングのハイブリッド(っぽいこと)を行ってみます。
本記事はその前編で、AIにMind9GUIミニゲームアプリの企画構想のご提案依頼とその結果のソースコード生成(コンパイル可)までです。純然たるVibeコーディングですと、まだ疲れそうな予感がしましたので、いったん構想をスキル化するとかは仕様駆動開発っぽい要素を取り入れておきます。
使用AI
GitHub CopilotのPro+版。
プロンプト(プロポーサルリクエスト)
docs\Mind言語のコード生成ルール.md
はUTF-8文書です。
manual-md
配下のmdファイルもUTF-8文書です。C:\Mind9\guilib
のsrcファイル(サンプル)を読み込み
実装できそうなミニゲームの構想案を提案して
docs\ミニゲームの構想案.md
に出力してください。
docsに出力するmdはUTF-8にしてください。
※注 MindのソースコードのエンコーディングがSJISであることはMind言語のコード生成ルール.mdに記載済なのですが、このmd自体や公式ヘルプをmd化したファイルはUTF-8で読み書きするよう明示的に注意しています。
docs\ミニゲームの構想案.md
ご提案資料きました
正直どんなものが返ってくるのか想像できていませんでした![]()
# Mind9 ミニゲームの構想案
## 前提
- GUIはキャンバス上の図形とイベントで構成する。キャンバスの原点は左上の `(0, 0)` で、座標はピクセル単位。
- キー入力やマウス操作はイベントとして処理できる。マウスイベントの座標は文字列で渡されるため、数値に変換して判定する。
- 時間経過による処理には遅延実行を使う。ゲームの進行を長いループで占有せず、イベントを受け付けながら更新する。
- マニュアルとサンプルから乱数の利用方法を確認できなかったため、案は固定順序や決め打ちの配置で成立する設計にする。
- キャンバス図形の作成数にはMind側の上限があり、削除した図形IDも再利用されない。毎フレーム新しい図形を作るのではなく、少数の図形を作って属性や位置を更新する。
## 案1: 光るマスをねらえ
**難易度: 初級 / 推奨**
3 x 3 のマスのうち1つを目標色にし、クリックして正解すると次のマスへ移る。制限時間内の正解数をスコアにする。
- 操作: マウス左クリック
- ゲーム進行: 目標マスは固定の順番で移動。短い制限時間を設けて、時間切れで結果を表示。
- 主な状態: 現在の目標番号、得点、残り時間、ゲーム中かどうか
- 実装の要点: マウスイベントのX/Y座標を数値に変換し、クリックされたマスを判定する。9マスの図形は最初に作成し、目標の色だけを更新する。
- 発展: 正解が続くと目標の移動間隔を短くする。誤クリック時に得点を減らすモードを追加する。
- 根拠: キャンバス図形の描画・属性変更、キャンバス上のマウスイベントと座標引数、遅延実行がマニュアルとサンプルにある。
最初の完成目標は「開始、30秒計測、正誤判定、得点表示、終了表示」に限定する。配置を固定すれば、乱数や複雑な図形検索なしで遊べる形にできる。
## 案2: 3レーン回避
**難易度: 初級から中級**
プレイヤーを3本のレーンのいずれかに置き、キー入力で左右へ移動する。障害物は一定間隔で下がり、同じレーンに重なる前に避ける。障害物の出現レーンは固定順にする。
- 操作: 左右キーでレーン移動
- ゲーム進行: 遅延イベントごとに障害物を1段進め、画面下まで避け続けた時間をスコアにする。
- 主な状態: プレイヤーのレーン、障害物のレーンと段、経過時間、ゲーム状態
- 実装の要点: キーイベントをバインドし、図形の位置を更新する。最初は障害物を1つに限定し、接触判定もレーン番号と段番号の一致で行う。
- 発展: 進行間隔を段階的に短くする。障害物を複数にする場合は配列の扱いをマニュアルで確認する。
- 根拠: キーイベントのバインド、キャンバス図形、遅延実行を組み合わせられる。
## 案3: ドラッグで出口へ
**難易度: 中級**
プレイヤーの丸をマウスでドラッグして、壁に触れずにスタートからゴールまで運ぶ。接触したら開始位置に戻す。
- 操作: マウス左ボタンでドラッグ
- ゲーム進行: 壁と通路をキャンバスに固定描画し、ドラッグ中の座標が壁の範囲内に入ったか判定する。
- 主な状態: プレイヤー位置、ドラッグ中かどうか、クリア状態
- 実装の要点: マウスの押下・移動イベントを利用する。まずは直線と矩形だけの短いコースにし、座標範囲による接触判定に限定する。
- 発展: コースを複数用意し、クリア時間を記録する。
- 根拠: マウスイベントの押下・移動サンプルとキャンバス図形の操作がある。
## 実装時の注意
- イベント処理から参照するキャンバスIDやゲーム状態は、イベント処理の外からも参照できる変数として管理する。
- 遅延実行を使う更新は、毎回次の更新を登録する形にする。ゲーム終了時には以後の更新が進まないよう、ゲーム状態を確認する。
- キャンバス図形を大量に作成・削除し続けない。固定数の図形を使い回す設計にする。
- イベント座標は文字列として届くため、数値変換してから座標比較する。
- ソースコードを作成する場合はMindソースの文字コード規則に従い、SJISで保存する。この構想書はUTF-8。
## 参照資料
- [キャンバス](../manual-md/34-canvas.md)
- [イベント処理](../manual-md/25-event.md)
- [バインドとイベント名](../manual-md/30-bind-and-event.md)
- [制限値](../manual-md/39-limits.md)
- [制御構文](../manual-md/03-Control-syntax.md)
- GUI実装サンプル: `C:\Mind9\guilib\gui_canvas.src`、`gui_bind.src`、`gui_event_for_mind.src`(SJISとして参照)
おおっ、しっかり根拠の参照資料まで引用している!これはこの時点でちょっとすごい感じ。実は最初はVibeコーディング風に、こんな感じのミニゲームつくれる?あたりから始めようとしたのですが、ほぼゲームに詳しくないため「こんな感じ」の内容が思い浮かばず、もしかしてそこから推論してもらってもいいかもと思うにいたった次第でございます。
プロンプト(ご提案の採用と実行プラン作成依頼)
docs\ミニゲームの構想案.md
の
案1: 光るマスをねらえ
を実行する
docs\光るマスをねらえ実装プラン.md
を作成してください。
光るマスをねらえ実装プラン.md
実はいまいちテキストの説明だけではイメージわかず、ほんとうに自力で完成できるかこの時点でかなり疑っていましたので、とりあえず一番難度の低いやつでいくことにしました。
# 光るマスをねらえ 実装プラン
## 目的
構想案の「光るマスをねらえ」を、Mind9 GUIで実行できる最小ゲームとして実装する。ゲームソースは`flashgrid.src`とし、Mindソースの規則に従いSJISで保存する。このプラン文書はUTF-8。
## 仕様
- 3 x 3 の9個のボタンを盤面として表示する。
- 開始ボタンを押すと30秒のゲームを開始し、正解マスを固定順序で移動する。
- 目標マスを押した場合だけ得点を1加算する。別のマスを押しても得点・目標は変えない。
- 残り時間と得点をラベルに表示し、0秒で終了状態を表示する。
- ゲーム中以外のセル押下は得点に影響させない。
- 乱数、音声、画像、ハイスコア保存は初版に含めない。
## 実装方針
1. `C:\Mind9\samplew\grid-9cell-span.src`の格子配置例に沿って、セルボタンを9個作る。
2. `C:\Mind9\samplew\event-withargs.src`のイベント引数例に沿って、同一のセル押下処理にセル番号を渡す。イベント処理を登録した直後にセル番号をイベント引数として設定する。
3. 開始ボタンと状態表示ラベルを配置する。セル色はウィジェットの背景色設定を使い、目標だけ色を変える。
4. 固定順序で次の目標番号を選び、得点・残り時間・ゲーム状態を変数で管理する。
5. 残り時間は遅延実行で1秒ごとに更新する。GUIイベント処理を長いループで占有しない。
6. ビルドタスク`mind flashgrid guilib`でコンパイルし、実行タスクでGUI起動を確認する。
## 検証項目
- SJISとしてソースをデコードでき、コンパイルが成功する。
- 起動時に3 x 3の盤面、開始ボタン、得点・残り時間が表示される。
- 開始後、目標セルだけが強調され、正解クリックで得点と目標が更新される。
- 不正解クリックでは得点が変わらない。
- 30秒経過で終了表示になり、セル押下で得点が変化しない。
## 仕様上の注意
- イベント引数は文字列として受け取り、セル番号を数値に変換して扱う。
- イベント引数の設定は、マニュアル記載どおりイベント処理の登録直後に行う。
- GUI更新は少数の固定ウィジェットを使い回し、図形・ウィジェットを反復生成しない。
- ビルドまたは実行環境の制約で確認できない項目は、完了レポートに区別して記載する。
このあたりは私的には見慣れた緻密な実行プラン1のイメージです。どんなゲームなのかちょっとわかりました。
プロンプト(実行プランの実行と完了レポート作成)
docs\光るマスをねらえ実装プラン.md
を実行して完了したら
docs\光るマスをねらえ実装プラン完了レポート.md
を出力してください。
完了レポート作成してねといっておいた方が、実行しきれなかった内容とかもまとめてくれるので、AIコーディングの場合は必ず指示しています。
生成されたソースコード
完了レポート.mdでは実行確認はできなかったけれども、コンパイルでINFファイル未生成で、EXEとMCOファイルできましたのソースコードできましたとあり、下記のソースコードが生成されていました。
セルボタン数は 定数 9個。
セルボタン群は セルボタン数の ID。
セル番号文字列は 文字列定数配列
"1" "2" "3"
"4" "5" "6"
"7" "8" "9"
。
ゲーム中は 変数。
目標セルは 変数。
得点は 変数。
残り秒は 変数。
スコアラベル記憶は ID。
時間ラベル記憶は ID。
開始ボタン記憶は ID。
得点表示文は 文字列実体 長さ 200桁。
時間表示文は 文字列実体 長さ 60桁。
目標セルを表示とは (・ → ・)
_セルは ID
_回数は 変数
セルボタン数を
回数指定し
回数を _回数に 入れ
セルボタン群(_回数)を _セルに 入れ
"#d0d0d0"を _セルに 背景色を設定し
_セルを 変更を反映し
繰り返し
セルボタン群(目標セル)を _セルに 入れ
"#ffe66d"を _セルに 背景色を設定し
_セルを 変更を反映する。
ゲーム終了とは (・ → ・)
0を ゲーム中に 入れ
"TIME UP!"を 時間ラベル記憶に テキストを設定し
時間ラベル記憶を 変更を反映する。
時計更新とは (引数1、引数2、・・、引数個数 → ・)
イベント引数を捨て
ゲーム中が ゼロ以外
ならば
残り秒を 一つ減少し
時間表示文を 一文字右側削除し
残り秒が ゼロ?
ならば ゲーム終了し
さもなければ
時間表示文を 時間ラベル記憶に テキストを設定し
時間ラベル記憶を 変更を反映し
1000ミリと 時計更新の 実行情報と 空列で 遅延実行を予約する
つぎに
つぎに
。
セル押下処理とは (セル番号列、引数個数 → ・)
_セル番号列は 文字列
_引数個数は 変数
_セル番号は 変数
_セル番号列と _引数個数に 入れ
ゲーム中が ゼロ?
ならば 終り
つぎに
_セル番号列を 数値変換+し _セル番号に 入れ
_セル番号が 目標セルに 等しい?
ならば
得点を 一つ増加し
"*"を 得点表示文に 一文字追加し
得点表示文を スコアラベル記憶に テキストを設定し
スコアラベル記憶を 変更を反映し
目標セルが セルボタン数に 等しい?
ならば 1を 目標セルに 入れ
さもなければ
目標セルを 一つ増加し
つぎに
目標セルを表示し
つぎに
。
開始処理とは (引数1、引数2、・・、引数個数 → ・)
イベント引数を捨て
ゲーム中が ゼロ以外
ならば 終り
つぎに
1を ゲーム中に 入れ
1を 目標セルに 入れ
0を 得点に 入れ
30を 残り秒に 入れ
"SCORE: "を 得点表示文に 入れ
"TIME: ##############################"を 時間表示文に 入れ
得点表示文を スコアラベル記憶に テキストを設定し
スコアラベル記憶を 変更を反映し
時間表示文を 時間ラベル記憶に テキストを設定し
時間ラベル記憶を 変更を反映し
目標セルを表示し
1000ミリと 時計更新の 実行情報と 空列で 遅延実行を予約する
。
メインとは
_得点ラベルは ID
_時間ラベルは ID
_開始ボタンは ID
_セルは ID
_行は 変数
_列は 変数
_番号は 変数
メインウィンドウで ラベルのIDを取得し _得点ラベルに 入れ
"SCORE: "を _得点ラベルに テキストを設定し
_得点ラベルを スコアラベル記憶に 入れ
_得点ラベルを 格子配置を準備し
4と 1を _得点ラベルに ウィジェットの位置を設定し
_得点ラベルを 格子配置し
メインウィンドウで ラベルのIDを取得し _時間ラベルに 入れ
"TIME: ##############################"を _時間ラベルに テキストを設定し
_時間ラベルを 時間ラベル記憶に 入れ
_時間ラベルを 格子配置を準備し
4と 2を _時間ラベルに ウィジェットの位置を設定し
_時間ラベルを 格子配置し
メインウィンドウと セルボタン数で ボタンのIDを複数取得し
セルボタン群に 複数のIDを配列に格納し
_番号を クリアし
3行を
回数指定し
回数を _行に 入れ
3列を
回数指定し
回数を _列に 入れ
_番号を 一つ増加し
セルボタン群(_番号)を _セルに 入れ
" "を _セルに テキストを設定し
"#d0d0d0"を _セルに 背景色を設定し
セル押下処理の 実行情報を _セルに イベント処理を登録し
セル番号文字列(_番号)を _セルに イベント引数を設定し
_セルを 格子配置を準備し
_行と _列を _セルに ウィジェットの位置を設定し
_セルを 格子配置し
繰り返し
繰り返し
メインウィンドウで ボタンのIDを取得し _開始ボタンに 入れ
"START"を _開始ボタンに テキストを設定し
開始処理の 実行情報を _開始ボタンに イベント処理を登録し
_開始ボタンを 格子配置を準備し
5と 2を _開始ボタンに ウィジェットの位置を設定し
_開始ボタンを 格子配置する
。
う~む、これはすごい
。わたしは自作のエクステンションでシンタックスハイライト付きで見ていますので、なんか迫力があります。単語定義の右側のスタック仕様コメントまでつくってくるとは想定外でした![]()
ローカル変数に全角のアンダースコアつけるところとか、@killyさんが書いたサンプルよく読んでいるっぽいですね![]()
![]()
実行結果はまだ実行エラーが出ていましたが、コンパイラ通過してEXE/MCO生成済のソースコードをここまで仕上げてくるとは想像以上でした。
次回後編では動作するところまでとなります。わたしはまったくハンド手入れしておりません。
おわりに
以上です。いかがでしたでしょうか?なにか似たようなことをされようとしている方々の参考になれば幸いです。
興味を持たれた方は日本語プログラミング言語Mind公式サイトにアクセスすると、Mindコンパイラをダウンロードできますよ。
面白い!、楽しい、カンタン、難しいのも書ける!みんなでやってみよう![]()
-
AIとつくる日本語プログラミング言語Aoi (あおい) - Qiita ↩