目次
- 本書の概要
 - 収録タイトル
 - C++コンソールアプリの開発環境をセットアップする
 - C++プログラムの記述と,本書の読み進め方
 - レトロゲーム調の「美咲フォント」を利用する
 - サンプルコードのダウンロード
 
第1章:王道RPGの戦闘シーンを作成する──コマンド選択とメッセージ表示によるターン制バトル
- テキストベースで進行するRPGの戦闘シーン
 - プログラムの基本構造を作成する
- プログラムのベース部分を作成する
 - コンソールの設定
 
 - キャラクターのステータスを表示する
- プレイヤーのステータスを作成する
 - プレイヤーのステータスを初期化する
 - プレイヤーのステータスを表示する
 - モンスターのステータスを作成する
 - モンスターのステータスを初期化する
 - モンスターを表示する
 
 - 戦闘の流れを作成する
- 戦闘開始のメッセージを表示する
 - コマンドのデータを作成する
 - 各キャラクターに攻撃をさせる
 
 - コマンド選択インターフェイスを作成する
- コマンドを選択する処理を呼び出す
 - コマンドの一覧を表示する
 - コマンドを選択するカーソルを追加する
- カーソルを描画する
 - カーソルをキーボード入力で操作する
 
 - 選択したコマンドを決定する
 
 - 戦うコマンドを実装する
- 攻撃対象を設定する
 - 相手に与えるダメージを計算する
 - 相手にダメージを与える
 - 敵を倒したときの処理を実装する
 
 - 魔王降臨!──敵をラスボスに差し替える
- ラスボスのデータを追加する
 - モンスターをラスボスに差し替える
 - プレイヤーが死んだときのメッセージを表示する
 - 勇者の能力を書き換えて強くする
 - 逃げるコマンドを実装する
 
 - 回復呪文コマンドを実装する
- 呪文を発動させてHPを回復させる
 - 呪文を唱えたらMPを消費する
 - MPが足りなければ呪文を唱えられないようにする
 
 - 最終決戦──打倒魔王!
 
第2章:ライフゲームを作成する──単純なルールから生成される,複雑な生命シミュレーション
- ライフゲーム──単純なルールから展開される,複雑な生命シミュレーション
- ライフゲームの誕生と発展
 - ライフゲームのルール
 
 - プログラムの基本構造を作成する
- プログラムのベース部分を作成する
 - コンソールの設定
 
 - フィールドを描画する
- フィールドのデータを作成する
 - フィールドを描画する
 
 - 対象のセルがいくつの生きたセルと隣接しているかを数える
- マスごとに隣接するマスの状態をチェックする
 - フィールドの範囲外の座標を無視する
 - フィールドが無限にループしているものとする
 - 隣接する生きたセルの数を数える
 
 - 世代を進行させる
- キーボード入力でシミュレーションを進行させる
- シミュレーション処理を呼び出す
 - 各セルの次の世代での生死判定を行う
 - シミュレーションの結果を画面に反映させる
 
 - シミュレーションを一定時間ごとに自動進行させる
 
 - キーボード入力でシミュレーションを進行させる
 - 任意のパターンをフィールドの中心に配置する
- フィールドを広くする
 - パターンをフィールドに書き込む関数を作成する
 - パターンをフィールドに書き込む関数をテストする
 
 - パターンの例
- 固定物体
 - 振動子
- 固定物体(周期2)
 - パルサー(周期3)
 - 八角形(周期5)
 - 銀河(周期8)
 - ペンタデカスロン(周期15)
 
 - 長寿型
- R-ペントミノ
 - ダイ・ハード
 - どんぐり
 
 - 移動物体
- グライダー
 - 軽量級宇宙船
 - 中量級宇宙船
 - 重量級宇宙船
 
 - 繁殖型
- グライダー銃
 - 小さいパターン
 - シュシュポッポ列車
 - マックス
 - 直線から神秘的な模様
 - 十字から神秘的な模様
 
 
 
第3章:リバーシを作成する──マス目単位のデータ処理とAIの実装
- 2人対戦ボードゲームの定番「リバーシ」
 - プログラムの基本構造を作成する
- プログラムのベース部分を作成する
 - コンソールの設定
 
 - 盤面を描画する
- 盤面を初期化する
 - 盤面を描画する
 - 盤面の初期配置を設定する
 
 - キーボード入力でマスを選択する
