石头剪刀布的胜率不正常
本文关键字:不正常 胜率 石头剪刀布 | 更新日期: 2023-09-27 18:06:40
电脑和玩家的胜率总是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);
}
}
你的问题是计算中的所有内容都是int
。下面是解决这个问题的方法:
winRate = ((float)wins / Game_Info.gamesPlayed) * 100;
必须确保它被视为浮点数而不是整型。否则,它将四舍五入到0或1。这被称为类型转换。Typecasting