![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
下記のような数当てゲームのプログラムを組みました。
using System;
namespace 数当てゲーム
{
class DetermineNumber
{
static void Main(string[] args)
{
// 難易度の設定
int max = 10; //乱数の最大値
int maxTime = 3; //解答できる回数
// 乱数で正解を設定
Random rand = new Random(); // 乱数生成オブジェクトを生成
int answer = rand.Next(1, max); // 乱数が入る
int score = 0; //最終的な点数
int Highscore = 100; //答えた回数で変動する仮の点数
//回答を入力
for (int i = 0; i < maxTime; i++)
{
Console.WriteLine("あと{0}回答えられます、\nいくつでしょうか?", maxTime - i);
int inputNum = int.Parse(Console.ReadLine());
if (inputNum == answer)
{
Console.WriteLine("正解!");
score = Highscore; //得点が入った
break;
}
else if (inputNum > answer)
{
Console.WriteLine("違います,もっと小さいです");
}
else
{
Console.WriteLine("違います,もっと大きいです");
}
Highscore /= 2; //得点が入らないので減点
}
Console.WriteLine("答えは{0}でした\n{1}点", answer, score);
}
}
}
下記の仕様通りにするには何をどう追加すれば良いですか?
・初回で当たらなかった場合、2回目以降で以下を表示
・前回入力より近づいた場合「近づきました」
・前回入力より遠ざかった場合「遠くなりました」
・差が変わらない場合は「変わりません」
No.1ベストアンサー
- 回答日時:
C#は全然分からんのですが、基本的に。
> ・初回で当たらなかった場合、2回目以降で
せっかくforでiをカウンターにしてるので、i = 0かそれ以外で場合分けをする。
>・前回入力より近づいた場合「近づきました」
>・前回入力より遠ざかった場合「遠くなりました」
>・差が変わらない場合は「変わりません」
「前回入力」と言う以上、前回の入力を保持しておく変数かそれに類するモノを作っておく。
そして「近づく」「遠い」と言う以上、C#の絶対値を計算する関数を使って正解からの距離を計算する、と言う事。それによって場合分けをする。
C#は全然知らんので、多分似ているJavaで書くとこんなカンジ。
基本的なロジックはイジってないんで、何を追加すれば良いのか、読んで判断してください。
// ここから。
import java.util.Random;
import java.util.Scanner;
public class DetermineNumber
{
public static void main(String[] args)
{
// 難易度の設定
int max = 10; // 乱数の最大値
int maxTime = 3; // 回答できる回数
// 乱数で正解を設定
Random rand = new Random(); // 乱数生成オブジェクトを生成
int answer = rand.nextInt(max) + 1; // 乱数が入る
int score = 0; // 最終的な点数
int Highscore = 100; // 答えた回数で変動する仮の点数
int lastDistance = 0; // 前回の入力と正解の距離を代入する変数
int currentDistance = 0; // 今回の入力と正解の距離を代入する変数
// 回答を入力
for (int i = 0; i < maxTime; i++)
{
System.out.println("あと" + (maxTime - i) + "回答えられます、\nいくつでしょうか?");
int inputNum = new Scanner(System.in).nextInt();
if (inputNum == answer)
{
System.out.println("正解!");
score = Highscore; // 得点が入った
break;
}
else
{
if (i == 0)
{
if (inputNum > answer)
{
System.out.println("違います、もっと小さいです");
}
else
{
System.out.println("違います、もっと大きいです");
}
}
else
{
currentDistance = Math.abs(inputNum - answer);
if (currentDistance < lastDistance)
{
System.out.println("近づきました");
}
else if (currentDistance > lastDistance)
{
System.out.println("遠くなりました");
}
else
{
System.out.println("変わりません");
}
}
}
Highscore /= 2; // 得点が入らないので減点
lastDistance = Math.abs(inputNum - answer);
}
System.out.println("答えは" + answer + "でした\n" + score + "点");
}
}
// ここまで
他にも、僕がC#知らないし、Javaにも慣れてないので避けていましたが、
・最初からinputNum > answerで判定せず、|inputNum - answer| = 0かどうかで正解判定していれば、コードがもっと短くなる可能性がある。
・正解/不正解のメッセージを配列に詰め込む。配列のインデックスとfor文のiを関連付ければコードがもっと短くなる可能性がある。
ってテクニックがあります。
No.2
- 回答日時:
こんなかな。
入力された値が下記だったりした場合の考慮も必要なら、そういう実装も必要ですね。
・未入力
・文字
・浮動小数
・intを超過する値
・マイナス値
using System;
namespace Game.NumberGuess
{
class Program
{
/// <summary>
/// 回答可能回数。
/// </summary>
private readonly static int AnswerableCount = 3;
/// <summary>
/// エントリポイント。
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
var nq = new NumberQuery();
for (var i = 0; i < AnswerableCount; i++)
{
Console.WriteLine($"あと{AnswerableCount - i}回答えられます、\nいくつでしょうか?");
int answer = int.Parse(Console.ReadLine());
if (nq.CheckAnswer(answer))
{
Console.WriteLine("正解!");
break;
}
Console.WriteLine(GetErrorMessage(nq));
}
Console.WriteLine($"答えは{nq.CorrectAnswer}でした\n{nq.Score}点");
Console.ReadLine();
}
/// <summary>
/// 解答の比較を行い、エラーメッセージを取得する。
/// </summary>
/// <param name="nq">NumberQuery オブジェクト。</param>
/// <returns>エラーメッセージ。</returns>
static string GetErrorMessage(NumberQuery nq)
{
var distance = nq.CompareDistance();
if (nq.AnswerCount == 1)
{
if (distance < 0)
{
return "違います,もっと大きいです";
}
return "違います,もっと小さいです";
}
if (distance < 0)
{
return "近づきました";
}
if (distance > 0)
{
return "遠くなりました";
}
return "変わりません";
}
}
class NumberQuery
{
/// <summary>
/// 正解の算出最大範囲。(10未満を算出するので、10にはならないですよ)
/// </summary>
private readonly int AnswerMaxRange = 10;
/// <summary>
/// 現在の回答回数を取得します。
/// </summary>
public int AnswerCount { get; private set; } = 0;
/// <summary>
/// 正解を取得します。
/// </summary>
public int CorrectAnswer { get; private set; }
/// <summary>
/// 点数を取得します。
/// </summary>
public int Score { get; private set; } = 100;
private int answer;
private int answerDistance = 0;
private int lastAnswerDistance = 0;
/// <summary>
/// 新しい NumberQuery インスタンスを生成します。
/// </summary>
public NumberQuery()
{
var rand = new Random();
CorrectAnswer = rand.Next(1, AnswerMaxRange);
}
/// <summary>
/// 答え合わせをします。
/// </summary>
/// <param name="answer">入力された解答。</param>
/// <returns>true:正解, false:不正解。</returns>
public bool CheckAnswer(int answer)
{
AnswerCount++;
this.answer = answer;
lastAnswerDistance = answerDistance;
answerDistance = Math.Abs(CorrectAnswer - this.answer);
var result = CorrectAnswer == this.answer;
if (!result)
{
Score /= 2;
}
return result;
}
/// <summary>
/// 正解との距離を比較します。
/// </summary>
/// <returns>< 0:正解より小さいor前回解答より近い, > 0:正解より大きいor前回解答より遠い, = 0:前回解答と同じ。</returns>
public int CompareDistance()
{
if (AnswerCount == 1)
{
return answer.CompareTo(CorrectAnswer);
}
return answerDistance.CompareTo(lastAnswerDistance);
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java Java 配列<選挙> 4 2023/07/31 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
論理演算子”||”またはの入力方法
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
java プログラム for 文 while ...
-
JAVAのfor文で困っています。
-
エラー(互換性の無い型)
-
2つのスクロールバーを連動させ...
-
2次元配列の並び替え
-
java 拡張for map
-
countに実行した回数をいれたい...
-
C#の質問
-
テキストボックスに入力された...
-
Java、2の0乗~10乗の表示
-
フローチャートが作れず、困っ...
-
配列から最大値・最小値
-
Java 入力した整数値の合計を、...
-
Randomメソッドの確率設定
-
C言語のポインターに関する警告
-
javaで質問です。 文字列2023/2...
-
flush()とclose()について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
java キーボード入力された値の...
-
テキストボックスに入力された...
-
論理演算子”||”またはの入力方法
-
総称型ArrayList<E>への参照...
-
7つ数字を表示したら改行すると...
-
Ctrl+Zが入力されると終了する...
-
countに実行した回数をいれたい...
-
キーボードから10人分の点数を...
-
Java、2の0乗~10乗の表示
-
Randomメソッドの確率設定
-
数値⇒漢数字変換 java
-
コマンドライン引数の例外処理...
-
Java 入力した整数値の合計を、...
-
javaのエラーが回収できない
-
2つのスクロールバーを連動させ...
-
階乗の式
-
C#の質問
-
Java キーボードから負の数が入...
おすすめ情報