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

Возведение в степень

< Лекция 1 || Лекция 10: 12
Аннотация: Возведение в степень В начале урока обсуждается возможный интерфейс и некоторые детали реализации игры "Однорукий бандит", над которой школьники уже начали работать. Затем обсуждается алгоритм возведения в степень. Как обычно, рассматриваются две версии – интуитивно понятный алгоритм и эффективный алгоритм. В заключение рассматривается задача построения чисел – градин, которая еще называется проблемой "3n + 1". Решение задачи дается простой программой в несколько строчек. Но с этой программой связана еще не решенная проблема доказательства ее завершаемости. Все знают, что цикл while в этой программе завершается для любого n, но строгого доказательства этого утверждения пока не существует.

Предугадывая возможные вопросы к проекту игры "Однорукий бандит", дадим некоторые пояснения.

Начну с интерфейса игры. Конечно же, он может быть разным. На прошлом занятии Вы видели, что Игорь написал свой вариант игры в течение 10 -15 минут. В его варианте "колесо крутилось", пока были деньги, или игра не была приостановлена, после чего можно было посмотреть на результаты каждого отдельного запуска игры. Но в этом варианте не было картинки и момента ожидания, что снижает "азартность" игры.

Покажу мой вариант интерфейса:


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

Опущу многие детали реализации этого интерфейса, остановлюсь лишь на том, как можно реализовать анализ сформированной комбинации, позволяющий установить, является ли комбинация проигрышной для игрока или дает ему выигрыш. Комбинация представляет собой три фигуры, случайным образом выбираемых из заданного множества 12 фигур. Достаточно просто установить, дает ли комбинация главный выигрыш. Каковы бы ни были объекты, их всегда можно сравнивать на равенство. Значительно труднее определить, являются ли все картинки комбинации одного цвета или одинаковыми фигурами. Исходно наши объекты в комбинации, отображаемые в форме, являются рисунками типа image. Для таких объектов определить такие свойства, как цвет или какова фигура сложная задача. Как же быть в подобных ситуациях?

Рассмотрим общую ситуацию. Пусть есть некоторое множество объектов определенного типа. Требуется определить, обладают ли объекты заданным свойством (задать своего рода фильтр). Как быть, если задать фильтр для объектов такого типа довольно сложно. Один из приемов состоит в том, чтобы задать некоторое множество объектов другого типа той же мощности, что и исходное множество, установив между объектами двух множеств взаимно –однозначное соответствие. Может оказаться, что установление свойств объектов для второго множества является более простой задачей. Свойства, установленные для объектов второго множества, переносятся на соответствующие объекты первого множества.

Этот прием применим в нашей задаче. Игорь, как я понимаю, картинкам поставил в соответствие буквы алфавита. Если комбинация содержит буквы "a", "b", "c", то это означает, что выпали три круга, а комбинация из букв "a", "e", "c" является проигрышной для игрока.

Я в своей реализации, каждой картинке поставил в соответствие текст: картинке с синим кругом соответствует строка "синий круг". Затем я устанавливал свойства комбинации, работая с текстами.

Мы с вами с текстами и символами текста работали мало. Можно ли предложить другой вариант, работая с более привычным типом данных – числами? Конечно, можно. Любое конечное множество объектов можно пронумеровать и работать не с самими объектами, а их номерами. Тогда синему кругу будет соответствовать число 1, красному – 2, желтому -3.

Как записать в этом случае условие того, что "все картинки одного цвета" или "все картинки – одна и та же фигура".

Предложите свои варианты.

Работа у доски

Оказывается, если подумать, соответствующие условия можно записать достаточно коротко:

/// <summary>
        /// Выигрыш, если у всех картинок один цвет
        /// или одна и та же фигура 
        /// </summary>
        /// <returns>true, если выигрыш</returns>
        bool IsPayment_Num()
        {
            return IsSameColor() || IsSameShape();
        }
        /// <summary>
        /// анализ цвета 
        /// </summary>
        /// <returns>true, если у всех картинок один цвет </returns>
        bool IsSameColor()
        {
            return (comb_num[0] - comb_num[1]) % 3 == 0 &&
                (comb_num[2] - comb_num[1]) % 3 == 0;
        }
        /// <summary>
        /// анализ фигуры
        /// </summary>
        /// <returns>true,если на всех картинках одна и та же фигура </returns>
        bool IsSameShape()
        {
					/*
					//Эта реализация построена для случая отображения картинок
					//на интервал [1 – 12]
            Array.Sort(comb_num); 
            return (comb_num[2] < 4)  ||         //три круга
                (comb_num[0] >= 4  && comb_num[2] <= 6) ||     //три квадрата
                (comb_num[0] >= 7 && comb_num[2] <= 9) ||   //три ромба
                comb_num[0] >= 10;                //три треугольника
					*/
					//Можно построить более красивую реализацию
					//при использовании интервала [0 – 11]
return 
                //для каждой группы фигур результат деления на 3 одинаков
                 comb_num[0] / 3 == comb_num[1] / 3 &&
                 comb_num[1] / 3 == comb_num[2] / 3;
        }

Обратите внимание, оба алгоритма не очевидны и требуют алгоритмического мышления.

< Лекция 1 || Лекция 10: 12