ターミナルタイピングRPG「クムドールの試練」 v0.2.0更新:難易度調整とカラー表示追加 | UNIX Cafe

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

ターミナルタイピングRPG「クムドールの試練」 v0.2.0更新:難易度調整とカラー表示追加 | UNIX Cafe

C言語で作っているターミナルタイピングRPG「クムドールの試練」を、v0.2.0 に更新しました。

GitHubでは kumdor-trial という名前で公開しています。

前回の v0.1.0 では、10ステージを最初から最後まで遊べるところまで作りました。

今回の v0.2.0 では、ゲームとしての手応えと、ターミナル画面の読みやすさを中心に調整しています。

主な更新点は次の3つです。

  • ステージごとの課題難易度を調整
  • ステージ6、8、9の課題を増やして後半を強化
  • ターミナル表示にANSIカラーを追加
目次

前半が簡単すぎたので課題を追加する

v0.1.0 の時点では、ステージ構成やストーリーの流れはだいぶ整っていましたが、実際に遊んでみると、前半の課題が少し簡単すぎました。

たとえばステージ1では、fj の単キー課題だけが出ていました。導入としては分かりやすいのですが、敵のHPがある程度増えてくると、単体のキーだけでは少し簡単すぎます。

そこで、前半ステージでは単キー課題を減らし、2文字以上のまとまりやスペース入り課題を増やしました。

ステージ1は、ホームポジションの fj だけを使う方針はそのままです。ただし、課題は次のように連続入力寄りにしています。

static const char *const stage1_words[] = {
    "fj",
    "jf",
    "ff",
    "jj",
    "fff",
    "jjj",
    "fjjf",
    "jffj",
    "ffjj",
    "jjff",
    "f j",
    "j f",
    "fj fj",
    "jf jf",
    "ff jj",
    "fj jf",
    "jff fj"
};

使うキーは少ないままですが、入力する量は増えました。

これで、最初のステージでも「課題を見て、そのまま正確に打つ」感覚が出やすくなりました。

ステージ6を厚くする

今回特に足りないと感じたのがステージ6です。

ステージ6は g h v b n m を扱うステージです。中央から下段にかけて指の担当範囲が広がるので、練習としては重要な場所です。

でも、その割には以前の課題数は少なめでしたので、反復、短い単語、スペースを入れて、課題を増やしました。

static const char *const stage6_words[] = {
    "bgn",
    "gbn",
    "hjm",
    "vbn",
    "nmh",
    "ghvb",
    "bnmg",
    "hgbn",
    "human",
    "moving",
    "gaming",
    "humble",
    "magma",
    "begin",
    "hinge",
    "haven",
    "venom",
    "minimum",
    "gh nm",
    "mvn",
    "bnhg",
    "ghvb nm",
    "vbn gh",
    "magma hub",
    "moving hum",
    "gaming hub",
    "human vim",
    "gnb hmv",
    "humble moving",
    "begin moving",
    "venom human"
};

単なるキー練習だけでなく、短い単語として打つ課題を増やしたことで、少し実戦的になりました。

タイピング練習としては、意味のない文字列だけではなく、短い単語が混ざっているほうが集中しやすいです。

数字ステージを強くする

ステージ9は数字キーのステージです。

最初は 1239090 のような短い数字列が多かったのですが、これも簡単すぎたので、パターンを増やしました。数字キーは、それ単体よりも、記号と混ざったときに難しくなります。

そこで、日付、ID、割合、時刻のような課題を増やしました。

static const char *const stage9_words[] = {
    "405-10",
    "7/27",
    "HP=014",
    "Lv3+5",
    "100%",
    "1,024",
    "3.141",
    "9:00",
    "#2026",
    "ID-405",
    "20/20?",
    "405:027",
    "90%-10",
    "1/2=0.5",
    "X9-027",
    "No.405",
    "7,270",
    "10:20/30",
    "#09-Stage",
    "2026/07/27",
    "HP100% Lv9",
    "ID:405-2026",
    "9090-XY",
    "10 10%",
    "2026#07",
    "405/10:20",
    "No.9-HP4",
    "7:27 PM"
};

数字だけではなく、-/%.:# なども混ざっています。

このあたりから、単にキーを押すだけではなく、画面の課題をよく見て正確に写す必要が出てきます。

後半は大文字小文字と記号を混ぜる

ステージ8と10も調整しました。

ステージ8は総合練習として、大文字、小文字、数字、記号を混ぜています。

static const char *const stage8_words[] = {
    "FJ",
    "AsDf",
    "SWORD",
    "Crystal",
    "KeyMap",
    "ShiftKey",
    "Lv10",
    "HP-2",
    "Fire!",
    "Guard?",
    "Save:1",
    "Stage-8",
    "Type OK",
    "Run Fast",
    "Magic:ON",
    "No_Miss",
    "Kum-Dor",
    "A1b2C3",
    "Sword+1",
    "Gate-Open",
    "Code:405",
    "Map_Q3",
    "Run+Jump",
    "HP=Full",
    "Shift?OK",
    "Book#8",
    "Alert!",
    "Queen_1",
    "Type-Ready"
};

Type OK のようにスペースが入る課題もあります。

今回のゲームでは fgets で1行入力しているので、スペース入り課題もそのまま扱えます。

