
目次
はじめに
学習目標
プロジェクトの作成
コードの解説
拡張版:機能を追加してみよう
追加機能の解説
まとめ
はじめに
今回は、Visual Studioを使ってC#のコンソールアプリケーションで「数当てゲーム」を作成します
このゲームは、ランダムに決定された1から100までの数字を、ユーザーが予想して当てるシンプルなゲームです
この記事では、プログラミング初心者の方でも理解できるよう、一つひとつの処理を詳しく解説していきます
学習目標
- この記事を読み終える頃には、以下のことができるようになります
- Visual Studioでコンソールアプリケーションプロジェクトを作成する
- 乱数生成の仕組みを理解する
- ユーザー入力の受け取りと検証処理を実装する
- 条件分岐(if文)を活用した判定処理を作成する
- ループ処理(while文)でゲームを継続させる
- 例外処理でエラーハンドリングを行う
プロジェクトの作成
1.Visual Studioの起動とプロジェクト作成
- Visual Studioを起動します
- 「新しいプロジェクトの作成」をクリック
- 「コンソールアプリ」を選択(C#)
- プロジェクト名を「NumberGuessingGame」に設定
- 場所を任意のフォルダに指定
- 「作成」をクリック


2.初期コードの確認
プロジェクトを作成すると、Program.csファイルに以下のコードが自動生成されます
<code>csharp// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");</code>
このコードを削除して、数当てゲームのコードを記述していきます
基本版の数当てゲーム実装
まずは最もシンプルな数当てゲームを作成しましょう
以下のコードを書きます
<code>using System;
namespace NumberGuessingGame
{
class Program
{
static void Main(string[] args)
{
// ゲームの説明
Console.WriteLine("=== 数当てゲーム ===");
Console.WriteLine("1から100までの数字を当ててください!");
Console.WriteLine();
// 乱数生成器の作成
Random random = new Random();
int targetNumber = random.Next(1, 101); // 1から100までの乱数
int attempts = 0; // 試行回数
bool isCorrect = false; // 正解フラグ
// ゲームのメインループ
while (!isCorrect)
{
attempts++;
Console.Write($"{attempts}回目の予想を入力してください: ");
// ユーザー入力の取得
string input = Console.ReadLine();
// 入力値の数値変換
if (int.TryParse(input, out int guess))
{
// 予想と正解の比較
if (guess == targetNumber)
{
Console.WriteLine($"正解です!答えは {targetNumber} でした!");
Console.WriteLine($"{attempts} 回で正解しました!");
isCorrect = true;
}
else if (guess < targetNumber)
{
Console.WriteLine("もっと大きい数字です。");
}
else
{
Console.WriteLine("もっと小さい数字です。");
}
}
else
{
Console.WriteLine("有効な数字を入力してください。");
attempts--; // 無効な入力は試行回数に含めない
}
Console.WriteLine();
}
Console.WriteLine("ゲーム終了!何かキーを押してください。");
Console.ReadKey();
}
}
}</code>
コードが書けたらデバックしてみます
デバックに成功すると数当てゲームが始まります
まずは適当な数字を入力しEnterキーを押すと入力した数字より大きいか小さいかヒントが出ます
ヒントをもとに正解の数字を当てるシンプルなゲームが出来ました

コードの解説
乱数生成部分
<code>csharp<code>Random random = new Random(); int targetNumber = random.Next(1, 101);</code></code>
Random クラス: 疑似乱数を生成するためのクラスです。
Next(1, 101): 1以上101未満(つまり1から100まで)の整数を生成します
ユーザー入力処理
<code>csharp<code>string input = Console.ReadLine(); if (int.TryParse(input, out int guess))</code></code>
Console.ReadLine(): ユーザーからの入力を文字列として受け取ります
int.TryParse(): 文字列を整数に変換を試みます。変換に成功した場合はtrueを返し、失敗した場合はfalseを返します。これにより、不正な入力に対する例外処理を安全に行えます。
条件分岐による判定
<code>csharp<code>if (guess == targetNumber)
{
<em>// 正解処理</em>
}
else if (guess < targetNumber)
{
<em>// 数字が小さい場合</em>
}
else
{
<em>// 数字が大きい場合</em>
}</code></code>
この三段階の条件分岐により、ユーザーの予想に対して適切なヒントを提供します
拡張版:機能を追加してみよう
基本版が出来たら、以下の機能を追加してゲームをより楽しくしてみましょう
拡張版の完全なコード
<code>using System;
namespace NumberGuessingGame
{
class Program
{
static void Main(string[] args)
{
bool playAgain = true;
while (playAgain)
{
PlayGame();
Console.WriteLine("\nもう一度プレイしますか? (y/n): ");
string response = Console.ReadLine().ToLower();
playAgain = (response == "y" || response == "yes");
Console.Clear(); // 画面をクリア
}
Console.WriteLine("ゲームを終了します。ありがとうございました!");
Console.ReadKey();
}
static void PlayGame()
{
// ゲームの説明
Console.WriteLine("╔═══════════════════════════════════╗");
Console.WriteLine("║ 数当てゲーム ║");
Console.WriteLine("╚═══════════════════════════════════╝");
Console.WriteLine();
// 難易度選択
int maxNumber = SelectDifficulty();
// 乱数生成
Random random = new Random();
int targetNumber = random.Next(1, maxNumber + 1);
int attempts = 0;
int maxAttempts = CalculateMaxAttempts(maxNumber);
bool isCorrect = false;
Console.WriteLine($"1から{maxNumber}までの数字を{maxAttempts}回以内で当ててください!");
Console.WriteLine();
// ゲームのメインループ
while (!isCorrect && attempts < maxAttempts)
{
attempts++;
Console.Write($"残り{maxAttempts - attempts + 1}回 - 予想を入力してください: ");
string input = Console.ReadLine();
if (int.TryParse(input, out int guess))
{
// 入力範囲チェック
if (guess < 1 || guess > maxNumber)
{
Console.WriteLine($"1から{maxNumber}までの数字を入力してください。");
attempts--; // 無効な入力は試行回数に含めない
continue;
}
// 予想と正解の比較
if (guess == targetNumber)
{
Console.WriteLine("🎉 正解です! 🎉");
Console.WriteLine($"答えは {targetNumber} でした!");
Console.WriteLine($"{attempts} 回で正解しました!");
// スコア評価
EvaluateScore(attempts, maxAttempts);
isCorrect = true;
}
else
{
// ヒントの表示
string hint = GetHint(guess, targetNumber, maxNumber);
Console.WriteLine(hint);
// 温度ヒント(近さを表現)
string temperatureHint = GetTemperatureHint(guess, targetNumber);
Console.WriteLine(temperatureHint);
}
}
else
{
Console.WriteLine("有効な数字を入力してください。");
attempts--;
}
Console.WriteLine();
}
// ゲーム終了時の処理
if (!isCorrect)
{
Console.WriteLine("😢 残念!回数制限に達しました。");
Console.WriteLine($"正解は {targetNumber} でした。");
}
}
static int SelectDifficulty()
{
Console.WriteLine("難易度を選択してください:");
Console.WriteLine("1. 簡単 (1-50)");
Console.WriteLine("2. 普通 (1-100)");
Console.WriteLine("3. 難しい (1-500)");
Console.WriteLine("4. 超難しい (1-1000)");
Console.Write("選択 (1-4): ");
while (true)
{
string input = Console.ReadLine();
switch (input)
{
case "1":
Console.WriteLine("簡単モードを選択しました。");
return 50;
case "2":
Console.WriteLine("普通モードを選択しました。");
return 100;
case "3":
Console.WriteLine("難しいモードを選択しました。");
return 500;
case "4":
Console.WriteLine("超難しいモードを選択しました。");
return 1000;
default:
Console.Write("1から4までの数字を入力してください: ");
break;
}
}
}
static int CalculateMaxAttempts(int maxNumber)
{
// 2進探索の理論値 + 余裕を持たせる
return (int)Math.Ceiling(Math.Log2(maxNumber)) + 3;
}
static string GetHint(int guess, int target, int maxNumber)
{
int difference = Math.Abs(guess - target);
double percentage = (double)difference / maxNumber * 100;
if (guess < target)
{
if (percentage > 50)
return "📈 もっと大きい数字です(かなり離れています)";
else if (percentage > 20)
return "📈 もっと大きい数字です(まあまあ離れています)";
else if (percentage > 5)
return "📈 もっと大きい数字です(少し離れています)";
else
return "📈 もっと大きい数字です(とても近いです!)";
}
else
{
if (percentage > 50)
return "📉 もっと小さい数字です(かなり離れています)";
else if (percentage > 20)
return "📉 もっと小さい数字です(まあまあ離れています)";
else if (percentage > 5)
return "📉 もっと小さい数字です(少し離れています)";
else
return "📉 もっと小さい数字です(とても近いです!)";
}
}
static string GetTemperatureHint(int guess, int target)
{
int difference = Math.Abs(guess - target);
if (difference <= 2)
return "🔥 超熱い!";
else if (difference <= 5)
return "🌡️ 熱い!";
else if (difference <= 10)
return "😊 温かい";
else if (difference <= 20)
return "😐 ぬるい";
else if (difference <= 50)
return "🧊 冷たい";
else
return "❄️ 超冷たい";
}
static void EvaluateScore(int attempts, int maxAttempts)
{
double percentage = (double)attempts / maxAttempts;
if (percentage <= 0.3)
Console.WriteLine("🏆 素晴らしい!天才的です!");
else if (percentage <= 0.5)
Console.WriteLine("🥇 とても良い成績です!");
else if (percentage <= 0.7)
Console.WriteLine("🥈 良い成績です!");
else if (percentage <= 0.9)
Console.WriteLine("🥉 まずまずの成績です。");
else
Console.WriteLine("💪 次回はもっと頑張りましょう!");
}
}
}</code>
上記のコードに上書きが出来れば再度デバックを実行します
先ほどとは違う画面で難易度選択から始まりました
難易度を選択した後は先ほど同様数字を当てていきます


追加機能の解説
1. 難易度選択機能
<code>csharp<code>static int SelectDifficulty()</code></code>
<code>static int SelectDifficulty()
{
Console.WriteLine("難易度を選択してください:");
Console.WriteLine("1. 簡単 (1-50)");
Console.WriteLine("2. 普通 (1-100)");
Console.WriteLine("3. 難しい (1-500)");
Console.WriteLine("4. 超難しい (1-1000)");
Console.Write("選択 (1-4): ");
while (true)
{
string input = Console.ReadLine();
switch (input)
{
case "1":
Console.WriteLine("簡単モードを選択しました。");
return 50;
case "2":
Console.WriteLine("普通モードを選択しました。");
return 100;
case "3":
Console.WriteLine("難しいモードを選択しました。");
return 500;
case "4":
Console.WriteLine("超難しいモードを選択しました。");
return 1000;
default:
Console.Write("1から4までの数字を入力してください: ");
break;
}
}</code>
ユーザーが難易度を選択できる機能です。数字の範囲を変更することで、ゲームの難易度を調整します。
2. 制限回数システム
<code>csharp<code>static int CalculateMaxAttempts(int maxNumber)
{
return (int)Math.Ceiling(Math.Log2(maxNumber)) + 3;
}</code></code>
2進探索の理論値を基に、適切な試行回数制限を設定します。これにより、ゲームにスリルを追加します。
3. 詳細なヒントシステム
- 距離ベースのヒント: 予想と正解の差に基づいてヒントの詳細度を変更
- 温度ヒント: 「熱い」「冷たい」などの直感的な表現でヒントを提供
4. スコア評価システム
<code>csharp<code>static void EvaluateScore(int attempts, int maxAttempts)</code></code>
試行回数に基づいてプレイヤーの成績を評価し、モチベーションを向上させます。
まとめ
- 今回は、Visual StudioでC#コンソールアプリケーションを使った数当てゲームを作成しました
このプロジェクトを通じて、以下の重要な概念を学習できました - 乱数生成: Randomクラスの使用方法
- ユーザー入力処理: Console.ReadLine()とint.TryParse()の活用
- 例外処理: 安全な型変換とエラーハンドリング
- ループ処理: while文を使った繰り返し処理
- 条件分岐: if-else文を使った判定処理
- メソッド分割: 機能ごとのメソッド分割によるコードの整理
この基礎的なゲームを作成できれば、より複雑なアプリケーション開発への第一歩となります
ぜひ様々な機能を追加して、オリジナルのゲームに発展させてください