- カーソルを描画する
 - カーソルをキーボード入力で操作する
 - カーソルの位置を初期化する
 
 - キーボード入力で石を置く
- 現在のターンを表示する
 - カーソルの座標に石を置く
 - 石を置いたらターンを切り替える
 
 - 石を置けるかどうかの判定を行う
- 石を置けなかった場合の処理を実装する
 - すでに石が置かれているマスには置けないようにする
 - 指定したマスに石を置けるかどうかを判定する
 
 - 挟んだ相手の石をひっくり返す
- 石をひっくり返す処理を追加する
 - 石をひっくり返す
 
 - どこにも石を置けない場合はパスする
- 石を置ける場所があるかどうか判定する関数を作成する
 - どこにも石を置けなければパスする
 
 - 勝敗の結果を表示する
- 結果の表示へ遷移する
 - 勝敗を判定して結果を表示する
 - ゲームが終了したら初期化する
 
 - ゲームモードの選択画面を作成する
- ゲームモードの選択処理に遷移する
 - ゲームモードを一覧表示する
 - ゲームモードをキーボード入力で選択する
- カーソルを表示する
 - キーボード入力で選択を切り替える
 
 - 選択を決定してモード選択画面を抜ける
 - モードごとにAIの担当を設定する
 
 - 石を置くマスを自動で判断するAIを実装する
- AIの処理に遷移する
 - 置けるマスのリストを作成する
 - 置ける場所の中からランダムで置く
 - AIのターンではカーソルを消す
 
 - AIどうしの対戦による観戦モードを追加する
 
第4章:落ち物パズルゲームを作成する──落ちてくるブロックをそろえて消すリアルタイムパズル
- パズルゲームの定番,落ち物パズル
 - プログラムの基本構造を作成する
- プログラムのベース部分を作成する
 - コンソールの設定
 
 - フィールドを作成する
- ゲームを初期化する関数を追加する
 - 画面を描画する関数を追加する
 - フィールドのデータを作成する
 - フィールドを描画する
 
 - 落下ブロックを追加する
- 落下ブロックの種類を定義する
 - 落下ブロックの形状を定義する
 - 落下ブロックのデータを作成する
 - 落下ブロックを初期化する
 - 落下ブロックを描画する
 
 - 落下ブロックをキーボードで操作する
- キーボード入力をする
 - 落下ブロックを移動させる
 - 落下ブロックを回転させる
 
 - ブロックをリアルタイムに落下させる
- ゲームをリアルタイムに進行させる
 - ブロックを落下させる
 
 - 落下ブロックとフィールド上のブロックとの当たり判定を行う
- 落下ブロックとフィールドの当たり判定の関数を作成する
 - 落下ブロックとフィールドの当たり判定を行う
- 落下ブロックをキーボード入力で操作するときの当たり判定
 - 落下ブロックが自動落下するときのフィールドとの当たり判定
 
 
 - 落下ブロックをフィールドに積み上げる
- 新しい落下ブロックを発生させる
 - ブロックが天井まで積み上がったらゲームオーバーにする
 
 - 横にそろった行のブロックを消す
- そろった行のブロックを消す関数を作成する
 - ブロックが横にそろったかどうかを判定する
 - そろった1行を削除する
 - 消した行の上のブロックを下に1マスずらす
 
 
第5章:ドットイートゲームを作成する──リアルタイムアクションと4種のAI
- ビデオゲーム黎明期に大ヒットした「ドットイート」
 - プログラムの基本構造を作成する
- プログラムのベース部分を作成する
 - コンソールの設定
 
 - 迷路を作成する
- 迷路のデータを作成する
 - 迷路を初期化する
 - 迷路を描画する
 
 - プレイヤーを作成する
- プレイヤーのデータを作成する
 - プレイヤーを描画する
 - プレイヤーの初期座標を設定する
 - プレイヤーを操作する
 - プレイヤーと壁の当たり判定を行う
 - プレイヤーを上下左右にループ移動させる
 - プレイヤーがドットを食べるようにする
 
 - 気まぐれモンスターを作成する
- 気まぐれモンスターのデータを作成する
 - 気まぐれモンスターを描画する
 - 一定時間ごとに実行される,リアルタイム処理を実装する
 - モンスターの種類によって,AIの処理を分岐させる
 - 気まぐれモンスターの移動先を取得する
 - 気まぐれモンスターを動かす
 - 気まぐれモンスターが壁を通り抜けないようにする
 - 気まぐれモンスターが後戻りしないようにする
 
 - 追いかけモンスターを作成する
