書籍概要

WEB+DB PRESS plus

小一時間でゲームをつくる
──7つの定番ゲームのプログラミングを体験

著者
発売日
更新日

概要

C言語によるコンソールアプリで,ゲームを一手ずつ作成する手順を解説する,画期的な本の登場です。0から完成まで,手順通りに進めれば必ず完成する仕組みになっています。最小限の手順ごとに動作確認を行うので,それぞれの処理の意味を実感しながら,少しずつできあがっていく過程を楽しめます。

収録ゲームは,ゲームの歴史を代表する定番ジャンルの中から,面白さやバラエティ性を考慮し,選りすぐった珠玉の7本!+それらを改造/拡張してさらに楽しむ付録2本。

必用なのは無料の「Visual Studio Community」のみ。さあ,ゲームプログラミングの旅に出て,難しいクエストも1つずつクリアしていき,夢と冒険に溢れた未知の世界を征服していきましょう!

こんな方におすすめ

  • 本格的なゲームプログラミングを勉強したい方

サンプル

samplesamplesamplesamplesample

目次

  • 本書の概要
  • 収録タイトル
  • 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視点で描画する処理を呼び出す
    • 描画用のアスキーアートを合成する
    • 迷路を描画する
  • クエストを追加する
    • プレイヤーがゴールに到達したかどうかを判定する
    • エンディングのメッセージを表示する

第7章:戦国シミュレーションゲームを作成する──秀吉も仰天! 一夜で戦国シミュレーション

  • 「進軍」コマンドしかない,シンプルな戦国シミュレーションゲーム
  • 本章の戦国シミュレーションゲームの時代背景
    • 時代設定──1570年 信長の天下布武前夜
    • 戦国大名列伝
      • 織田信長
      • 武田信玄
      • 上杉謙信
      • 徳川家康
      • 北条氏政
      • 足利義昭
      • 毛利元就
      • 伊達輝宗
      • 島津義久
      • 長宗我部元親
  • プログラムの基本構造を作成する
    • プログラムのベース部分を作成する
    • コンソールの設定
  • 地図を描画する
    • 大名のデータを作成する
    • 城のデータを作成する
    • 年のデータを作成する
    • 地図を描画する処理を呼び出す
      • 地図を描画する
  • 各城の行動ループを作成する
    • 行動順をランダムにする
    • 各城にターンを回していく
      • ターンの順を描画する
      • 各ターンの共通メッセージを表示する
  • プレイヤーの大名を選択できるようにする
    • プレイヤーの大名の選択フェイズに移行する
    • プレイヤーが担当する大名を選択する
  • 進軍コマンドを作成する
    • 城どうしの接続データを作成する
    • 進軍先の城をキーボード入力する
    • 進軍兵数をキーボード入力する
  • 攻城戦を作成する
    • 攻城戦を発生させる
    • 最初のメッセージを表示する
    • 攻城戦の戦闘を実装する
    • 攻城戦の戦闘を終了する
    • 攻城戦の結果を表示し,戦後処理をする
      • 攻撃側が勝ったときの処理を実装する
      • 守備側が勝ったときの処理を実装する
  • 敵の大名のAIを実装する
    • 隣接した敵の城のリストを作成する
    • 一番弱い敵の城に攻め込む処理を作成する
    • 味方の前線の城に兵を送るAIを実装する
      • 敵と隣接する味方の城のリストを作成する
      • 兵を送る先の城を決定する
      • 送る兵数を決定する
      • 兵を味方の城に送る
  • イベントを追加する
    • 1年経過したときに兵数を変動させる
    • プレイヤーの大名家が滅亡したときの処理を作成する
    • ゲーム終了時に年表を表示する
    • ゲームオーバーで年表を表示する
    • ゲームが終了したらゲームをリセットする
    • プレイヤーが天下統一したときの処理を作成する
    • 歴史イベント「本能寺の変」を追加する
      • 明智光秀
      • 豊臣秀吉

