Делаем «однорукого бандита».

Всем привет,
сегодня мы будем делать игровой автомат.

Суть, у нас будет форма с 3 барабанами, каждый барабан будет содержать только цифры от 0 до 9. Игроку при старте игры будет даваться стартовые $100, он может делать ставки 5-10-15 и т.д до $50, после нажатия рычага, у игрока 5 попыток, выигрыш зависит от количества совпадений и ранга чисел, максимальный выигрыш привязан к 7-7-7

Кому лень читать —  вот исходник [download-attachment id=»1453″ title=»Avtomat-Bandit»].

Примечание: знак двоеточие читать как — «выставляем значение»

Итак, погнали:
1) Создаем проект Windows Forms называем его «avtomat-bandit».
2) Задаем для формы размеры 620×500, атрибут формы FormBorderStyle: FixedSingle — чтобы отключить возможность масштабировать форму.
3) Изменяем атрибут name для Form на name:»Однорукий бандит»
4) Сделаем «барабан» для этого кидаем на форму 3 Label и выставляем им size: 96
5) Добавляем ниже 2 кнопки, для верхней выставляем name:»Погнали!», для нижней name: «Сделать ставку».
6) Теперь реализуем баланс и кол-во неиспользуемых попыток, для этого на уровне верхней кнопки кидаем label, его св-ву text:»Баланс: $100″
7) Ниже добавляем еще одну метку для ее атрибута text:»Выбрать ставку: »
8) справа от этой метки добавляем numericUpDown, для его атрибута value:5 — это значение по умолчанию. Далее, атрибутам increment:5,minimum:5,maximum:50 — Думаю, с min и max все понятно, increment — это значение на которое будет уменьшаться\увеличиваться ставка, в зависимости от нажимаемой кнопки.
9) Ниже добавляем еще один label, для его атрибута text:»Осталось попыток: 0″
10) Последний штрих — кидам на форму 6 таймеров. Первые 3 таймера будут запускать барабаны, они будут иметь следующие имена name:dvg1, name:dvg2, name: dvg3 — всем выставляем interval:25, вторые три таймера будут по очереди останавливать первые три таймера, они будут иметь следующие имена
и интервалы:
name:stop1, inverval:1500
name:stop2, Interval:2500
name:stop3, Interval:3500

С формой мы закончили:

Теперь код:
1) В первую очередь, добавляем переменные, перед public Form()

int balance = 100; //Исходный баланс.
int counter_money = 0; //Текущий ставка.
int counter_try = 0; //Счетчик попыток.
int win_money = 0; //Выигранные деньги.
bool IsActive = true; //Активность кнопки "Погнали!"

2) Теперь создаем обработчики для события Tick, для первых 3-х таймеров

private void dvg1_Tick(object sender, EventArgs e)
{
    Random random = new Random(); //Создаем экземпляр класса Random
    int dvg = random.Next(8); // Получаем случайное число от 0-7
    label1.Text = dvg.ToString(); //Выводим полученное число.
}
private void dvg2_Tick(object sender, EventArgs e)
{
    Random random = new Random();
    int dvg = random.Next(8);
    label2.Text = dvg.ToString();
}
private void dvg3_Tick(object sender, EventArgs e)
{
    Random random = new Random();
    int dvg = random.Next(8);
    label3.Text = dvg.ToString();
}

3) Создаем обработчики для события Tick, для последних 3-х таймеров

        private void stop1_Tick(object sender, EventArgs e)
        {
            dvg1.Enabled = false; //Останавливаем таймер запускающий первый барабан.
            stop1.Enabled = false; //Останавливаем таймер останавливающий первый барабан.
        }
        private void stop2_Tick(object sender, EventArgs e)
        {
            dvg2.Enabled = false;
            stop2.Enabled = false;
        }
        private void stop3_Tick(object sender, EventArgs e)
        {
            counter_try--; //Уменьшаем число попыток.
            dvg3.Enabled = false;
            stop3.Enabled = false;
            Win_Money(); //Проверяем выиграли ли мы что-нибудь :)
            if (IsActive)
            {
                if (counter_try != 0) //Если число попыток больше 0, то даем возможность нажать на кнопку "Погнали!" еще раз, если нет, то блокируем кнопку "Погнали!", и выводим информационное окно.
                {
                    label6.Text = "Осталось попыток: " + counter_try;
                    button1.Enabled = true;
                }
                else
                {
                    label6.Text = "Осталось попыток: " + counter_try;
                    MessageBox.Show("Делайте новую ставку!", "Попытки закончились...", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    button2.Enabled = true;
                }
            }
        }

4) Собственно пишем метод, который будет определять есть ли пары у выпавших чисел

        private void Win_Money()
        {
            if (label1.Text == "0" && label2.Text == "0" && label3.Text == "0") Upd_Win_Money(17);
            if (label1.Text == "1" && label2.Text == "1" && label3.Text == "1") Upd_Win_Money(10);
            if (label1.Text == "2" && label2.Text == "2" && label3.Text == "2") Upd_Win_Money(11);
            if (label1.Text == "3" && label2.Text == "3" && label3.Text == "3") Upd_Win_Money(12);
            if (label1.Text == "4" && label2.Text == "4" && label3.Text == "4") Upd_Win_Money(13);
            if (label1.Text == "5" && label2.Text == "5" && label3.Text == "5") Upd_Win_Money(14);
            if (label1.Text == "6" && label2.Text == "6" && label3.Text == "6") Upd_Win_Money(15);
            if (label1.Text == "7" && label2.Text == "7" && label3.Text == "7") Upd_Win_Money(20);
            if ((label1.Text == "0" && label2.Text == "0") || (label2.Text == "0" && label3.Text == "0")) Upd_Win_Money(7);
            if ((label1.Text == "1" && label2.Text == "1") || (label2.Text == "1" && label3.Text == "1")) Upd_Win_Money(1);
            if ((label1.Text == "2" && label2.Text == "2") || (label2.Text == "2" && label3.Text == "2")) Upd_Win_Money(2);
            if ((label1.Text == "3" && label2.Text == "3") || (label2.Text == "3" && label3.Text == "3")) Upd_Win_Money(3);
            if ((label1.Text == "4" && label2.Text == "4") || (label2.Text == "4" && label3.Text == "4")) Upd_Win_Money(4);
            if ((label1.Text == "5" && label2.Text == "5") || (label2.Text == "5" && label3.Text == "5")) Upd_Win_Money(5);
            if ((label1.Text == "6" && label2.Text == "6") || (label2.Text == "6" && label3.Text == "6")) Upd_Win_Money(6);
            if ((label1.Text == "7" && label2.Text == "7") || (label2.Text == "7" && label3.Text == "7")) Upd_Win_Money(10);
        }

