Member 14819489 Ответов: 2

Если еще заявления - бросьте кости игра


Всем привет,
Я делаю онлайн-курс C# и нуждаюсь в некоторой практике с утверждениями if-else, поэтому у меня есть возможность сделать игру в кости.

В этой игре игрок может поставить определенную сумму денег (до тех пор, пока она меньше или равна отображаемому текущему балансу), бросить три кубика и попытаться победить компьютер. Ближайший игрок до 18 выигрывает, если оба имеют одинаковое общее значение, то это ничья. Игрок может продолжать играть до тех пор, пока у него не кончатся деньги или пока он не решит прекратить игру.

Я хочу использовать оператор try-catch, а также Оператор If Else и иметь вложенные операторы if-else. Я немного застрял на кодирование, если-иначе заявления и получение значения случайным образом генерируется количество кости для каждой плашки, чтобы показать в нередактируемом текстовом поле посвящен каждый умирает в пользовательском интерфейсе.

Кроме того, если я хочу, чтобы игрок начал с баланса в размере 500 долларов, как бы я отобразил это в форме? Я определенно новичок, так что любая помощь будет невероятно признательна! :)

Честно говоря, очень запутался и, как вы можете видеть, я начал, но застрял!

Что я уже пробовал:

public partial class Form1 : Form
    {
        //create random number generator
            Random rollDice = new Random(); 

        public Form1()
        {
            InitializeComponent();
        }

        private void buttonRollDice_Click(object sender, EventArgs e)
        {
            

            decimal currentBalance = 500m;
            decimal betAmount = 0m;
                
            //get amount from current balance
            currentBalance = decimal.Parse(textBoxCurrentBalance.Text);
            //get bet amount form textbox
            betAmount = decimal.Parse(textBoxBetAmount.Text);
          
            //check if bet amount is less than or equal to current balance
            if (betAmount <= currentBalance)
            {
             //create variables for player and computer dice
             int playerDice1 = rollDice.Next(1, 7);
             int playerDice2 = rollDice.Next(1, 7);
             int playerDice3 = rollDice.Next(1, 7);

             int compDice1 = rollDice.Next(1, 7);
             int compDice2 = rollDice.Next(1, 7);
             int compDice3 = rollDice.Next(1, 7);

                if (true)
                {
                    
                }
                    else
                    {
                      
                    }
            }
            else
            {
             MessageBox.Show("Error, Please enter an amount smaller or equal to your current balance");      
            }
        }
    }

2 Ответов

Рейтинг:
2

clwprogrammer

Во-первых, try..catch предназначен для перехвата ошибок в коде. Здесь от этого будет мало толку. Другое дело, что вы захотите объявить переменные в начале класса form. Также рекомендуется создавать константы для любых будущих значений, которые вы, возможно, захотите изменить (например, начальный баланс). в будущем, с помощью этой константы, если вы хотите изменить начальный баланс, вы просто измените эту одну переменную, чтобы вам не пришлось искать весь ваш код, чтобы найти и изменить его каждый раз, когда у вас есть 500:

public partial class Form1 : Form
    {
       //Constants for future updates in case you want to change some base numbers around
       static decimal START_BALANCE = 500;

       //create random number generator
       Random rollDice = new Random(); 
       //some variables
       decimal currentBalance = 0; 
       decimal betAmount = 0;
       //Dice Values
        int player1Dice = 0;
        int player2Dice = 0;
        int player3Dice = 0;
        int playerDiceTotal = 0;

        int comp1Dice = 0;
        int comp2Dice = 0;
        int comp3Dice = 0;
        int compDiceTotal = 0;

        //To determine the winner
        int winner = 0;


Что касается отображения текущего баланса игрока в форме, то лучшим способом было бы создать повторно используемую функцию для обновления пользовательского интерфейса игрока. Пример
private void updateUserInterface()
{
    //Show Currency Amount in USD formatting rules.
    textBoxCurrentBalance.Text = currentBalance.ToString("$#,##0.00");
    //Show Player Dice Values
    txtPlayerDice1.Text = player1Dice.ToString();
    txtPlayerDice2.Text = player2Dice.ToString();
    txtPlayerDice3.Text = player3Dice.ToString();
    txtPlayerTotal.Text = playerDiceTotal.ToString();

    txtComputerDice1.Text =comp1Dice.ToString();
    txtComputerDice2.Text = comp2Dice.ToString();
    txtComputerDice3.Text = comp3Dice.ToString();
    txtComputerTotal.Text = compDiceTotal.ToString();
    if (playerDiceTotal > 0 && compDiceTotal > 0)
    {

        switch (winner)
        {
            case 0:
                label5.Text = "Draw";
                break;
            case 1:
                label5.Text = "Player Wins";
                break;
            case 2:
                label5.Text = "Computer Wins";
                break;

        }
    }

}


Что же касается собственно броска костей
private void buttonRollDice_Click(object sender, EventArgs e)
    {
        Random r = new Random();

        Decimal.TryParse(textBoxBetAmount.Text, out betAmount);

        if (currentBalance > betAmount && textBoxBetAmount.Text != "")
        {
            player1Dice = r.Next(1, 7);
            player2Dice = r.Next(1, 7);
            player3Dice = r.Next(1, 7);
            playerDiceTotal = player1Dice + player2Dice + player3Dice;

            comp1Dice = r.Next(1, 7);
            comp2Dice = r.Next(1, 7);
            comp3Dice = r.Next(1, 7);
            compDiceTotal = comp3Dice + comp2Dice + comp1Dice;



            int playerDiff = 18 - playerDiceTotal;
            int compDiff = 18 - compDiceTotal;

            if (playerDiff > compDiff)
            {
                //computer is closest to 18
                winner = 2;
            }
            else if (playerDiff==compDiff)
            {
                //draw
                winner = 0;
            }
            else if (playerDiff < compDiff)
            {
                //player is closest to 18
                winner = 1;
            }

            updateUserInterface();

        }
        else
        {
            MessageBox.Show("Error, Please enter dollar amount smaller or equal to your Current Balance.");
        }

    }



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

private void InitializeVariables()
    {
        currentBalance = START_BALANCE;
    }


а в конструкторе формы, где вызывается InitializeComponent, мы хотим вызвать функции InitializeVariables и updateUserInterface:
public Form1()
    {
        InitializeComponent();
        InitializeVariables();
        updateUserInterface();
    }


Класс формы в целом:
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        

        //Some constants for future Changes
        static decimal START_BALANCE = 500;
        //

        decimal currentBalance = 0; 
        decimal betAmount = 0;
        int player1Dice = 0;
        int player2Dice = 0;
        int player3Dice = 0;
        int playerDiceTotal = 0;

        int comp1Dice = 0;
        int comp2Dice = 0;
        int comp3Dice = 0;
        int compDiceTotal = 0;

        //0 = draw, 1 = player, 2 = computer
        int winner = 0;

        public Form1()
        {
            InitializeComponent();
            InitializeVariables();
            updateUserInterface();
        }

        private void InitializeVariables()
        {
            currentBalance = START_BALANCE;
        }

        private void buttonRollDice_Click(object sender, EventArgs e)
        {
            Random r = new Random();

            Decimal.TryParse(textBoxBetAmount.Text, out betAmount);

            if (currentBalance > betAmount && textBoxBetAmount.Text != "")
            {
                player1Dice = r.Next(1, 7);
                player2Dice = r.Next(1, 7);
                player3Dice = r.Next(1, 7);
                playerDiceTotal = player1Dice + player2Dice + player3Dice;

                comp1Dice = r.Next(1, 7);
                comp2Dice = r.Next(1, 7);
                comp3Dice = r.Next(1, 7);
                compDiceTotal = comp3Dice + comp2Dice + comp1Dice;
                
                

                int playerDiff = 18 - playerDiceTotal;
                int compDiff = 18 - compDiceTotal;

                if (playerDiff > compDiff)
                {
                    //computer is closest to 18
                    winner = 2;
                }
                else if (playerDiff==compDiff)
                {
                    //draw
                    winner = 0;
                }
                else if (playerDiff < compDiff)
                {
                    //player is closest to 18
                    winner = 1;
                }

                updateUserInterface();

            }
            else
            {
                MessageBox.Show("Error, Please enter dollar amount smaller or equal to your Current Balance.");
            }

        }

        private void updateUserInterface()
        {
            //Show Currency Amount in USD formatting rules.
            textBoxCurrentBalance.Text = currentBalance.ToString("$#,##0.00");
            //Show Player Dice Values
            txtPlayerDice1.Text = player1Dice.ToString();
            txtPlayerDice2.Text = player2Dice.ToString();
            txtPlayerDice3.Text = player3Dice.ToString();
            txtPlayerTotal.Text = playerDiceTotal.ToString();

            txtComputerDice1.Text =comp1Dice.ToString();
            txtComputerDice2.Text = comp2Dice.ToString();
            txtComputerDice3.Text = comp3Dice.ToString();
            txtComputerTotal.Text = compDiceTotal.ToString();
            if (playerDiceTotal > 0 && compDiceTotal > 0)
            {

                switch (winner)
                {
                    case 0:
                        label5.Text = "Draw";
                        break;
                    case 1:
                        label5.Text = "Player Wins";
                        break;
                    case 2:
                        label5.Text = "Computer Wins";
                        break;

                }
            }
                
        }

    }
}


Я знаю, что сделал несколько предложений, в которых я бы использовал лично. У каждого разработчика есть свой собственный способ делать вещи, я просто хотел бы сделать некоторые вещи немного проще для себя, чтобы мне не приходилось повторять один и тот же код снова и снова. Это также приводит к уменьшению количества строк кода. Надеюсь, это вам поможет. Удачи.(Надеюсь, в коде нет никаких опечаток, так как это может быть действительно болезненным поиском).


BillWoodruff

много хороших предложений/кода, но если вы пишете код для OP, помогаете ли вы OP учиться ?

Рейтинг:
1

George Swan

Прежде чем писать какой – либо код, полезно подумать о том, что именно вы пытаетесь сделать и какие шаги вам нужно предпринять для достижения своей цели-чем меньше шагов, тем лучше.
Мне кажется, что у вас есть пять основных процессов в игре. Ввод данных, проверка входных данных, имитация бросков костей, обработка результатов и, наконец, отображение результатов. Если вы можете разбить основные процессы на более мелкие подпроцессы, тем лучше. Каждый процесс требует некоторого размышления о наилучшем способе его реализации. Возьмем в качестве примера моделирование бросков костей. Вот несколько моментов, которые следует рассмотреть.
Как имитировать один бросок кости?
Есть ли у system Random метод, который генерирует число от 1 до 6? Как лучше всего использовать system Random? Подсказка - не создавайте новый экземпляр при каждом вызове метода simulation.
Каков наилучший способ возврата данных, чтобы их можно было легко использовать на следующем этапе?
Для каждого игрока требуется набор из трех бросков кубиков. Лучше ли возвращать коллекцию или просто возвращать каждый бросок в отдельности? Если вы решите вернуть коллекцию, существует ли класс коллекции, который имеет метод суммирования ее содержимого, так что вам не нужно будет писать код для этого?
Наконец, я хотел бы передать вам совет, который был дан мне в мои первые дни: качество вашего кода обратно пропорционально количеству содержащихся в нем операторов if then else. Удачи.