- 追いかけモンスターのデータを追加する
 - 追いかけモンスターを描画する
 - 経路探索アルゴリズムの解説
 - 2点間の最短経路を探索する処理を作成する
- 探索開始地点から各マスへの最短距離を取得する
 - 探索者のマスから各マスへの最短経路を取得する
 
 - 追いかけモンスターを動かす
 - 追いかけモンスターが壁を通り抜けないようにする
 - 追いかけモンスターが後戻りしないようにする
 
 - 先回りモンスターを作成する
- 先回りモンスターのデータを追加する
 - 先回りモンスターを描画する
 - 先回りモンスターの移動先を取得する
- プレイヤーの向きを取得する
 - プレイヤーの3マス先の座標を取得する
 
 - 先回りモンスターを動かす
 
 - 挟み撃ちモンスターを作成する
- 挟み撃ちモンスターのデータを追加する
 - 挟み撃ちモンスターを描画する
 - 挟み撃ちモンスターを動かす
 
 - ゲームオーバーの処理を作成する
- プレイヤーとモンスターが重なったかどうかを判定する処理を作成する
 - ゲームオーバーになったらゲームをリセットする
 - モンスターがプレイヤーに突っ込んできた場合もゲームオーバーにする
 - ゲームオーバーのメッセージを画面中央に表示する
 
 - エンディングの処理を作成する
- ドットをすべて食べ尽くしたかどうかを判定する
 - エンディング画面を作成する
 - ゲームをクリアしたらエンディング画面を表示する
 
 
第6章:擬似3Dダンジョンゲームを作成する──アスキーアートによる擬似3D描画のギミック
- ビデオゲーム黎明期のRPGのスタンダード,擬似3Dダンジョン
- コンピュータRPGの原点『ウィザードリィ』の誕生
 - 『ウィザードリィ』の国内への影響
 - 疑似3D視点のギミックに迫る
 
 - プログラムの基本構造を作成する
- プログラムのベース部分を作成する
 - コンソールの設定
 
 - デバッグ用のマップを描画する
- 迷路のデータを作成する
 - 迷路のマップを描画する
 
 - 迷路をランダムで生成する
- 迷路を生成するアルゴリズム
 - 迷路をランダムで作成する処理を呼び出す
 - 迷路のすべてのマスを壁で塞ぐ
 - 壁を掘る関数を作成する
 - 壁を掘ってよいかどうかを判定する
 - 最初の通路を生成する
 - 掘るべき壁をすべて掘り尽くす
 
 - 迷路を移動できるようにする
- マップにプレイヤーを表示する
 - キーボード入力でプレイヤーを操作する
- 方向転換する
 - 進行方向に前進する
 
 
 - 迷路を擬似3D描画する
- 擬似3D描画用のデータを作成する
- 迷路のアスキーアートを作成する
 - アスキーアート参照用のテーブルを作成する
 - 視界内の相対座標のテーブルを作成する
 
 - 迷路を擬似3D視点で描画する処理を呼び出す
 - 描画用のアスキーアートを合成する
 - 迷路を描画する
 
 - 擬似3D描画用のデータを作成する
 - クエストを追加する
- プレイヤーがゴールに到達したかどうかを判定する
 - エンディングのメッセージを表示する
 
 
第7章:戦国シミュレーションゲームを作成する──秀吉も仰天! 一夜で戦国シミュレーション
- 「進軍」コマンドしかない,シンプルな戦国シミュレーションゲーム
 - 本章の戦国シミュレーションゲームの時代背景
- 時代設定──1570年 信長の天下布武前夜
 - 戦国大名列伝
- 織田信長
 - 武田信玄
 - 上杉謙信
 - 徳川家康
 - 北条氏政
 - 足利義昭
 - 毛利元就
 - 伊達輝宗
 - 島津義久
 - 長宗我部元親
 
 
 - プログラムの基本構造を作成する
- プログラムのベース部分を作成する
 - コンソールの設定
 
 - 地図を描画する
- 大名のデータを作成する
 - 城のデータを作成する
 - 年のデータを作成する
 - 地図を描画する処理を呼び出す
- 地図を描画する
 
 
 - 各城の行動ループを作成する
- 行動順をランダムにする
 - 各城にターンを回していく
