Для интереса, решил поискать в интернете и, на удивление, не нашёл ни одного, удовлетворившего бы меня, решения по игре «Ним». И решил поделиться с Вами собственным кодом.

«Ним» — математическая игра, в которой два игрока по очереди берут предметы, разложенные на несколько кучек. За один ход может быть взято любое количество предметов (большее нуля) из одной кучки. Выигрывает игрок, взявший последний предмет.

image

Давайте немножко уточним. В данной игре: 2 игрока, из одной кучки, берут спички от 1 до 5. Выигрывает тот, кто возьмёт последнюю.

Теперь нужно выработать тактику, по которой будет играть Компьютер. Для победы Компьютер должен отнимать такое количество, чтобы Игроку в конце осталось 6 спичек. То есть: Компьютер должен отнимать остаток от деления на «6». Если же, изначально, игрок действует по данной тактике, т.е. остаток от деления на 6 будет равен нулю, а нуль мы не можем отнять, то мы будет отнимать рандомное значение.

Теперь, когда у нас есть тактика, мы можем приступить к написанию нашей игры.

Первым делом задаём форму нашей программы(Скриншот сверху), она будет состоять из 6 Button, 1 textBox, 2 Label и Timer.
В textBox мы будем вводить количество спичек, для начала игры, его я назвал «Spi4ki». Кнопку начала игры я назвал «StartGame». Label(по центру), в котором будет показывать оставшееся кол-во спичек, я назвал «Kol». Label, в котором будет показываться кто ходит, я назвал «Hod». А остальные кнопки для того, чтобы забрать спички я оставил «button1», 2, 3, 4 и 5.


Переходим к написанию функционала. Зададим переменную типа int, которая будет отвечать за то, кто ходит:

int player = 0;

«Один» — ходит Игрок.
«Два» — Ходит компьютер.

Теперь нужно сделать начало игры. По кнопке «StartGame» устанавливаем кол-во спичек и какой игрок ходит:

        private void StartGame_Click(object sender, EventArgs e)
        {                               
            Kol.Text = Spi4ki.Text;
            Hod.Text = "Ходит: Игрок";
            player = 1;
        }

Следующим шагом мы добавим функционал на кнопки «1»,«2»,«3»,«4»,«5», для того, что бы игрок мог забрать спички. Для этого в:

private void button1_Click(object sender, EventArgs e)

Нужно будет реализовать забор спичек и запустить функцию «Chel()», что это за функция узнаем позже.

        private void button1_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 1);
                Chel();
            }
        }

Точно так-же проделываем с остальными и не забываем менять отнимаемое значение:

        private void button1_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 1);
                Chel();
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 2);
                Chel();
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 3);
                Chel();
            }
        }
        private void button4_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 4);
                Chel(); 
            }
        }
        private void button5_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 5);
                Chel(); 
            }
        }

Далее. Что за функция «Chel()»? Она будет анализировать кол-во спичек и в зависимости от их кол-ва показывать победили Вы или нет. А также, запускать таймер на ход Компьютера и устанавливать переменной «player» значение «2»(Ходит: Компьютер).

        private void Chel()
        {
            timer1.Start();//Запускаем таймер
            player = 2;//Ходит Компьютер
            if (Convert.ToInt32(Kol.Text) == 0) MessageBox.Show("Вы победили!");          
            Hod.Text = "Ходит: Компьютер";       
        }

Аналогичную функцию нам нужно создать и для Компьютера, но вызывать мы её будем в таймере, ниже:

        private void Prog()
        {
            timer1.Stop();//Останавливаем таймер
            player = 1;//Ходит Игрок
            if (Convert.ToInt32(Kol.Text) <= 0) MessageBox.Show("Победил Lev_Popov!");
            Hod.Text = "Ходит: Игрок";         
        }

Когда у нас готов функционал для человеческого участия в игре, нам остаётся добавить основную часть. Как же будет работать компьютер. Как мы обговаривали ранее, Компьютер должен отнимать остаток от деления на «6».

        private void timer1_Tick(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);//Оставшееся кол-во спичек
            if (player == 2)//Если ходит Компьютер
            {
                double i = Convert.ToDouble(Kol.Text);//Конвертируем в тип Double
                double h = i % 6;//h - это и есть остаток от деления на 6
                if (Convert.ToDouble(h) == 0)//Если h = 0, то отнимаем рандомное число
                {
                    Random r = new Random();//Рандом
                    int a = r.Next(1, 5);//Переменная типа int (1...5)
                    Kol.Text = Convert.ToString(Conv - Convert.ToInt32(a.ToString()));//Отнимаем рандомное число
                    Prog();//Запускаем ф-цию Prog()
                }
                else//Иначе
                {
                    Kol.Text = Convert.ToString(Conv - Convert.ToInt32(h));//Отнимаем остаток от деления на 6
                    Prog();//Запускаем ф-цию Prog()
                }              
            }
        }

Весь код:
using System;
using System.Windows.Forms;

namespace Matches
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int player = 0;

        private void button2_Click(object sender, EventArgs e)
        {                               
            Kol.Text = Spi4ki.Text;
            Hod.Text = "Ходит: Игрок";
            player = 1;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 1);
                Chel();
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 2);
                Chel();
            }
        }
        private void button4_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 3);
                Chel();
            }
        }
        private void button5_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 4);
                Chel(); 
            }
        }
        private void button6_Click(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 1)
            {
                Kol.Text = Convert.ToString(Conv - 5);
                Chel(); 
            }
        }
        private void Prog()
        {
            timer1.Stop();
            player = 1;
            if (Convert.ToInt32(Kol.Text) <= 0) MessageBox.Show("Победил Lev_Popov!");
            Hod.Text = "Ходит: Игрок";         
        }
        private void Chel()
        {
            timer1.Start();
            player = 2;
            if (Convert.ToInt32(Kol.Text) == 0) MessageBox.Show("Вы победили!");          
            Hod.Text = "Ходит: Компьютер";       
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            int Conv = Convert.ToInt32(Kol.Text);
            if (player == 2)
            {
                double i = Convert.ToDouble(Kol.Text);
                double h = i % 6;
                if (Convert.ToDouble(h) == 0)
                {
                    Random r = new Random();
                    int a = r.Next(1, 5);
                    Kol.Text = Convert.ToString(Conv - Convert.ToInt32(a.ToString()));
                    Prog();
                }
                else
                {
                    Kol.Text = Convert.ToString(Conv - Convert.ToInt32(h));
                    Prog();
                }              
            }
        }
    }
}


Собственно это всё. Спасибо за внимание! Надеюсь, вам пригодилась данная информация.

Комментарии (0)