敵HPと攻撃力も調整する

課題だけ難しくしても、敵がすぐ倒れると練習量が少なくなりますので、各ステージの敵のHPも少し上げることにしました。

たとえば、ステージ1はHP 3から4へ、ステージ6はHP 6から7へ、ステージ9はHP 9で攻撃力4にしています。ただし、敵の反撃はタイプミスの時だけですので、正確に打てればダメージを受けることはありません。

ミスが続くと苦しくなりますが、落ち着いて打てば突破できるくらいのバランスを目指しました。オリジナルのクムドールの剣は、時間制限があったと思いますが、今回は入れていません。

実際に遊んでみると、ステージ6、8、9でそれぞれ2回ずつミスしても、クリアできる程度には余裕がありました。

ターミナル表示に色を付ける

もうひとつ大きな更新は、ターミナル表示のカラー化です。

これまでのゲーム画面は、すべての文字が、ターミナルのモノクロ表示のままでした。

モノクロでも遊ぼうと思えば遊べますが、ステージ情報、敵名、課題、HP、正解やミスのログが同じ見た目で並ぶため、少し区別がつきにくかったのです。

そこで、ANSIエスケープシーケンスで色を付けました。

特に課題の部分が周りの文字に埋もれて見にくかったので、今回のカラー化で見つけやすくなりました。

#define COLOR_RESET   "\033[0m"
#define COLOR_RED     "\033[95m"
#define COLOR_GREEN   "\033[32m"
#define COLOR_YELLOW  "\033[33m"
#define COLOR_BLUE    "\033[34m"
#define COLOR_MAGENTA "\033[35m"
#define COLOR_CYAN    "\033[36m"
#define COLOR_BOLD    "\033[1m"

色分けは、だいたい次のようにしています。

表示
タイトル枠シアン
ステージ見出し黄色
敵名、警告、ミス明るいマゼンタ
課題黄色
正解、回復、完全勝利
セーブ、中断
スコア見出しマゼンタ

最初は敵名や警告を普通の赤にしていましたが、画面で見ると赤が少し強すぎたので、最終的には \033[95m の明るいマゼンタに変更しました。

見た目としては警告感を残しつつ、画面全体が少しやわらかくなります。

NO_COLOR に対応する

色付き表示は便利ですが、誰もが必要としているわけではありません。
例えばログに保存する場合、ANSIカラーコードが混ざって読みづらくなることがあります。
また、色付き表示が見づらい環境や苦手な人もいます。

そこで、NO_COLOR 環境変数に対応しました。

static const char *color(const char *code) {
    return getenv("NO_COLOR") == NULL ? code : "";
}

NO_COLOR が設定されていなければANSIカラーを出します。

NO_COLOR=1 が設定されていれば、カラーコードを出さずにモノクロ表示にします。

実行例は次の通りです。

./kumdor_01

色なしで起動したい場合は、次のようにします。

NO_COLOR=1 ./kumdor_01

macOSの通常のターミナルでは、基本的に NO_COLOR は設定されていないので、そのまま実行すればカラー表示になります。

プレイログを保存したい場合

ターミナルで遊ぶ対話型ゲームなので、通常のリダイレクトでは画面表示が分かりにくくなることがあります。プレイ内容をログとして残したい場合は、`script` コマンドが便利です。

script -q game.log ./kumdor_01

環境によって上の書き方が使えない場合は、次の方法を試してみてください。

script -q game.log
./kumdor_01
exit

ログ保存時の注意

script はターミナルの表示をそのまま記録するため、色付き表示の制御コードもログに残ることがあります。色なしのログが必要な場合は、保存後に ANSI エスケープシーケンスを除去します。

perl -pe 's/\e\[[0-9;]*[mK]//g' game.log > game_plain.log

v0.2.0 にした理由

今回の更新は、バグ修正というより、ゲーム体験の改善です。

  • 課題の難易度を見直した
  • ステージ6、8、9の課題を増やした
  • 敵HPと攻撃力を調整した
  • カラー表示を追加した
  • NO_COLOR に対応した
  • READMEを更新した

内容としては v0.1.1 よりも v0.2.0 のほうが分かりやすいと判断しました。

そこで、include/game.h のバージョン定義も更新しました。

#define GAME_VERSION "v0.2.0"

READMEの表示も v0.2.0 に揃えています。

GitHubへ反映する

今回の更新は、次のような流れでコミットしました。

Tune stage difficulty
Add terminal color output
Bump version to v0.2.0

最後にGitHubへpushし、master の内容を v0.2.0 相当に更新しました。

おわりに

  • v0.1.0 では、まず最後まで遊べる形にすることを優先しました。
  • v0.2.0 では、実際に遊んだときの手応えと見やすさを整えました。

特に、課題部分を黄色にしたことで、ターミナル上でも入力すべき文字列がかなり見つけやすくなりました。

ターミナルゲームは画面がシンプルな分、どこに視線を置くかが大事です。

今回の更新で、C言語の小さなプログラムから、少しずつ「遊びやすいターミナルゲーム」に近づいてきたと思います。

Repository:

C言語の次にUnityやUnreal Engineを学ぶ選択肢

用途ごとに選ぶ C言語のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

目次