岩纸剪刀胜率不起作用?

Was*_*ama 1 c# visual-studio-2010 visual-studio

计算机和播放器的赢率始终为0%或100%,我不知道为什么.我已经逐步完成了这个问题,似乎没有任何问题,但它没有像我期望的那样工作,因此必定存在某些问题.

abstract class Participant
{
    public int wins;
    float _winRate;

    protected float winRate {
        get
        {
            return _winRate;
        }
        set 
        {
            if (value < 0 || value > 100) 
            {
                throw new Exception("value cannot be less than 0 or greater than 100");
            }
            _winRate = value;
        }
    }
    public void PrintWinRate()
    {
        winRate = (wins / Game_Info.gamesPlayed) * 100;
        string _winRate = "win rate: " + winRate.ToString() + "%";
        Console.WriteLine(_winRate.PadLeft(0));
    }

    public abstract string Choice();
}

class Computer:Participant
{
    string[] Rock_Paper_Scissor = {"rock","paper","scissor"};
    Random rand = new Random();

    public override string Choice()
    {
        string element = Rock_Paper_Scissor[rand.Next(Rock_Paper_Scissor.Length)];
        return element;
    }       
}
class Player:Participant 
{
    public override string Choice() 
    {
        string playerChoice = Console.ReadLine().Trim();
        return playerChoice;
    }
}


struct  Game_Info
{
    public static int gamesPlayed;
}
class Game_Loop
{
    static void Main()
    {
        Console.BackgroundColor = ConsoleColor.Red;
        Console.ForegroundColor = ConsoleColor.Black;
        Computer comp = new Computer();
        Player player = new Player();
        string computerChoice;
        string playerChoice;
        ConsoleKeyInfo input;
        bool playAgain;

        do
        {
            Console.Clear();
            computerChoice = comp.Choice();
            playerChoice = player.Choice();
            Console.Clear();

            while (playerChoice == computerChoice)
            {
                computerChoice = comp.Choice();
            }
            Console.WriteLine("Player: "+ playerChoice);
            Console.WriteLine("\n"+"Computer: " + computerChoice);

            if (playerChoice == "rock" && computerChoice == "scissor" || playerChoice == "paper" && computerChoice == "rock")
            {
                Console.WriteLine("\n" + "You won!");
                player.wins++;
            }
            else if (playerChoice == "scissor" && computerChoice == "rock" || playerChoice == "rock" && computerChoice == "paper")
            {
                comp.wins++;
                Console.WriteLine("\n" + "Computer won!");
            }
            else if (playerChoice == "scissor" && computerChoice == "paper")
            {
                player.wins++;
                Console.WriteLine("\n" + "You won!");
            }
            else if (playerChoice == "paper" && computerChoice == "scissor")
            {
                comp.wins++;
                Console.WriteLine("\n" + "Computer won!");
            }
            else
            {
                Console.WriteLine("\n" + "invalid value");
            }
            Game_Info. gamesPlayed++;
            Console.WriteLine("\n"+"Play again? <y/n>");
            Console.WriteLine("\n");

            int resetPosY = Console.CursorTop;
            int resetPosX = Console.CursorLeft;

            Console.SetCursorPosition(30, 0);
            player.PrintWinRate();
            Console.SetCursorPosition(30, 2);
            comp.PrintWinRate();
            Console.SetCursorPosition(resetPosX,resetPosY);

            input = Console.ReadKey(true);
            playAgain = input.KeyChar == 'y';

        } while (playAgain);         
    }
}
Run Code Online (Sandbox Code Playgroud)

bkr*_*bbs 5

你的问题是该计算中的所有内容都是int.以下是解决此问题的方法:

winRate = ((float)wins / Game_Info.gamesPlayed) * 100;
Run Code Online (Sandbox Code Playgroud)

您必须确保将其视为float而不是int.否则,它将舍入为0或1.这称为类型转换.有关更多详细信息,请参见此处:Typecasting