Рок бумажные ножницы игровые с окном - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю над игрой «Камень, бумага, ножницы» для школьного задания, но когда я пытаюсь запустить этот скрипт, игра не работает должным образом.Например, когда я нажимаю «Rock», компьютер выбирает то же самое или выбирает бумагу.Но игрок никогда не выигрывает.Я не знаю, как это исправить, я пытался часами.Это мой код:

public partial class MainWindow : Window
{
    string Computer;
    string[] computer = { "Rock", "Paper", "Scissors" };
    Random random = new Random();
    int RandomType;
    string PlayerPicks;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void StoneButton_Click(object sender, RoutedEventArgs e)
    {
        PlayerPicks = "Rock";
        RandomType = random.Next(0, 2);
        Computer = computer[RandomType];
        Game();
    }

    private void PaperButton_Click(object sender, RoutedEventArgs e)
    {
        PlayerPicks = "Paper";
        RandomType = random.Next(0, 2);
        Computer = computer[RandomType];
        Game();
    }

    private void ScissorsButton_Click(object sender, RoutedEventArgs e)
    {
        PlayerPicks = "Scissors";
        RandomType = random.Next(0, 2);
        Computer = computer[RandomType];
        Game();
    }

    void Game()
    {
        string message = "The winner is: ";
        string computerWins = "Computer!";
        string playerWins = "Player!";
        string draw = "N-Nobody?";


        if (PlayerPicks == "Rock" && Computer == "Paper") // Player: Rock, Computer: paper = computer wins
        {
            MessageBox.Show(message + computerWins);
        }
        else if (PlayerPicks == "Rock" && Computer == "Scissors") // Player: Rock, Computer: Scissors = Player wins
        {
            MessageBox.Show(message + playerWins);

        }
        else if (PlayerPicks == "Paper" && Computer == "Scissors") // Player: Paper, Computer: Scissors = Computer wins
        {
            MessageBox.Show(message + computerWins);

        }
        else if (PlayerPicks == "Paper" && Computer == "Rock") // Player: Paper, Computer: Rock = Player wins
        {
            MessageBox.Show(message + playerWins);

        }
        else if (PlayerPicks == "Scissors" && Computer == "Rock") // Player: Scissors, Computer: Rock = Computer wins
        {
            MessageBox.Show(message + computerWins);

        }
        else if (PlayerPicks == "Scissors" && Computer == "Paper") // Player: Scissors, Computer: Paper = Player wins
        {
            MessageBox.Show(message + playerWins);

        }
        if (PlayerPicks == "Scissors" && Computer == "Scissor")
        {
            MessageBox.Show(message + draw);

        }
        if (PlayerPicks == "Paper" && Computer == "Paper")
        {
            MessageBox.Show(message + draw);
        }
        if (PlayerPicks == "Rock" && Computer == "Rock")
        {
            MessageBox.Show(message + draw);
        }

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Вот другой подход.Это было значительно переработано из вашего кода.Сначала я добавил частное System.Random поле члена к классу формы:

private Random _rand = new Random();

Затем я настроил два enum s, одно для "знака руки" (камень, бумага, ножницы) идругой для результата:

public enum HandSign
{
    Rock,           // rock beats scissors
    Paper,          // paper beats rock
    Scissors,       // scissors beats paper
}

public enum Result
{
    Draw,
    ComputerWins,
    PlayerWins
}

Затем я создаю несколько вспомогательных функций, первой для определения следующего хода компьютера:

private HandSign GetRandomPlay()
{
    var result = _rand.Next(0, Enum.GetValues(typeof(HandSign)).Length);
    return (HandSign) result;
}

и следующей - механизм правил для определенияпобедитель:

private Result DetermineWinner(HandSign player, HandSign computer)
{
    if (player == computer)
    {
        return Result.Draw;
    }

    if (player == HandSign.Scissors && computer == HandSign.Rock)
    {
        return Result.ComputerWins;
    }

    if (player == HandSign.Rock && computer == HandSign.Scissors)
    {
        return Result.PlayerWins;
    }

    if (player > computer)
    {
        return Result.PlayerWins;
    }

    //finally, otherwise
    return Result.ComputerWins;
}

Наконец, один, чтобы «сыграть в игру», показывая результаты игры в нескольких ярлыках на форме:

 private void PlayGame(HandSign playerPicks)
 {
     PlayerPicksLbl.Text = playerPicks.ToString();
     var computerPicks = GetRandomPlay();
     ComputerPicksLbl.Text = computerPicks.ToString();
     WinnerLbl.Text = DetermineWinner(playerPicks, computerPicks).ToString();
 }

В этот момент,мои три обработчика нажатия кнопки просто выглядят так (это обработчик Rock):

 private void RockBtn_Click(object sender, EventArgs e)
 {
     PlayGame(HandSign.Rock);
 }

Одним из результатов структурирования вещей таким образом является расширение на «Камни, Бумага, Ножницы, Ящерица, Спок»."все, что вам нужно сделать, это добавить еще две записи в перечисление HandSign, добавить немного больше логики в DetermineWinner и еще две кнопки / обработчики кнопок.

Также обратите внимание, что нет никакого способанеправильно пишется "Ножницы" и все равно есть эта компиляция!

0 голосов
/ 12 декабря 2018

Во-первых, вам нужно использовать random.Next (0,3) (как упомянул Ану Вишван в комментарии). Кроме того, у вас есть опечатка в третьем «если» снизу, где вы набрали Scissor вместо Ножницы .Я бы предложил использовать переменные для этих строк - тогда у вас не будет проблем с опечатками.

0 голосов
/ 12 декабря 2018

Задача 1

RandomType = random.Next(0, 2) генерирует только число от 0 до 1, вам нужно будет сделать RandomType = random.Next(0, 3) Это сгенерирует число от 0 до 2

Задача 2

if (PlayerPicks == "Scissors" && Computer == "Scissor") проверяет, выбрал ли компьютер Scissor вместо Scissors Просто измените его на if (PlayerPicks == "Scissors" && Computer == "Scissors")

0 голосов
/ 12 декабря 2018

В случайном порядке. Далее верхняя граница является эксклюзивной, поэтому вы должны сделать RandomType = random.Next(0, 3);

Кроме того:

if (PlayerPicks == "Scissors" && Computer == "Scissor") у вас вместо "Scissor вместо" Scissor *1007* "s"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...