いちばん失敗した人決定戦

下記のような数当てゲームのプログラムを組みました。

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回目以降で以下を表示
・前回入力より近づいた場合「近づきました」
・前回入力より遠ざかった場合「遠くなりました」
・差が変わらない場合は「変わりません」

A 回答 (2件)

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を関連付ければコードがもっと短くなる可能性がある。

ってテクニックがあります。
    • good
    • 0
この回答へのお礼

javaとC#じゃ違う点が多少ありましたが、コードの形を理解できたので無事完成しました!ありがとうございます!

お礼日時:2021/06/03 13:18

こんなかな。


入力された値が下記だったりした場合の考慮も必要なら、そういう実装も必要ですね。
 ・未入力
 ・文字
 ・浮動小数
 ・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);

    }
  }
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!