Опубликован: 09.12.2017 | Доступ: свободный | Студентов: 744 / 32 | Длительность: 02:06:00
Специальности: Программист
Лекция 5:

Игра "Быки и коровы"

< Лекция 1 || Лекция 5: 123456

Быки и коровы в картинках

(краткое содержание пропущенной записи следующего урока)

На следующем уроке рассматривался вариант игры "Быки и коровы", в котором компьютер задумывал комбинацию, состоящую из картинок, случайным образом выбранных из некоторого множества картинок. Задача игрока состояла в отгадывании задуманной комбинации, предъявляя свой вариант комбинации. Принципиально алгоритмы схожи. Роль цифр в данном варианте играют картинки. Помимо того, что играть с картинками интереснее, чем с цифрами, нам это дает возможность продемонстрировать работу с графическими объектами как в интерфейсе Windows проекта, так и в программном коде.

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

Интерфейс игры "Быки и коровы" в графическом варианте

увеличить изображение
Рис. 5.2. Интерфейс игры "Быки и коровы" в графическом варианте

На рисунке можно видеть большое число элементов управления типа PictureBox. Эти объекты имеют свойство Image, позволяющее хранить и отображать картинки – объекты типа Image. Двенадцать таких объектов хранят картинки геометрических фигур разного цвета и формы, которые используются как для комбинации, задуманной компьютером, так и для варианта комбинации, предлагаемой игроком.

Как компьютер "задумывает" комбинацию из картинок

Приведем фрагмент кода обработчика события Click командной кнопки "Компьютер, задумай комбинацию", создающий комбинацию:

//задуманная комбинация
            for (int i = 0; i < N; i++)
            {
                index = rnd.Next(0, M);                
                comb[i] = images[index];
                comb_text[i] = images_text[index];
            }

Здесь N – размер комбинации, определяемый в зависимости от уровня игры. Как обычно, метод Next, вызываемый переменной rnd класса Random, возвращает случайное число, которое задает индекс элемента массива images. Этот элемент и становится очередной картинкой комбинации – элементом массива comb. Массивы comb и images хранят элементы типа Image. Параллельно создается массив comb_text, содержащий текстовое описание картинки. Тексты используются при сравнении задуманной комбинации с предлагаемым игроком вариантом. Конечно можно отображать картинки в числа, но для понимания программы работа с текстами предпочтительнее.

Я не буду останавливаться на других деталях работы алгоритма. Идейно он похож на вариант, где работа ведется с числами. Конечно для полного понимания следует разобрать код прилагаемого проекта, выполняя его в пошаговом режиме.

Как компьютер "отгадывает" комбинацию из картинок

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

/// <summary>
        /// Стратегия компьютера отгадывания задуманной комбинации
        /// </summary>
        void CompStrategy()
        {
            Init();     //Инициализация данных
            int i = 0;
            while (i < M && !all_oxes)
            {
                //Определение фигур, участвующих в комбинации
                FormComb(i);    //variant_text - комбинация из элемента i
                string q = OxAndCow();  // подсчет быков в комбинации
                Question(q);  //вывод вопроса и ответа 
                Answer_Analyze(i);
                //Если все фигуры определены и определена фигура,
                //не участвующая в комбинации
                if (Index == N && exist_null)
                {
                    PlaceIn_oxes(); //Расставить быков по местам
                }
                i++;
            }
            listBoxQA.Items.Add(COMP_FINAL);        } 

Алгоритм достаточно примитивен. Вначале, используя варианты с одной фигурой, определяется, какие фигуры входят в комбинацию, для чего понадобится максимум 12 вопросов, по числу элементов множества картинок. Затем простым перебором определяется место каждой фигуры в комбинации, для чего может понадобиться максимум $N \cdot N / 2$ вопросов.

Не буду приводить код всех функций, вызываемых в Comp_Strategy. – их можно посмотреть в проекте. В коде проекта можно увидеть еще один вариант возможной более оптимальной стратегии игры компьютера, но он нуждается в доработке.

< Лекция 1 || Лекция 5: 123456