鳴潮
https://wutheringwaves.kurogames.com/jp/main#main
というゲームがあることを知った。
この枠組み、プログラムを作る訓練にもいいかもってなった。
ゲームと同じような枠組みを作るか、
ゲームの中にプログラミング要素をいれちゃうか、
両方検討してもらうことにした。
題材として扱うプログラミング言語は、TOIBE 20から、10言語抜き出しました。
https://www.tiobe.com/tiobe-index/
C、Fortran、アセンブラは、自分が得意な言語で、Cの例から変換可能なため省略しました。
Rは、Pythonから逆算してなんとかならないかなっていう感じ。
AdaはDelphiから逆残。
Scratchは、数年教育に使いました。題材によっては有用ですが、今回はお見逃し。ごめんなさい。
Perl, PHP, SQLは、個人的に苦手。ソースコードみても良し悪しがわからない、ごめんなさい。
ChatGPT
鳴潮というゲームがあることを知った。
https://wutheringwaves.kurogames.com/jp/main#main
このゲームの枠組み、プログラムを作る訓練の枠組みにもいいかもってなった。
ChatGPT:
なるほど、興味深い着眼点です!👍
「鳴潮(Wuthering Waves)」のゲームデザインや構造を プログラム訓練の教材や演習枠組み に活かすのはかなり理にかなっています。理由と具体的な枠組み例を整理してみます。
- 鳴潮のゲーム構造の特徴
多層的なシステム
キャラクター、スキル、装備、環境の相互作用があり、動的に状態が変化する。
例:キャラのステータス変化 → スキル発動 → 状態異常 → 環境影響。
イベント駆動型
プレイヤーの行動やタイミングでシナリオ・バトルが進行。
内部的にはイベントリスナーや状態遷移管理が不可欠。
リアルタイム演算
戦闘やスキルの演算が連続して実行され、物理・確率計算が絡む。
タイマーやフレーム単位での更新が必要。
データ管理の複雑さ
キャラクター情報、敵情報、スキル効果、アイテム履歴などの管理。
DBまたはデータ構造の設計が学習に直結。- プログラム訓練に活かすポイント
(1) オブジェクト指向とデータ構造
キャラクター、スキル、アイテムなどを クラス/構造体 で表現。
状態変化やスキル発動のロジックを メソッド/関数 に分ける。
配列やリスト、マップを使って動的管理を学習。
(2) イベント駆動プログラミング
入力(操作) → イベント発火 → 状態更新 → 表示更新 というサイクル。
学習者は「イベントハンドラ」「状態遷移表」を作る練習になる。
(3) リアルタイム演算とタイマー管理
フレーム単位で計算する「簡易ゲームループ」を作成。
例:攻撃力計算、スキルクールダウン、HP更新。
CやPythonで簡単なシミュレーションから始めるのも有効。
(4) テスト駆動の練習
状態遷移や計算結果をテストコードで検証。
「攻撃 → HP減少」「スキル使用 → 状態異常発生」の挙動をユニットテストでチェック。- 訓練枠組みの例
練習テーマ 内容 学習ポイント
キャラクター管理 キャラのクラスを作り、ステータス管理 OOP、構造体、データ管理
スキル発動シミュレーション コマンド入力でスキルを発動し、効果を反映 関数設計、条件分岐、確率計算
簡易戦闘ループ 敵と交互に攻撃するループ ループ制御、リアルタイム更新
イベントハンドラ実装 入力や条件でイベントを発火 イベント駆動型プログラミング
テスト駆動開発 ユニットテストで状態変化を確認 TDD、バグ防止
💡 ポイントは、ゲームそのものを作らなくても「内部ロジックの演習」として分解」 できること。
鳴潮のような複雑なゲームは、状態遷移・イベント・リアルタイム演算をまとめて学習できる教材になります。
もしよければ、この枠組みをもとに 「鳴潮風プログラム演習カリキュラム」 を作って、初級〜中級Cプログラマ向けの練習問題リストに落とし込むこともできます。
作ってみますか?
はい。お願いします。
ChatGPT:
では、「鳴潮(Wuthering Waves)風」のゲーム構造をベースにした Cプログラマ向けプログラム演習カリキュラム を作成しました。
初級〜中級向けに段階を分けて、手を動かしながら学べる構成です。
🎮 鳴潮風プログラム演習カリキュラム(C言語版)
ステージ1:基礎データ構造とキャラクター管理
目標
構造体でキャラクター情報を管理
ステータス表示・更新ができる
課題例
struct Character を作成
typedef struct {
char name[20];
int hp;
int attack;
int defense;
} Character;
キャラクターを2体作り、ステータスを表示
ダメージ計算関数を作り、HPを減らす
void damage(Character *target, int dmg);
学習ポイント
構造体の扱い
ポインタによる状態更新
基本的な関数設計
ステージ2:スキル発動と状態異常
目標
スキルデータを構造体で表現
スキル発動でキャラクターの状態を変化させる
課題例
struct Skill を作成
typedef struct {
char name[20];
int power;
int cooldown;
} Skill;
スキル発動関数を作り、対象のHPや状態に影響を与える
void useSkill(Character *caster, Character *target, Skill *skill);
状態異常(例:麻痺・毒)をenumで管理し、確率で発動させる
学習ポイント
enumと構造体の組み合わせ
確率計算・ランダム処理
関数間でのデータ受け渡し
ステージ3:簡易戦闘ループ
目標
キャラクター同士のターン制戦闘をループで実装
勝敗条件を判定
課題例
whileループでターンを管理
各ターンで攻撃・スキル使用を選択
HPが0になったら終了、勝敗を表示
while (player.hp > 0 && enemy.hp > 0) {
// プレイヤーターン
// 敵ターン
}
学習ポイント
ループ制御
条件分岐
繰り返し処理と状態更新
ステージ4:イベント駆動型設計
目標
入力や条件でイベントを発火
イベントハンドラを関数でまとめる
課題例
プレイヤーがHP30%以下になると「必殺スキルイベント」を発火
タイマーイベントで毎5ターンごとに敵がバフを取得
イベント管理用関数を作る
void checkEvents(Character *player, Character *enemy, int turn);
学習ポイント
イベント駆動型設計
状態監視と条件判定
関数の役割分割
ステージ5:テスト駆動演習
目標
戦闘ロジックやスキル計算をテストで確認
バグを防ぐ習慣を身につける
課題例
HP減少関数のテストケースを作る
// input HP=100, damage=30 => HP=70
スキル発動時の状態異常発生確率をシミュレーションで確認
関数ごとに期待結果と実際の出力を比較
学習ポイント
TDD(Test Driven Development)基礎
再現性のあるテスト設計
デバッグ力向上
💡 カリキュラムのポイント
「鳴潮」の複雑なゲームロジックを分解して学習
実際にゲームを作る前に 状態管理・イベント・ループ・テスト を体験
初級〜中級Cプログラマ向けで、手を動かすことで理解を深める構成
💡 ご提案
このカリキュラムを チェックリスト形式 にして、1課題ずつ ✅ をつけながら進めると学習効果が高まります。
希望であれば、私が Markdown形式の練習チェックリスト に変換して作ることもできます。作りますか?
はい。お願いします。
ChatGPT:
了解です!
では先ほどの 鳴潮風プログラム演習カリキュラム を、Cプログラマ向けに Markdown形式のチェックリスト に変換しました。
各ステージごとに課題を ✅ 形式で整理してあります。
📝 鳴潮風プログラム演習カリキュラム(C言語版)チェックリスト
ステージ1:基礎データ構造とキャラクター管理
struct Character を作成する
キャラクター2体を作り、ステータスを表示する
ダメージ計算関数 damage(Character *target, int dmg) を作り、HPを減らす
ステージ2:スキル発動と状態異常
struct Skill を作成する
スキル発動関数 useSkill(Character *caster, Character *target, Skill *skill) を作る
状態異常(麻痺・毒など)を enum で管理し、確率で発動させる
ステージ3:簡易戦闘ループ
whileループでターン制戦闘を実装する
各ターンで攻撃・スキル使用を選択できるようにする
HPが0になったら終了、勝敗を表示する
ステージ4:イベント駆動型設計
プレイヤーHP30%以下で「必殺スキルイベント」を発火させる
タイマーイベントで5ターンごとに敵がバフを取得する
イベント管理用関数 checkEvents(Character *player, Character *enemy, int turn) を作る
ステージ5:テスト駆動演習
HP減少関数のテストケースを作る(例:HP=100, damage=30 → HP=70)
スキル発動時の状態異常発生確率をシミュレーションで確認する
関数ごとに期待結果と実際の出力を比較し、テストする
✅ 活用のコツ
各課題を1つずつクリアしてチェック
実装後はコードレビューや自己レビューを行い、理解を深める
ステージごとにファイルを分けて管理すると、進捗が可視化しやすい
💡 ご希望であれば、さらに 「初級→中級→上級」用に難易度別に色分けした拡張版チェックリスト も作れます。
作りますか?
はい。お願いします。
ChatGPT:
了解です!
では、先ほどの 鳴潮風プログラム演習カリキュラム をさらに発展させて、難易度別(初級・中級・上級)に色分けしたチェックリスト を作成しました。
色分けは Markdown の表現上、チェックリストの横に難易度を明記しています。
📝 鳴潮風プログラム演習カリキュラム(C言語版)難易度別チェックリスト
難易度 課題 チェック
🟢 初級 struct Character を作成する [ ]
🟢 初級 キャラクター2体を作り、ステータスを表示する [ ]
🟢 初級 ダメージ計算関数 damage(Character *target, int dmg) を作り、HPを減らす [ ]
🟢 初級 struct Skill を作成する [ ]
🟢 初級 スキル発動関数 useSkill(Character *caster, Character *target, Skill *skill) を作る [ ]
🟡 中級 状態異常(麻痺・毒など)を enum で管理し、確率で発動させる [ ]
🟡 中級 whileループでターン制戦闘を実装する [ ]
🟡 中級 各ターンで攻撃・スキル使用を選択できるようにする [ ]
🟡 中級 HPが0になったら終了、勝敗を表示する [ ]
🟡 中級 プレイヤーHP30%以下で「必殺スキルイベント」を発火させる [ ]
🟡 中級 タイマーイベントで5ターンごとに敵がバフを取得する [ ]
🟡 中級 イベント管理用関数 checkEvents(Character *player, Character *enemy, int turn) を作る [ ]
🔴 上級 HP減少関数のテストケースを作る(例:HP=100, damage=30 → HP=70) [ ]
🔴 上級 スキル発動時の状態異常発生確率をシミュレーションで確認する [ ]
🔴 上級 関数ごとに期待結果と実際の出力を比較し、テストする [ ]
🔹 色分けの目安
🟢 初級:構造体・関数の基本理解と操作
🟡 中級:ループ、条件分岐、イベント駆動、状態管理
🔴 上級:テスト駆動、確率処理、シミュレーション、コード品質管理
💡 活用ポイント
各ステージの課題を順番にクリアしながら進める
難易度別に分かれているので、自分のレベルに合わせて挑戦可能
進捗を可視化してモチベーション維持
上級課題は単なる実装だけでなく、テストやシミュレーションも意識して「実戦的なCプログラマ力」を養う
希望であれば、このチェックリストに 課題ごとのサンプルコードやヒント を添付した 完成版練習教材 にも拡張できます。
作りますか?
はい。お願いします。
ChatGPT:
了解です!
では、先ほどの 鳴潮風プログラム演習カリキュラム(難易度別)チェックリスト をさらに拡張し、 課題ごとのサンプルコードや実装ヒント付きの完成版教材 を作りました。
📝 鳴潮風プログラム演習カリキュラム(C言語版)完成版
🟢 初級課題
- struct Character を作成する
サンプルコード
typedef struct {
char name[20];
int hp;
int attack;
int defense;
} Character;
ヒント
typedef struct で型を作ると簡単に変数定義可能
配列で名前を持たせる場合は文字数に注意- キャラクター2体を作り、ステータスを表示する
サンプルコード
Character player = {"Hero", 100, 20, 5};
Character enemy = {"Goblin", 50, 10, 3};
printf("%s HP:%d ATK:%d DEF:%d\n", player.name, player.hp, player.attack, player.defense);
printf("%s HP:%d ATK:%d DEF:%d\n", enemy.name, enemy.hp, enemy.attack, enemy.defense);
ヒント
printf で簡単にステータス表示
初めは固定値でOK、後で入力やランダム値に拡張可能- ダメージ計算関数
サンプルコード
void damage(Character *target, int dmg) {
target->hp -= dmg;
if(target->hp < 0) target->hp = 0;
}
ヒント
ポインタで関数内から構造体を変更
HPが0未満にならないようにチェック- struct Skill を作成する
サンプルコード
typedef struct {
char name[20];
int power;
int cooldown;
} Skill;
ヒント
スキルごとにダメージ・発動条件を管理
後で配列にして複数スキル管理も可能- スキル発動関数
サンプルコード
void useSkill(Character *caster, Character *target, Skill *skill) {
printf("%s uses %s!\n", caster->name, skill->name);
damage(target, skill->power);
}
ヒント
関数でスキルの効果を一元管理
後で状態異常や確率効果を追加
🟡 中級課題- 状態異常を enum で管理
typedef enum { NORMAL, POISONED, PARALYZED } Status;
Status playerStatus = NORMAL;
Status enemyStatus = NORMAL;
ヒント
enumで状態を明確に
条件分岐で状態異常の効果を処理- ターン制戦闘ループ
while(player.hp > 0 && enemy.hp > 0) {
// プレイヤーの行動
// 敵の行動
}
ヒント
whileで勝敗条件を管理
各ターンの処理は関数化すると整理しやすい- イベント管理関数
void checkEvents(Character *player, Character *enemy, int turn) {
if(player->hp < 30) {
printf("%s can use Ultimate!\n", player->name);
}
if(turn % 5 == 0) {
printf("%s gains a buff!\n", enemy->name);
}
}
ヒント
ターン数や状態を条件にイベント発火
イベントごとに関数分割すると管理しやすい
🔴 上級課題- HP減少関数テスト
サンプルテスト
Character testChar = {"Test", 100, 10, 5};
damage(&testChar, 30);
assert(testChar.hp == 70); // を利用
ヒント
単体テストで関数の挙動を検証
他の関数も同様にテストケースを作る- 状態異常確率シミュレーション
if(rand() % 100 < 30) { // 30%で毒
enemyStatus = POISONED;
printf("%s is poisoned!\n", enemy.name);
}
ヒント
rand() で簡単に確率処理
シミュレーション回数を増やして挙動を確認- 関数ごとの期待結果確認
方法
テストケースを作り、assert または printf で結果確認
例:攻撃力計算、スキル効果、状態異常処理
💡 運用のポイント
チェックリストに従って段階的に実装
各ステージでコードをGit管理し、履歴を確認
中級・上級課題は、学んだ内容を自分のプロジェクトに応用
希望であれば、これをさらに 「ステージごとに完成サンプルコード付きPDF教材」 にまとめることもできます。
作りますか?
鳴潮のゲームそのもののコーナとしてプログラミングを組み込んで、課金なくても特典を受けれるように提案したく、企画書を作成してください。
ChatGPT:
承知しました。
では、鳴潮(Wuthering Waves)の ゲーム内コーナーとしてのプログラミング体験企画 の企画書を作成します。
課金不要で特典が得られる設計も組み込んだ形です。
🎮 鳴潮プログラマブルチャレンジ企画書(案)
- 企画名称
「鳴潮コーディングチャレンジ」
ゲーム内でプログラミング演習やミニゲームを体験し、達成度に応じた特典を獲得できるコーナー。- 企画趣旨
プレイヤーが ゲームを楽しみながらプログラミングの基礎を学ぶ 新規コンテンツ。
C/C++/Pythonなど、初級〜中級レベルのプログラミング課題を ブラウザやゲーム内UIで完結。
課金不要で誰でも挑戦可能、特典として ゲーム内アイテムや限定アバター を入手できる。
ゲームの世界観と連動することで、教育的コンテンツに親和性を持たせる。- コンテンツ概要
コンテンツ名 概要 学習内容 特典例
キャラクター管理課題 自分のキャラクターを構造体で作成・ステータス表示 構造体、変数、関数 キャラクター名変更券
スキル発動シミュレーション スキルを使い敵にダメージ 条件分岐、確率計算 スキルエフェクト変更アイテム
簡易戦闘ループ ターン制戦闘で勝利 ループ、状態管理 経験値ボーナス
イベント発火チャレンジ 特定条件でイベント発生 イベント駆動設計 限定称号・バフアイテム
テスト&デバッグ バグ修正・挙動確認 TDD、デバッグ スキン、限定アクセサリー- システム構成案
Webベース or ゲーム内UIでのコード入力
エディタ内でコードを入力、簡単なシミュレーションが実行される
自動判定システム
課題達成条件を満たすと成功判定
成功時にゲーム内特典を付与
段階的難易度
初級:変数・関数
中級:ループ・条件分岐・確率処理
上級:イベント管理・テスト駆動
進捗管理
ゲーム内ミッションとして「達成度」に応じた報酬を可視化- 特典設計(課金不要)
ミッション報酬
限定アバター、スキルエフェクト、称号など
累積報酬
複数課題をクリアで追加アイテムや経験値ボーナス
ランキング報酬
自分の進捗やクリアタイムを表示、SNSシェア可能- ユーザー導線
ゲーム内「鳴潮コーディングチャレンジ」コーナーにアクセス
初級課題から挑戦、コードを入力して即時結果を確認
課題クリアで特典獲得、次の課題に進む
ミッションをすべてクリアすると限定称号・アバター入手- 開発メリット
課金なしでもゲーム体験を強化
教育的価値を付与し、新規プレイヤー獲得に貢献
コミュニティ内でのシェア・ランキング機能で話題性向上
プログラミング学習者層を取り込み、新規ファン層を拡大- 実装上の注意
ブラウザ実行 or サンドボックス環境 で安全にコードを実行
ミッション難易度は段階的に、初学者でも達成感を得られる設計
特典付与のバランス調整でゲーム内経済を崩さない
💡 この企画は、「学びながら楽しむ」教育+ゲーム体験を両立するものです。
希望であれば、この企画書をさらに プレゼン用スライド形式(図解付き) に展開して提出用に整えることもできます。
作りますか?
C++, Python, JAVA, C#, JavaScript, Go, Matlab, Rust, kotlin, Delphiの10言語対応企画として展開してください。
ChatGPT:
了解です。それでは、先ほどの「鳴潮プログラマブルチャレンジ」を 10言語対応版 に拡張した企画書案を作成します。
各言語に対応することで、幅広いプログラマ層・学習層を取り込める構想です。
🎮 鳴潮プログラマブルチャレンジ 10言語対応企画書(案)
- 企画名称
「鳴潮マルチランゲージチャレンジ」
ゲーム内で複数プログラミング言語を選択して課題に挑戦でき、達成度に応じて特典を獲得。- 対応言語
言語 対象層・特徴
C++ システム・ゲーム開発、オブジェクト指向学習
Python 初心者向け、簡単なシンタックスで即時結果確認
Java 企業開発・オブジェクト指向、型安全
C# Unity連携、ゲーム開発・GUI開発
JavaScript Web連携、ブラウザ内実行可
Go 並行処理・サーバーサイド学習
Matlab 数値計算・シミュレーション、学術系ユーザー
Rust 安全性重視のシステム開発
Kotlin Android開発、モバイルアプリ寄り
Delphi レガシー系・RADツール利用者向け- コンテンツ概要(言語共通課題)
ステージ 課題例 学習内容 特典例
初級 キャラクター作成・ステータス表示 構造体/クラス/変数/関数 キャラクター名変更券
初級 スキル発動シミュレーション 関数・条件分岐・確率計算 スキルエフェクト変更アイテム
中級 ターン制戦闘ループ ループ・状態管理・オブジェクト操作 経験値ボーナス
中級 イベント発火チャレンジ イベント駆動・状態監視 限定称号・バフアイテム
上級 テスト&デバッグ TDD・ユニットテスト・シミュレーション 限定スキン・アクセサリー
すべての課題は 言語選択可能。プレイヤーが自身の得意言語や学習したい言語で挑戦可能。- システム構成案
マルチ言語エディタ
ゲーム内またはブラウザで選択言語を切り替え可能
入力したコードをリアルタイムでシミュレーション実行
自動採点・判定システム
言語ごとに課題成功条件を判定
成功時にゲーム内特典を付与
段階的難易度
初級:構造体・クラス・変数・簡単な関数
中級:ループ・条件分岐・状態管理
上級:イベント駆動・確率・テスト駆動・多言語比較
進捗・報酬管理
言語ごとの達成度を可視化
全言語クリアで特別報酬(限定アバターや称号)- 特典設計(課金不要)
課題報酬:言語ごとの課題クリアでアイテムや経験値
累積報酬:同一言語で複数課題をクリアで追加特典
全言語達成報酬:全10言語で課題クリアすると限定スキン・称号を獲得
ランキング報酬:クリアタイム・効率などで競うランキング機能(SNSシェア可能)- ユーザー導線
ゲーム内「マルチランゲージチャレンジ」コーナーにアクセス
言語を選択して初級課題から挑戦
各課題クリアで特典獲得
中級・上級課題に挑戦、ランキングや全言語達成を目指す- 開発メリット
プログラミング学習層の幅広い獲得
ゲーム内教育コンテンツとして話題性向上
無課金でも特典獲得可能で、ライトユーザーを巻き込める
マルチ言語対応でキャリア志向・教育機関向けプロモーションも可能- 実装上の注意
安全なサンドボックス環境 で各言語コードを実行
課題難易度は段階的に調整
特典付与・ゲーム内経済のバランスを保つ
💡 この企画は、ゲーム体験 × マルチ言語プログラミング学習 × 無課金特典 を同時に提供できる、新規性の高い施策です。
希望であれば、このマルチ言語企画を 図解入りスライド形式の提案書 に変換して、社内や運営向けに提出できる形に整えることも可能です。
作りますか?
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。
似た機能を10言語でサンプルをお示しいただけませんか。
ChatGPT:
もちろんです!
では、先ほどの「鳴潮風プログラマブルチャレンジ」の 基本課題(キャラクター作成とHPダメージ計算) を、10言語それぞれでサンプルコードとして示します。
課題内容は共通:
課題
キャラクター名・HP・攻撃力を持つ構造体/クラスを作る
ダメージを与える関数/メソッドを作る
キャラクターのHPを表示する
1️⃣ C++
#include
#include
using namespace std;
struct Character {
string name;
int hp;
int attack;
};
void damage(Character &target, int dmg) {
target.hp -= dmg;
if(target.hp < 0) target.hp = 0;
}
int main() {
Character hero{"Hero", 100, 20};
damage(hero, 30);
cout << hero.name << " HP: " << hero.hp << endl;
}
2️⃣ Python
class Character:
def init(self, name, hp, attack):
self.name = name
self.hp = hp
self.attack = attack
def damage(target, dmg):
target.hp = max(target.hp - dmg, 0)
hero = Character("Hero", 100, 20)
damage(hero, 30)
print(f"{hero.name} HP: {hero.hp}")
3️⃣ Java
class Character {
String name;
int hp;
int attack;
Character(String name, int hp, int attack) {
this.name = name;
this.hp = hp;
this.attack = attack;
}
}
public class Main {
static void damage(Character target, int dmg) {
target.hp -= dmg;
if(target.hp < 0) target.hp = 0;
}
public static void main(String[] args) {
Character hero = new Character("Hero", 100, 20);
damage(hero, 30);
System.out.println(hero.name + " HP: " + hero.hp);
}
}
4️⃣ C#
using System;
class Character {
public string Name;
public int HP;
public int Attack;
}
class Program {
static void Damage(Character target, int dmg) {
target.HP -= dmg;
if(target.HP < 0) target.HP = 0;
}
static void Main() {
Character hero = new Character { Name="Hero", HP=100, Attack=20 };
Damage(hero, 30);
Console.WriteLine($"{hero.Name} HP: {hero.HP}");
}
}
5️⃣ JavaScript (Node.js)
class Character {
constructor(name, hp, attack) {
this.name = name;
this.hp = hp;
this.attack = attack;
}
}
function damage(target, dmg) {
target.hp = Math.max(target.hp - dmg, 0);
}
let hero = new Character("Hero", 100, 20);
damage(hero, 30);
console.log(${hero.name} HP: ${hero.hp}
);
6️⃣ Go
package main
import "fmt"
type Character struct {
Name string
HP int
Attack int
}
func damage(target *Character, dmg int) {
target.HP -= dmg
if target.HP < 0 {
target.HP = 0
}
}
func main() {
hero := Character{"Hero", 100, 20}
damage(&hero, 30)
fmt.Printf("%s HP: %d\n", hero.Name, hero.HP)
}
7️⃣ Matlab
hero.name = 'Hero';
hero.hp = 100;
hero.attack = 20;
function hero = damage(hero, dmg)
hero.hp = max(hero.hp - dmg, 0);
end
hero = damage(hero, 30);
disp([hero.name ' HP: ' num2str(hero.hp)])
8️⃣ Rust
struct Character {
name: String,
hp: i32,
attack: i32,
}
fn damage(target: &mut Character, dmg: i32) {
target.hp -= dmg;
if target.hp < 0 {
target.hp = 0;
}
}
fn main() {
let mut hero = Character { name: "Hero".to_string(), hp: 100, attack: 20 };
damage(&mut hero, 30);
println!("{} HP: {}", hero.name, hero.hp);
}
9️⃣ Kotlin
data class Character(var name: String, var hp: Int, var attack: Int)
fun damage(target: Character, dmg: Int) {
target.hp = (target.hp - dmg).coerceAtLeast(0)
}
fun main() {
val hero = Character("Hero", 100, 20)
damage(hero, 30)
println("${hero.name} HP: ${hero.hp}")
}
🔟 Delphi (Object Pascal)
program CharacterDemo;
{$APPTYPE CONSOLE}
type
TCharacter = class
Name: string;
HP: Integer;
Attack: Integer;
end;
procedure Damage(Target: TCharacter; Dmg: Integer);
begin
Target.HP := Target.HP - Dmg;
if Target.HP < 0 then Target.HP := 0;
end;
var
Hero: TCharacter;
begin
Hero := TCharacter.Create;
Hero.Name := 'Hero';
Hero.HP := 100;
Hero.Attack := 20;
Damage(Hero, 30);
Writeln(Hero.Name, ' HP: ', Hero.HP);
Hero.Free;
end.
💡 ポイント
全言語で課題内容は統一(キャラクター作成+HP計算)
初級課題として 多言語比較学習 が可能
中級以降はスキル・イベント・戦闘ループなどを同様に言語対応できる
もし希望であれば、次のステップとして 各言語で戦闘ループ+スキル発動+状態異常まで対応したサンプル を作り、
「10言語で統一カリキュラム教材」としてまとめることも可能です。
作りますか?
あなた:
はい。お願いします。
ChatGPT:
了解です。
では、先ほどの 10言語対応キャラクター作成+ダメージ計算 を拡張して、 戦闘ループ+スキル発動+状態異常 まで対応したサンプルコード例を作成します。
初級から中級レベルの演習用教材として使えます。
🎮 鳴潮風プログラマブルチャレンジ(10言語サンプル)
共通課題:ターン制戦闘+スキル+状態異常
課題内容
キャラクター作成(名前・HP・攻撃力・防御力)
スキル作成(名前・威力・状態異常付与確率)
ターン制戦闘ループ
状態異常(毒、麻痺)を簡易実装
ダメージ計算+HP更新
各ターン表示と勝敗判定
1️⃣ C++ サンプル
#include
#include
#include
#include
using namespace std;
enum Status { NORMAL, POISONED, PARALYZED };
struct Character {
string name;
int hp;
int attack;
Status status = NORMAL;
};
struct Skill {
string name;
int power;
int poisonChance; // %
};
void damage(Character &target, int dmg) {
target.hp -= dmg;
if(target.hp < 0) target.hp = 0;
}
void applySkill(Character &caster, Character &target, Skill skill) {
cout << caster.name << " uses " << skill.name << "!\n";
damage(target, skill.power);
if(rand() % 100 < skill.poisonChance) {
target.status = POISONED;
cout << target.name << " is poisoned!\n";
}
}
void applyStatusDamage(Character &c) {
if(c.status == POISONED) {
cout << c.name << " takes 5 poison damage!\n";
damage(c, 5);
}
}
int main() {
srand(time(0));
Character hero{"Hero", 100, 20};
Character enemy{"Goblin", 80, 15};
Skill fire{"Fireball", 25, 20};
int turn = 1;
while(hero.hp > 0 && enemy.hp > 0) {
cout << "=== Turn " << turn << " ===\n";
applySkill(hero, enemy, fire);
applyStatusDamage(enemy);
if(enemy.hp <= 0) break;
applySkill(enemy, hero, fire);
applyStatusDamage(hero);
turn++;
}
cout << ((hero.hp > 0) ? "Hero wins!" : "Enemy wins!") << endl;
}
2️⃣ Python サンプル
import random
class Status:
NORMAL = 0
POISONED = 1
PARALYZED = 2
class Character:
def init(self, name, hp, attack):
self.name = name
self.hp = hp
self.attack = attack
self.status = Status.NORMAL
class Skill:
def init(self, name, power, poison_chance):
self.name = name
self.power = power
self.poison_chance = poison_chance
def damage(target, dmg):
target.hp = max(target.hp - dmg, 0)
def apply_skill(caster, target, skill):
print(f"{caster.name} uses {skill.name}!")
damage(target, skill.power)
if random.randint(0, 99) < skill.poison_chance:
target.status = Status.POISONED
print(f"{target.name} is poisoned!")
def apply_status_damage(c):
if c.status == Status.POISONED:
print(f"{c.name} takes 5 poison damage!")
damage(c, 5)
hero = Character("Hero", 100, 20)
enemy = Character("Goblin", 80, 15)
fire = Skill("Fireball", 25, 20)
turn = 1
while hero.hp > 0 and enemy.hp > 0:
print(f"=== Turn {turn} ===")
apply_skill(hero, enemy, fire)
apply_status_damage(enemy)
if enemy.hp <= 0: break
apply_skill(enemy, hero, fire)
apply_status_damage(hero)
turn += 1
print("Hero wins!" if hero.hp > 0 else "Enemy wins!")
3️⃣ Java サンプル
import java.util.Random;
enum Status { NORMAL, POISONED, PARALYZED }
class Character {
String name;
int hp;
int attack;
Status status = Status.NORMAL;
Character(String name, int hp, int attack) {
this.name = name; this.hp = hp; this.attack = attack;
}
}
class Skill {
String name; int power; int poisonChance;
Skill(String name, int power, int poisonChance) {
this.name = name; this.power = power; this.poisonChance = poisonChance;
}
}
public class Main {
static Random rand = new Random();
static void damage(Character target, int dmg) {
target.hp -= dmg;
if(target.hp < 0) target.hp = 0;
}
static void applySkill(Character caster, Character target, Skill skill) {
System.out.println(caster.name + " uses " + skill.name + "!");
damage(target, skill.power);
if(rand.nextInt(100) < skill.poisonChance) {
target.status = Status.POISONED;
System.out.println(target.name + " is poisoned!");
}
}
static void applyStatusDamage(Character c) {
if(c.status == Status.POISONED) {
System.out.println(c.name + " takes 5 poison damage!");
damage(c, 5);
}
}
public static void main(String[] args) {
Character hero = new Character("Hero", 100, 20);
Character enemy = new Character("Goblin", 80, 15);
Skill fire = new Skill("Fireball", 25, 20);
int turn = 1;
while(hero.hp > 0 && enemy.hp > 0) {
System.out.println("=== Turn " + turn + " ===");
applySkill(hero, enemy, fire);
applyStatusDamage(enemy);
if(enemy.hp <= 0) break;
applySkill(enemy, hero, fire);
applyStatusDamage(hero);
turn++;
}
System.out.println((hero.hp > 0) ? "Hero wins!" : "Enemy wins!");
}
}
💡 残りの C#, JavaScript, Go, Matlab, Rust, Kotlin, Delphi のサンプルも同様の構造で作成可能です。
各言語で「キャラクター構造体/クラス、スキル、状態異常、戦闘ループ」を統一して書けます。
もしよければ、次のメッセージで 残り7言語の完全サンプルコード をまとめて提示できます。
作りますか?
はい。お願いします。
ChatGPT:
了解です!
では、先ほどの C++/Python/Java に続き、残り7言語(C#, JavaScript, Go, Matlab, Rust, Kotlin, Delphi)の戦闘ループ+スキル+状態異常サンプル をまとめます。
4️⃣ C# サンプル
using System;
enum Status { NORMAL, POISONED, PARALYZED }
class Character {
public string Name;
public int HP;
public int Attack;
public Status Status = Status.NORMAL;
}
class Skill {
public string Name;
public int Power;
public int PoisonChance;
}
class Program {
static Random rand = new Random();
static void Damage(Character target, int dmg) {
target.HP -= dmg;
if(target.HP < 0) target.HP = 0;
}
static void ApplySkill(Character caster, Character target, Skill skill) {
Console.WriteLine($"{caster.Name} uses {skill.Name}!");
Damage(target, skill.Power);
if(rand.Next(100) < skill.PoisonChance) {
target.Status = Status.POISONED;
Console.WriteLine($"{target.Name} is poisoned!");
}
}
static void ApplyStatusDamage(Character c) {
if(c.Status == Status.POISONED) {
Console.WriteLine($"{c.Name} takes 5 poison damage!");
Damage(c, 5);
}
}
static void Main() {
Character hero = new Character { Name="Hero", HP=100, Attack=20 };
Character enemy = new Character { Name="Goblin", HP=80, Attack=15 };
Skill fire = new Skill { Name="Fireball", Power=25, PoisonChance=20 };
int turn = 1;
while(hero.HP > 0 && enemy.HP > 0) {
Console.WriteLine($"=== Turn {turn} ===");
ApplySkill(hero, enemy, fire);
ApplyStatusDamage(enemy);
if(enemy.HP <= 0) break;
ApplySkill(enemy, hero, fire);
ApplyStatusDamage(hero);
turn++;
}
Console.WriteLine(hero.HP > 0 ? "Hero wins!" : "Enemy wins!");
}
}
5️⃣ JavaScript サンプル (Node.js)
class Status {
static NORMAL = 0;
static POISONED = 1;
static PARALYZED = 2;
}
class Character {
constructor(name, hp, attack) {
this.name = name;
this.hp = hp;
this.attack = attack;
this.status = Status.NORMAL;
}
}
class Skill {
constructor(name, power, poisonChance) {
this.name = name;
this.power = power;
this.poisonChance = poisonChance;
}
}
function damage(target, dmg) {
target.hp = Math.max(target.hp - dmg, 0);
}
function applySkill(caster, target, skill) {
console.log(${caster.name} uses ${skill.name}!
);
damage(target, skill.power);
if(Math.random() * 100 < skill.poisonChance) {
target.status = Status.POISONED;
console.log(${target.name} is poisoned!
);
}
}
function applyStatusDamage(c) {
if(c.status === Status.POISONED) {
console.log(${c.name} takes 5 poison damage!
);
damage(c, 5);
}
}
let hero = new Character("Hero", 100, 20);
let enemy = new Character("Goblin", 80, 15);
let fire = new Skill("Fireball", 25, 20);
let turn = 1;
while(hero.hp > 0 && enemy.hp > 0){
console.log(=== Turn ${turn} ===
);
applySkill(hero, enemy, fire);
applyStatusDamage(enemy);
if(enemy.hp <= 0) break;
applySkill(enemy, hero, fire);
applyStatusDamage(hero);
turn++;
}
console.log(hero.hp > 0 ? "Hero wins!" : "Enemy wins!");
6️⃣ Go サンプル
package main
import (
"fmt"
"math/rand"
"time"
)
type Status int
const (
NORMAL Status = iota
POISONED
PARALYZED
)
type Character struct {
Name string
HP int
Attack int
Status Status
}
type Skill struct {
Name string
Power int
PoisonChance int
}
func damage(target *Character, dmg int) {
target.HP -= dmg
if target.HP < 0 {
target.HP = 0
}
}
func applySkill(caster, target *Character, skill Skill) {
fmt.Printf("%s uses %s!\n", caster.Name, skill.Name)
damage(target, skill.Power)
if rand.Intn(100) < skill.PoisonChance {
target.Status = POISONED
fmt.Printf("%s is poisoned!\n", target.Name)
}
}
func applyStatusDamage(c *Character) {
if c.Status == POISONED {
fmt.Printf("%s takes 5 poison damage!\n", c.Name)
damage(c, 5)
}
}
func main() {
rand.Seed(time.Now().UnixNano())
hero := Character{"Hero", 100, 20, NORMAL}
enemy := Character{"Goblin", 80, 15, NORMAL}
fire := Skill{"Fireball", 25, 20}
turn := 1
for hero.HP > 0 && enemy.HP > 0 {
fmt.Printf("=== Turn %d ===\n", turn)
applySkill(&hero, &enemy, fire)
applyStatusDamage(&enemy)
if enemy.HP <= 0 { break }
applySkill(&enemy, &hero, fire)
applyStatusDamage(&hero)
turn++
}
if hero.HP > 0 {
fmt.Println("Hero wins!")
} else {
fmt.Println("Enemy wins!")
}
}
7️⃣ Matlab サンプル
Status.NORMAL = 0; Status.POISONED = 1; Status.PARALYZED = 2;
hero.name = 'Hero'; hero.hp = 100; hero.attack = 20; hero.status = Status.NORMAL;
enemy.name = 'Goblin'; enemy.hp = 80; enemy.attack = 15; enemy.status = Status.NORMAL;
fire.name = 'Fireball'; fire.power = 25; fire.poisonChance = 20;
turn = 1;
while hero.hp > 0 && enemy.hp > 0
fprintf('=== Turn %d ===\n', turn);
% Hero attacks
enemy.hp = max(enemy.hp - fire.power, 0);
if rand()*100 < fire.poisonChance
enemy.status = Status.POISONED;
fprintf('%s is poisoned!\n', enemy.name);
end
% Poison damage
if enemy.status == Status.POISONED
fprintf('%s takes 5 poison damage!\n', enemy.name);
enemy.hp = max(enemy.hp - 5, 0);
end
if enemy.hp <= 0, break; end
% Enemy attacks
hero.hp = max(hero.hp - fire.power, 0);
if rand()*100 < fire.poisonChance
hero.status = Status.POISONED;
fprintf('%s is poisoned!\n', hero.name);
end
if hero.status == Status.POISONED
fprintf('%s takes 5 poison damage!\n', hero.name);
hero.hp = max(hero.hp - 5, 0);
end
turn = turn + 1;
end
if hero.hp > 0
disp('Hero wins!')
else
disp('Enemy wins!')
end
8️⃣ Rust サンプル
use rand::Rng;
#[derive(PartialEq)]
enum Status { Normal, Poisoned, Paralyzed }
struct Character {
name: String,
hp: i32,
attack: i32,
status: Status,
}
struct Skill {
name: String,
power: i32,
poison_chance: u32,
}
fn damage(target: &mut Character, dmg: i32) {
target.hp -= dmg;
if target.hp < 0 { target.hp = 0; }
}
fn apply_skill(caster: &Character, target: &mut Character, skill: &Skill) {
println!("{} uses {}!", caster.name, skill.name);
damage(target, skill.power);
if rand::thread_rng().gen_range(0..100) < skill.poison_chance {
target.status = Status::Poisoned;
println!("{} is poisoned!", target.name);
}
}
fn apply_status_damage(c: &mut Character) {
if c.status == Status::Poisoned {
println!("{} takes 5 poison damage!", c.name);
damage(c, 5);
}
}
fn main() {
let mut hero = Character { name: "Hero".to_string(), hp: 100, attack: 20, status: Status::Normal };
let mut enemy = Character { name: "Goblin".to_string(), hp: 80, attack: 15, status: Status::Normal };
let fire = Skill { name: "Fireball".to_string(), power: 25, poison_chance: 20 };
let mut turn = 1;
while hero.hp > 0 && enemy.hp > 0 {
println!("=== Turn {} ===", turn);
apply_skill(&hero, &mut enemy, &fire);
apply_status_damage(&mut enemy);
if enemy.hp <= 0 { break; }
apply_skill(&enemy, &mut hero, &fire);
apply_status_damage(&mut hero);
turn += 1;
}
println!("{}", if hero.hp > 0 { "Hero wins!" } else { "Enemy wins!" });
}
9️⃣ Kotlin サンプル
enum class Status { NORMAL, POISONED, PARALYZED }
data class Character(var name: String, var hp: Int, var attack: Int, var status: Status = Status.NORMAL)
data class Skill(val name: String, val power: Int, val poisonChance: Int)
fun damage(target: Character, dmg: Int) {
target.hp = (target.hp - dmg).coerceAtLeast(0)
}
fun applySkill(caster: Character, target: Character, skill: Skill) {
println("${caster.name} uses ${skill.name}!")
damage(target, skill.power)
if ((0..99).random() < skill.poisonChance) {
target.status = Status.POISONED
println("${target.name} is poisoned!")
}
}
fun applyStatusDamage(c: Character) {
if (c.status == Status.POISONED) {
println("${c.name} takes 5 poison damage!")
damage(c, 5)
}
}
fun main() {
val hero = Character("Hero", 100, 20)
val enemy = Character("Goblin", 80, 15)
val fire = Skill("Fireball", 25, 20)
var turn = 1
while (hero.hp > 0 && enemy.hp > 0) {
println("=== Turn $turn ===")
applySkill(hero, enemy, fire)
applyStatusDamage(enemy)
if (enemy.hp <= 0) break
applySkill(enemy, hero, fire)
applyStatusDamage(hero)
turn++
}
println(if (hero.hp > 0) "Hero wins!" else "Enemy wins!")
}
🔟 Delphi サンプル
program BattleDemo;
{$APPTYPE CONSOLE}
uses
SysUtils, Math, Classes;
type
TStatus = (NORMAL, POISONED, PARALYZED);
TCharacter = class
Name: string;
HP: Integer;
Attack: Integer;
Status: TStatus;
end;
TSkill = class
Name: string;
Power: Integer;
PoisonChance: Integer;
end;
procedure Damage(Target: TCharacter; Dmg: Integer);
begin
Target.HP := Max(Target.HP - Dmg, 0);
end;
procedure ApplySkill(Caster, Target: TCharacter; Skill: TSkill);
begin
Writeln(Caster.Name, ' uses ', Skill.Name, '!');
Damage(Target, Skill.Power);
if Random(100) < Skill.PoisonChance then
begin
Target.Status := POISONED;
Writeln(Target.Name, ' is poisoned!');
end;
end;
procedure ApplyStatusDamage(C: TCharacter);
begin
if C.Status = POISONED then
begin
Writeln(C.Name, ' takes 5 poison damage!');
Damage(C, 5);
end;
end;
var
Hero, Enemy: TCharacter;
Fire: TSkill;
Turn: Integer;
begin
Randomize;
Hero := TCharacter.Create; Hero.Name := 'Hero'; Hero.HP := 100; Hero.Attack := 20; Hero.Status := NORMAL;
Enemy := TCharacter.Create; Enemy.Name := 'Goblin'; Enemy.HP := 80; Enemy.Attack := 15; Enemy.Status := NORMAL;
Fire := TSkill.Create; Fire.Name := 'Fireball'; Fire.Power := 25; Fire.PoisonChance := 20;
Turn := 1;
while (Hero.HP > 0) and (Enemy.HP > 0) do
begin
Writeln('=== Turn ', Turn, ' ===');
ApplySkill(Hero, Enemy, Fire);
ApplyStatusDamage(Enemy);
if Enemy.HP <= 0 then Break;
ApplySkill(Enemy, Hero, Fire);
ApplyStatusDamage(Hero);
Turn := Turn + 1;
end;
if Hero.HP > 0 then Writeln('Hero wins!') else Writeln('Enemy wins!');
Hero.Free; Enemy.Free; Fire.Free;
end.
💡 ポイントまとめ
全10言語で ターン制戦闘+スキル+状態異常 を統一して表現
初級〜中級学習者が 言語ごとの書き方・オブジェクト設計 を比較学習可能
このサンプルを基に「鳴潮プログラマブルチャレンジ 10言語版教材」を作ることができる
希望であれば、次のステップで この10言語を統一カリキュラム化して、ステージごとの課題→解説→演習までまとめた教材形式 に整理可能です。
作りますか?
はい。お願いします。
ChatGPT:
了解です。それでは、先ほどの10言語サンプルをもとに、「鳴潮プログラマブルチャレンジ 10言語版」カリキュラム教材案 を作成します。
ステージごとに課題、解説、演習ポイントまで整理した形です。
🎮 鳴潮プログラマブルチャレンジ 10言語版教材案
- 教材の目的
ゲーム内コンテンツを通じて プログラミングの基礎〜中級スキル を学習
10言語対応で、言語ごとの特徴・書き方・オブジェクト設計を比較学習
課金不要で特典(アイテム・称号)獲得を体験しながら学習- 対象言語
C++, Python, Java, C#, JavaScript, Go, Matlab, Rust, Kotlin, Delphi- カリキュラム構成
ステージ1:初級課題(キャラクター作成)
目的:構造体/クラス、変数、関数の基本理解
課題内容:
キャラクター名、HP、攻撃力を定義
HPを表示する関数/メソッドを作成
演習ポイント:
各言語でクラスや構造体の書き方を比較
関数の呼び出し方、値渡し・参照渡しを確認
サンプルコード:前述の「キャラクター作成+HP表示」10言語サンプル
ステージ2:初級課題(スキル発動)
目的:条件分岐、乱数による状態変化
課題内容:
スキルを作成(名前・威力・状態異常確率)
対象キャラクターにスキルを使いHPを減少させる
一定確率で状態異常(毒など)を付与
演習ポイント:
if文、乱数生成方法の言語差を理解
関数/メソッドの引数渡しの違いを学習
サンプルコード:前述の「スキル発動+状態異常」10言語サンプル
ステージ3:中級課題(ターン制戦闘)
目的:ループ処理、状態管理、オブジェクト操作
課題内容:
ターン制戦闘ループを作成
各ターンにスキル発動+状態異常ダメージを適用
勝敗判定を行う
演習ポイント:
whileループ/forループの言語差を理解
オブジェクトの状態変更のタイミングと副作用を確認
サンプルコード:前述の「戦闘ループ+スキル+状態異常」10言語サンプル
ステージ4:上級課題(拡張演習)
目的:イベント駆動、戦略的スキル設計、複数キャラクター管理
課題内容:
複数キャラクターを管理してパーティ戦闘を作る
スキルにクールダウンや属性効果を追加
状態異常の連鎖やバフ/デバフ処理を導入
演習ポイント:
言語ごとのオブジェクト指向設計の違いを比較
複雑なデータ構造の扱い方を学習
デバッグやテスト駆動の基礎理解- 学習フロー
言語選択:自分の学習したい言語を選択
ステージ挑戦:初級→中級→上級の順に課題をクリア
進捗確認:各ステージで成功/失敗をゲーム内表示
特典獲得:クリアに応じて限定アイテム・称号付与
多言語比較:全言語で同じ課題を解き、書き方・設計の違いを理解- 教材の特徴
ゲーム体験+プログラミング学習を同時に提供
10言語対応で学習の幅が広い
初心者~中級者まで 段階的にスキルアップ可能
課題クリアで 報酬や達成感を実感できる
💡 このカリキュラムをさらに ゲーム内UI連携教材+演習手順書 として整理すれば、
教育機関向け教材
オンラインプログラミング学習コンテンツ
ゲーム内学習イベント
としても活用可能です。
もし希望であれば、次のステップとして ステージごとの画面イメージ・UI案・演習解説付きの教材サンプルPDF を作る形まで整えることも可能です。
作りますか?
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。
参照
ChatGPT利用の技4つ with ChatGPT
https://qiita.com/kaizen_nagoya/items/4a178bd6a09a4a471a7f
ChatGPTによるQiita記事の改良と補足
https://qiita.com/kaizen_nagoya/items/20604d6dd0702ab95c2f
ChatGPTによるQiita記事の改良と補足(2)
https://qiita.com/kaizen_nagoya/items/996275307ffc8c1243f8
本から始める 面倒なことはChatGPTにやらせよう by からあげ
https://qiita.com/kaizen_nagoya/items/f5ce2a18db54b5610e4b
MCP入門 〜面倒なことはAIエージェントにやらせよう〜 by からあげ を聞きながら
https://qiita.com/kaizen_nagoya/items/54b648c838fae8d57e38
【松尾研LLMコミュニティ】面倒なことはLLMにやらせよう "Beginning LLM"2024年10月17日 AI(9)
https://qiita.com/kaizen_nagoya/items/efdc23fbe67cdae2126e
設計:ChatGPTで特異解か一般解を求める AI(1)
https://qiita.com/kaizen_nagoya/items/4dec580e16a7c84b0ec4
みんなの使い方から学ぶ
https://qiita.com/kaizen_nagoya/items/8e7de492d896df94a36e
AI・機械学習 昨日、今日、明日
https://qiita.com/kaizen_nagoya/items/adb184c8fc7a65ac9756
DNA LLM and genome for survey 2200 papers by name.
https://qiita.com/kaizen_nagoya/items/ce8a28d6072f340a9d59