Wasiim Ouro-sama
Wasiim Ouro-sama

Reputation: 1565

Rock Paper Scissors c# debut how to show winrate?

I recently started making a RPS game console app it worked and I decided to give myself more of a challenge and decided it will be cool if it had a win rate for both computer and player and for some reason it's not showing the win rates on the left side EDIT: So I got it to show left but the percents remain at 0 any idea how to fix this?

abstract class Participant
{
    public int wins;
    int _winRate;

    public int 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 abstract string Choice();
    public abstract void PrintWinRate();
}

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(3)];
        return element;
    }

    public override void PrintWinRate() 
    {
        winRate = (wins / Game_Logic.gamesPlayed) * 100;
        string _winRate = "computer win rate: "+winRate.ToString()+"%".PadRight(10);
        Console.WriteLine(_winRate);
    }
}

class Player : Participant 
{
    public override string Choice() 
    {
        string playerChoice = Console.ReadLine().Trim();
        return playerChoice;
    }

    public override void PrintWinRate()
    {
        winRate = (wins / Game_Logic.gamesPlayed) * 100;
        string _winRate = "player win rate: " + winRate.ToString()+"%".PadRight(10);
        Console.WriteLine(_winRate);
    }
}

class  Game_Logic
{
    public static int gamesPlayed;

    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;
        int computerWins = comp.wins;
        int playerWins = player.wins;

        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")
            {
                playerWins++;
                Console.WriteLine("\n" + "You won!");
            }
            else if (playerChoice == "scissor" && computerChoice == "rock" || playerChoice == "rock" && computerChoice == "paper")
            {
                computerWins++;
                Console.WriteLine("\n" + "Computer won!");
            }
            else if (playerChoice == "scissor" && computerChoice == "paper")
            {
                playerWins++;
                Console.WriteLine("\n" + "You won!");
            }
            else if (playerChoice == "paper" && computerChoice == "scissor")
            {
                computerWins++;
                Console.WriteLine("\n" + "Computer won!");
            }
            else
            {
                Console.WriteLine("\n" + "invalid value");
            }
            Game_Logic.gamesPlayed++;
            Console.WriteLine("\n"+"Play again? <y/n>");
            Console.WriteLine("\n");

            comp.PrintWinRate();
            player.PrintWinRate();

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

Upvotes: 1

Views: 609

Answers (2)

GordonWells
GordonWells

Reputation: 301

Your game is displaying the scores but instantly clears the screen or exits.

Placing the 'PrintWinRate' calls before 'Console.ReadKey' should give you the desired behaviour!

Like this:

Console.WriteLine("\n" + "Play again? <y/n>");
Console.WriteLine("\n");

comp.PrintWinRate();
player.PrintWinRate();

input = Console.ReadKey(true);

Edit: There also seems to be a bug in the calculation for winRate.

You might want to change your value type for 'wins' from 'int' to 'float' so that it can store the fractional part of the calculation. As it is, when you expect a player to have 50% winRate it will show 0. This is because 'int' data types can not hold fractional values and will cut that part off, leaving the whole number - in this case 0.

This code should be closer to what you want:

winRate = (int)((wins / Game_Logic.gamesPlayed) * 100);

Remember to change 'wins' in your base class 'Participant' to be a float!

Upvotes: 2

Joel Legaspi Enriquez
Joel Legaspi Enriquez

Reputation: 1236

First things first, I think there is a problem with the increment logic, not being able to increment the actual values of participant object. playerWins and computerWins are local variables of your main, and considered as new variable, not just as reference of your participant objects. Change the following lines:

  1. playerWins++ to player.wins++ //Change the actual values of participant
  2. computerWins++ to comp.wins++

Next, when you say left? What format specifically would you want? For now try the following lines:

  1. string _winRate = string.Format("player win rate: {0}%", winRate);

Upvotes: 2

Related Questions