- ターンの順を描画する
 - 各ターンの共通メッセージを表示する
 
 
 - プレイヤーの大名を選択できるようにする
- プレイヤーの大名の選択フェイズに移行する
 - プレイヤーが担当する大名を選択する
 
 - 進軍コマンドを作成する
- 城どうしの接続データを作成する
 - 進軍先の城をキーボード入力する
 - 進軍兵数をキーボード入力する
 
 - 攻城戦を作成する
- 攻城戦を発生させる
 - 最初のメッセージを表示する
 - 攻城戦の戦闘を実装する
 - 攻城戦の戦闘を終了する
 - 攻城戦の結果を表示し,戦後処理をする
- 攻撃側が勝ったときの処理を実装する
 - 守備側が勝ったときの処理を実装する
 
 
 - 敵の大名のAIを実装する
- 隣接した敵の城のリストを作成する
 - 一番弱い敵の城に攻め込む処理を作成する
 - 味方の前線の城に兵を送るAIを実装する
- 敵と隣接する味方の城のリストを作成する
 - 兵を送る先の城を決定する
 - 送る兵数を決定する
 - 兵を味方の城に送る
 
 
 - イベントを追加する
- 1年経過したときに兵数を変動させる
 - プレイヤーの大名家が滅亡したときの処理を作成する
 - ゲーム終了時に年表を表示する
 - ゲームオーバーで年表を表示する
 - ゲームが終了したらゲームをリセットする
 - プレイヤーが天下統一したときの処理を作成する
 - 歴史イベント「本能寺の変」を追加する
- 明智光秀
 - 豊臣秀吉
 
 
 
Appendix 1:戦国シミュレーションゲームを三国志に改造する──データの書き換えで,戦国を三国に!
- 戦国シミュレーションゲームのデータを書き換えて,三国志のゲームに改造する
- そもそも『三国志』とは何か──四大奇書の一つ『三国志演義』
 - 三国志武将列伝
- 曹操(孟徳)
 - 劉備(玄徳)
 - 孫策(伯符)
 - 呂布(奉先)
 - 袁紹(本初)
 - 劉表(景升)
 - 劉璋(季玉)
 - 馬騰(寿成)
 - 公孫瓚(伯珪)
 - 李傕(稚然)
 
 - 時代設定──196年 呂布の台頭と曹操の献帝掌握
 
 - ゲームデータを書き換える
- コンソールの設定
 - 君主のデータを書き換える
 - 州のデータを書き換える
 - サンプルの地図を描画する
 - 文字化けを修正する
 - 正式な地図を描画する
 - 州の接続情報を書き換える
 
 - 戦国時代固有の設定を三国志向けに変更する
- 兵数の単位を変更する
 - メッセージを修正する
 
 
Appendix 2:王道RPG 完全版──戦闘シーンにフィールドシーンを追加して,完全なRPGに仕上げよう!
- 王道RPGの世界を完全再現したい!──第1章の戦闘シーンを拡張して,完全なRPGにしよう
 - プログラムの基本構造を作成する
- 第1章のプログラムを拡張する
 - コンソールの設定
 
 - フィールドを追加する
- フィールドのデータを作成する
 - フィールドを描画する
 
 - マップ上にプレイヤーを追加する
- マップ上にプレイヤーを描画する
 - プレイヤーをキーボード入力で操作する
 - プレイヤーが侵入不可のマスに移動できないようにする
 - プレイヤーの移動に合わせて画面をスクロールする
 
 - 王様の城を実装する
- 王様の城のデータを追加する
 - プレイヤーの初期位置を設定する
 - 王様の城を描画する
 - 王様の城からフィールドに出る
 - フィールドから王様の城に入る
 - 人物との会話イベントを実装する
- 王様との会話イベントを実装する
 - 姫との会話イベントを実装する
 
 
 - 魔王の城を実装する
- 魔王の城のデータを追加する
 - 魔王の城に入れるようにする
 - 魔王の城を描画する
 - 魔王の城からフィールドに出る
 - 魔王との会話イベントを実装する
 
 - 戦闘を発生させる
- フィールドで雑魚モンスターと遭遇する
 - 姫にステータスを回復してもらう
 - 魔王とのイベント戦闘を発生させる
 - プレイヤーが死んだら王様のところに戻される
 
 - エンディングを実装する
 
- 索引
 - 著者紹介