5) Пишем метод который будет рассчитывать выигрыш

private void Upd_Win_Money(int number)
        {
            win_money = counter_money * number; //умножаем ставку на коэффициент получаем кол-во выигранных денег
            DialogResult result = MessageBox.Show("Вы выиграли: $" + win_money, "Поздравляем!", MessageBoxButtons.OK, MessageBoxIcon.Warning); //Выводим поздравления.
            balance = balance + win_money; //Прибавляем выигрыш к балансу
            label4.Text = "Баланс: $" + balance; //Выводим обновленный балансе
            button1.Enabled = false; //Блокируем кнопку "Погнали!"
            button2.Enabled = true; //Открываем кнопку "Сделать ставку"
            IsActive = false; //Это костыль, может кто-то предложит как от него отказаться ))
            if (result == DialogResult.OK)
            {
                MessageBox.Show("Делайте новую ставку!", "Новая игра", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                label6.Text = "Осталось попыток: 0"; // Скидываем оставшиеся попытки.
            }
        }

6) Ну теперь можно заняться инициализацией переменных, для этого создаем еще один метод

 private void Init_Counter(decimal counter)
        {
            counter_money = Convert.ToInt32(counter); //Получаем ставку из элемента numericUpDown
            balance = balance - counter_money; //Вычитаем ставку из баланса.
            label4.Text = "Баланс: $" + balance; // Выводим обновленный баланс
            counter_try = 5; // Зачисляем 5 попыток.
            label6.Text = "Осталось попыток: " + counter_try; //Выводим кол-во попыток на форму.
        }

7) Теперь кнопка «Сделать ставку»
private void button2_Click(object sender, EventArgs e)
{
Init_Counter(numericUpDown1.Value); //Вызываем инициализирующий метод
button1.Enabled = true; // Открываем доступ к кнопке «Погнали!»
button2.Enabled = false; //ЗАкрываем доступ к кнопке «Сделать ставку».
}
8) И последний кусок кода для кнопки «Погнали!»

 private void button1_Click(object sender, EventArgs e)
        {
            //активируем таймеры
            dvg1.Enabled = true; 
            dvg2.Enabled = true;
            dvg3.Enabled = true;
            stop1.Enabled = true;
            stop2.Enabled = true;
            stop3.Enabled = true;
            IsActive = true; 
            button1.Enabled = false; //Пока барабаны крутятся кнопка "Погнали!"  заблокирована.
        }

В общем-то всё, запускаем и получаем удовольствие от игры.
Если есть предложения как улучшить игру кидайте в комменты, если найдете ошибки тоже пиши в комментах)

Делаем «однорукого бандита».: 12 комментариев

  1. Я ещё добавила Form1_Activated {button1.Enabled = false}.
    Если кнопка 2 была не нажата, барабан крутился и попытки уходили в минус.
    Сделала интервал у stop1 больше, чем у stop2, чтобы цифры на барабане появлялись по порядку

  2. Спасибо за пищу для рассуждения!
    Сайт в избранное добавил, жду ещё 10101 пример что можно поделать!

      1. На какой программе вы работаете? И сделайте больше проектов пожааалуйста)

  3. Все работает. Однако сразу же нашёл баг, баланс может списываться до бесконечности. Объявил новую переменную BalCheck и добавил в самое начало Init_Counter строку «balance = BalCheck;». Затем в поле кнопки 2 добавил проверку баланса(balance < 0) и вывел сообщение об окончании средств на балансе, заблокировал кнопку "Погнали!" и присвоил переменной balance значение BalCheck(balance = BalCheck). И всё заработало.

    1. «И всё заработало» — это хорошо, мне приятно, что люди не только просто копируют примеры, но и работают с кодом внутри.

  4. Переменной counter_try необходимо присвоить counter_money, иначе всегда добавляет 5 попыток, даже если выбрать 10-15-50

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.