Appendix 1:戦国シミュレーションゲームを三国志に改造する──データの書き換えで,戦国を三国に!

  • 戦国シミュレーションゲームのデータを書き換えて,三国志のゲームに改造する
    • そもそも『三国志』とは何か──四大奇書の一つ『三国志演義』
    • 三国志武将列伝
      • 曹操(孟徳)
      • 劉備(玄徳)
      • 孫策(伯符)
      • 呂布(奉先)
      • 袁紹(本初)
      • 劉表(景升)
      • 劉璋(季玉)
      • 馬騰(寿成)
      • 公孫瓚(伯珪)
      • 李傕(稚然)
    • 時代設定──196年 呂布の台頭と曹操の献帝掌握
  • ゲームデータを書き換える
    • コンソールの設定
    • 君主のデータを書き換える
    • 州のデータを書き換える
    • サンプルの地図を描画する
    • 文字化けを修正する
    • 正式な地図を描画する
    • 州の接続情報を書き換える
  • 戦国時代固有の設定を三国志向けに変更する
    • 兵数の単位を変更する
    • メッセージを修正する

Appendix 2:王道RPG 完全版──戦闘シーンにフィールドシーンを追加して,完全なRPGに仕上げよう!

  • 王道RPGの世界を完全再現したい!──第1章の戦闘シーンを拡張して,完全なRPGにしよう
  • プログラムの基本構造を作成する
    • 第1章のプログラムを拡張する
    • コンソールの設定
  • フィールドを追加する
    • フィールドのデータを作成する
    • フィールドを描画する
  • マップ上にプレイヤーを追加する
    • マップ上にプレイヤーを描画する
    • プレイヤーをキーボード入力で操作する
    • プレイヤーが侵入不可のマスに移動できないようにする
    • プレイヤーの移動に合わせて画面をスクロールする
  • 王様の城を実装する
    • 王様の城のデータを追加する
    • プレイヤーの初期位置を設定する
    • 王様の城を描画する
    • 王様の城からフィールドに出る
    • フィールドから王様の城に入る
    • 人物との会話イベントを実装する
      • 王様との会話イベントを実装する
      • 姫との会話イベントを実装する
  • 魔王の城を実装する
    • 魔王の城のデータを追加する
    • 魔王の城に入れるようにする
    • 魔王の城を描画する
    • 魔王の城からフィールドに出る
    • 魔王との会話イベントを実装する
  • 戦闘を発生させる
    • フィールドで雑魚モンスターと遭遇する
    • 姫にステータスを回復してもらう
    • 魔王とのイベント戦闘を発生させる
    • プレイヤーが死んだら王様のところに戻される
  • エンディングを実装する
  • 索引
  • 著者紹介

サポート

ダウンロード

本書のサンプルファイルをダウンロードできます。

データは,圧縮ファイル形式でダウンロードできます。
圧縮ファイルをダウンロードしていただき,適宜展開してご利用ください。

(2022年5月24日最終更新)

ダウンロード
サンプルファイル

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2022年5月24日最終更新)

P.129 本文の上から1行目

実行して操作すると、画面がずれてしまいます。
実行して操作すると、画面の下のほうが一部乱れてしまいます。

P.129 「落下ブロックを回転させる」2段落目の下のコード

[6-8-9]キーボード入力があったかどうか判定する
[6-8-11]入力されたキーによって分岐する

P.130 本文1段落目の下のコード

[6-8-9]キーボード入力があったかどうか判定する
[6-8-11]入力されたキーによって分岐する

P.136 「落下ブロックとフィールドの当たり判定の関数を作成する」1段落目の下のコードページ


// [6]関数を宣言する場所
...

// [6-1]落下ブロックとフィールドの当たり判定を行う関数を宣言する
bool BlockIntersectField()
{
    return false;// [6-1-8]当たらなかったという結果を返す
}
		

// [6]関数を宣言する場所

// [6-1]落下ブロックとフィールドの当たり判定を行う関数を宣言する
bool BlockIntersectField()
{
    return false;// [6-1-8]当たらなかったという結果を返す
}

...
		

「...」の位置が違います。

P.138 「落下ブロックをキーボード入力で操作するときの当たり判定」1段落目の下のコード

DrawScreen();// [6-7-13]画面を描画する関数を呼び出す
...

P.145 「そろった1行を削除する」2段落目の下のコード

// [6-2-8]対象の列を反復する
// [6-2-8]すべての列を反復する

(以下2022年5月17日更新)

P.69 上から2番目のコード

// [6-7-1]盤面のすべての列を反復する
...
    // [6-7-2]盤面のすべての行を反復する
// [6-7-1]盤面のすべてのを反復する
...
    // [6-7-2]盤面のすべてのを反復する

商品一覧