Игра "Крестики-нолики"
Наименование продукта, краткая характеристика области применения. Требования к программной документации и функциональным характеристикам разработки. Выбор и проработка программных средств, проектирование программы, анализ результатов разработки программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 14.03.2015 |
Размер файла | 1,5 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
[Введите текст]
Министерство образования и науки Российской Федерации
Государственное образовательное учреждение высшего профессионального образования
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Институт кибернетики Кафедра ИПС
ИГРА «КРЕСТИКИ-НОЛИКИ»
Курсовая работа по дисциплине "Программирование на языке высокого уровня"
Выполнила: студент группы 8В01
Щукова К.Б.
Проверил: доцент Погребная Т. К.
Томск - 2011
СОДЕРЖАНИЕ
- Техническое задание
- Введение
- 1.1 Наименование продукта
- 1.2 Краткая характеристика области применения
- 2. Основание для разработки
- 2.1 Документ, на основании которого ведется разработка
- 2.2 Организация, утвердившая документ
- 3. Назначение разработки
- 4. Требования к разработке
- 4.1 Требования к функциональным характеристикам
- 4.2 Требования к надежности
- 4.3 Требования к составу и параметрам технических средств
- 4.4 Требования к информационной и программной совместимости
- 5. Требования к программной документации
- 6. Технико-экономические показатели
- Введение
- Постановка задачи
- Выбор и проработка программных средств
- Проектирование программы
- Анализ результатов разработки программы
- Заключение
- Список литературы
- Листинг программы
- ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА РАЗРАБОТКУ ПРОГРАММНОЙ РЕАЛИЗАЦИИ ИГРЫ «КРЕСТИКИ-НОЛИКИ»
- 1. ВВЕДЕНИЕ
1.1 Наименование продукта
Интеллектуальная логическая игра «Крестики-нолики».
1.2 Краткая характеристика области применения
Игра «Крестики-нолики» позволяет пользователю выбрать поле 9х9, 15х15, 45х45, играть против компьютера и ходить крестиками во время игры. Данная игра предназначена для тренировки логического мышления пользователя.
2. ОСНОВАНИЕ ДЛЯ РАЗРАБОТКИ
2.1 Документ, на основании которого ведётся разработка
Задание на курсовую работу по дисциплине «Программирование на языке высокого уровня».
2.2 Организация, утвердившая документ
Национальный Исследовательский Томский политехнический университет.
3. НАЗНАЧЕНИЕ РАЗРАБОТКИ
Данная разработка дает возможность пользователю развить его логическое мышление, выбор поля позволяет заинтересовать пользователя и делает процесс игры разнообразным. Игра повышает интеллектуальный уровень пользователя, развивает его внимание и рефлекторные способности.
4. ТРЕБОВАНИЯ К РАЗРАБОТКЕ
4.1 Требования к функциональным характеристикам
4.1.1 Программа должна содержать окно и экранную клавиатуру для регистрации пользователя. Экранная клавиатура должна состоять из кнопок латинского алфавита, а также кнопки «back», которая необходима в случае неверного набора ника или символа ника. Программа должна предоставить возможность пользователю нажать кнопку «Finish» по окончанию ввода ника.
4.1.2 Программа должна содержать главное меню, состоящее из четырех разделов «Begin», «Record», «About», «Exit», и каждый раздел меню должен иметь подменю. Первые три раздела должны содержать кнопку «Exit» для возврата в главное меню.
4.1.3 Программа должна иметь простой графический интерфейс.
4.1.4 Программа должна предоставить возможность осуществление управлением игрой с помощью манипулятора - мышь.
4.1.5 Программа должна предоставить возможность пользователю при его заходе в раздел «Begin», выбрать одно из трёх возможных полей: 9 x 9, 15 x 15, 45 x 45.
4.1.6 Программа должна предоставить возможность пользователю в ходе игрового процесса наблюдать за своим количеством побед, за количеством побед компьютера, видеть свой ник и текущие победы в специальном окне левом верхнем углу, а также в любой момент игры сохранить своё текущее количество побед.
4.1.7 Программа должна предоставить возможность пользователю в ходе игрового процесса в случае выигрыша или проигрыша видеть в левом верхнем углу сообщение о победе или неудаче: «You win!» или «You lose!»
4.1.8 Программа должна содержать в игровом поле три кнопки «Start», «Save», «Exit». Первая кнопка должна позволить пользователю начать игру, вторая - сохранить своё текущее количество побед, а третья - выйти в главное меню.
4.1.9 Программа должна содержать раздел главного меню «Record», где пользователю должна предоставляться возможность увидеть десять самых лучших ников игроков, отсортированных в алфавитном порядке и по убыванию их количества побед.
4.1.10 Программа должна содержать раздел главного меню «About», где пользователю должна предоставляться возможность прочитать на английском языке краткую информацию об игре и правила игры.
4.1.11 Программа должна предоставлять возможность игроку всегда ходить первым и играть фишкой - «крестик», а компьютер должен всегда ходить фишкой - «нолик».
4.1.12 Программа должна содержать стратегию ходов компьютера, которая должна быть основана на оценочной функции. Каждая клетка игровой сетки должна иметь свой вес. И где вес максимальный, туда компьютер и должен ходить, причём ставить он должен последующую фишку рядом со своей стоящей фишкой, таким образом, выстраивая возможный выигрышный ряд. Но также, он должен блокировать возможный выигрышный ряд игрока.
4.1.13 Программа должна поставить задачу, как игроку, так и компьютеру выстроить свой ряд из пяти фишек или по горизонтали, или по вертикали, или по диагоналям.
4.2 Требования к надёжности
4.2.1 Программа должна отслеживать существование файлов «data1.txt» и «data.txt» при их открытии, в противном случае выдать ошибку.
4.2.2 Программа при сохранении в файл «data.txt» должна проверить существование файла с таким же именем, при наличии такого файла предложить перезапись уже существующего файла.
4.2.3 Программа должна корректно отображать данные в английской кодировке.
4.2.4 Программа должна осуществлять проверку на инициализацию графического режима, в случае ошибки выводить сообщение на экран.
4.3 Требования к составу и параметрам технических средств
Для функционирования игры «Крестики-нолики» необходим компьютер IBM PC совместимый и следующие технические средства:
· процессор Intel 80286 или совместимый;
· объем свободной оперативной памяти 700 Кб;
· объем необходимой памяти на жёстком диске 600 Кб;
· стандартный VGA-монитор или совместимый;
· стандартная клавиатура;
· манипулятор «мышь»;
4.4 Требования к информационной и программной совместимости
Для функционирования текстового редактора необходимо наличие операционной системы MS-DOS или совместимой. Язык интерфейса - английский.
5. ТРЕБОВАНИЯ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ
Предварительный состав программной документации:
· «Техническое задание», текст программы с комментариями, описание алгоритма и программы.
· «Руководство пользователя».
6. ТЕХНИКО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ
Существует эмулятор DosBox, который позволяет увеличить быстродействие выполнение программы и отрисовку графики, что значительно экономит время при выполнении программы.
7. СТАДИИ И ЭТАПЫ РАЗРАБОТКИ
ТЗ - техническое задание, ПЗ - пояснительная записка.
Содержание этапа или стадия |
Срок |
Форма отчетности |
||
начало |
конец |
|||
Выбор программных средств |
09. 09.2011 |
19. 09.2011 |
ТЗ |
|
Составление технического задания |
20.09. 2011 |
25.09. 2011 |
ПЗ |
|
Проектирование программы |
01. 10.2011 |
10. 10.2011 |
ПЗ |
|
Составление программы |
15.10. 2011 |
23. 11. 2011 |
ПЗ |
|
Тестирование программы |
24.11. 2011 |
01. 12. 2011 |
ПЗ |
|
Оформление пояснительной записки |
05. 12.2011 |
12.12.2011 |
ПЗ |
ВВЕДЕНИЕ
Данная курсовая работа посвящена разработке игры «Крестики-нолики», реализованная с применением объектно-ориентированного программирования. Курсовая работа ставит перед собой цель проработки и упорядочивания знаний, полученных в течение двух семестров изучения дисциплины «Программирование на языке высокого уровня». Курсовая работа представляет собой индивидуальное задание повышенной сложности по разработке программы на изучаемом языке высокого уровня.
В курсовой работе будут рассмотрены: алгоритм выполнения стратегии ходов компьютера, работа с файлами, графический режим, объектно-ориентированное программирование. Все элементы будут рассмотрены на языке программирования высокого уровня С++.
Выполнение задания требует комплексного применения своих знаний как в части владения языком программирования, так и в части умения создавать и реализовывать сложные алгоритмы.
Игра «Крестики-нолики», описанная в данной работе, является полноценным программным продуктом, готовым для использования. Она обладает доступным, понятным и наглядным для пользователя интерфейсом.
ПОСТАНОВКА ЗАДАЧИ
Используя ООП, написать программу, реализующую идею игры. Выполнить переопределение стандартных операций для абстрактных типов данных. Использовать конструкторы, деструкторы. Использовать графический режим. продукт программа документация проектирование
ВЫБОР И ПРОРАБОТКА ПРОГРАММНЫХ СРЕДСТВ
Язык C был разработан в начале семидесятых небольшой группой инженеров, работающих в лабораториях Белла, для создания операционной системы Unix. Язык С оказался достаточно мощным и очень скоро завоевал передовые позиции среди средств разработки программного обеспечения. Однако со временем в программировании появились новые технологии (например, объектно-ориентированное программирование), которые постепенно вытесняли язык С.
Язык программирования С++ был разработан на основе языка С Бьярном Страуструпом (Bjarne Stroustrup) и вышел за пределы его исследовательской группы в начале 80-х годов. Язык С++ является надмножеством языка Си, поэтому программы, написанные на языке Си могут обрабатываться компилятором языка С++. В программах на языке С++ можно использовать тексты на языке С и обращаться к библиотечным функциям языка Си. Язык С++ был создан с учетом следующих целей: улучшить язык Си, поддержать абстракцию данных и обеспечить объектно-ориентированное программирование.
Объектно-ориентированное программирование (ООП) -- методология программирования, основанная на представлении программы в виде совокупности объектов каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.
Объектно-ориентированное программирование -- это обобщение структурного и модульного программирования для оптимизации создания программ и программных комплексов. ООП позволяет быстро и с минимальным количеством ошибок написать программу, код которой легко понять другим и самому, и, следовательно, изменить при необходимости. Язык программирования является объектно-ориентированным, когда выполняются условия:
· поддерживаются объекты или абстракции данных, имеющие интерфейс в виде именованных операций и собственные данные с ограничением доступа к ним;
· объекты относятся к соответствующим типам;
· типы (классы) могут наследовать атрибуты супертипов (базовых классов);
Три основные положения объектно-ориентированного программирования:
· инкапсуляция
· наследование
· полиморфизм
В языке C++ программист имеет возможность вводить собственные типы данных и определять операции над ними с помощью классов. Классы -- это производные структурированные типы, введённые программистом на основе уже существующих типов. Механизм классов позволяет вводить собственные типы данных, т.е. класс задает некоторую структурированную совокупность типизированных данных и позволяет определить набор операций над этими данными. Закрытые данные - члены класса и определения всех функций членов класса входят во внутреннюю используемую часть класса private. Для возможности работы с этим классом часть членов должна быть открытой. Эта часть класса называется интерфейсом (public). В отличие от прототипов функции членов класса, объявленных открытыми, определение этих функций не входит в интерфейс класса. Класс инкапсулирует информацию, связывая вместе члены и методы и обращаясь с ними как с одним целым. Возможность изменения используемой части класса, без опасности возникновения ошибок в программах, использующих этот класс, называется инкапсуляцией. Важность инкапсуляции заключается в том, что каждый класс может изменяться в процессе разработки или даже после ее завершения без нарушения работоспособности остальных частей программы.
Инкапсуляция - это максимально возможная независимость каждого объекта. Внутренняя структура объекта скрыта для всех остальных объектов. Одним из способов организации взаимодействия объектов является обмен сообщениями. Структура этих сообщений не зависит от конкретных объектов, которым или от которых они передаются. Имя функции обрабатывающей одно и то же событие для всех объектов одинаково, но ее реализация зависит от объекта, точнее от класса этого объекта, и определяется во время выполнения программы. Конкретная реализация функции с учетом объекта будет выполняться во время выполнения программы. Это свойство называется полиморфизмом и поддерживается с помощью механизма виртуальных функций. Общая концепция виртуальных функций поддерживает наследование в том, что позволяет двум или более объектам в иерархии наследования иметь методы с одним и тем же объявлением, выполняющие различные задачи.
Объекты разных классов и сами классы могут находиться в отношении наследования, при котором формируется иерархия объектов, соответствующая заранее предусмотренной иерархии классов. Иерархия классов позволяет определять новые классы на основе уже имеющихся. Производный класс получает данные и методы базового класса - и, кроме того, может пополняться собственными компонентами (данными или методами). Наследуемые компоненты не перемещаются в производный класс, а остаются в базовом классе. Сообщение, обработку которого не могут выполнить методы производного класса, автоматически передаётся в базовый класс.
ПРОЕКТИРОВАНИЕ ПРОГРАММЫ
1. Общая схема программы
Программа состоит из следующих файлов:
NEW_KURS.exe - исполняемый файл;
NEW_KURS.cpp - файл, содержащий исходный текст программы;
Egavga.bgi, Graphics.h, Graphics.lib - файлы графических модулей, предназначены для поддержки графического режима программы;
В данной программе были созданы базовые классы: kletka_pust, pair, common. Класс kletka_pust является базовым классом для наследников или производных классов kletka_cross и kletka_nolik. Класс common по своей структуре является самым важным и основным для всей программы.
Назначение данных классов представлено в таблице 1.1.
Таблица 1.1 Функции классов
Название класса |
Назначение класса |
|
Класс common |
Является «скелетом» программы, состоящий из пятнадцати методов. Методы описывают как графический интерфейс, так и алгоритмы программы. Взаимодействие класса с главной функцией осуществляется посредством объекта tic, созданного в ней. |
|
Класс kletka_pust |
Предназначен для отрисовки крестиков и ноликов. Класс содержит метод paint, который наследуют его потомки. |
|
Класс kletka_cross |
Является наследником класса kletka_pust и предназначен для отрисовки крестиков. Взаимодействие этого класса в методе game класса common осуществляется с помощью объекта cr. |
|
Класс kletka_nolik |
Является наследником от базового класса kletka_pust и предназначен для отрисовки ноликов. Взаимодействие этого класса в методе game класса common осуществляется с помощью объекта kr. |
|
Класс pair |
Специально созданный класс для переопределения стандартной операции инкремента (++). Взаимодействует c главной функции main через объект ob. |
2. Наследование класса kletka_pust
Наследование, представленное в программе относиться к простому наследованию, когда существуют один базовый класс и несколько потомков. Класс kletka_pust являеться базовым для классов kletka_cross и kletka_nolik. Рассмотрим подробно структуру:
class kletka_pust
{protected:
int fieldsX,fieldsY;
int s;
public:
kletka_pust(){}; // конструктор по умолчанию
kletka_pust(int x1,int y1)
// инициализация членов класса в конструкторе
{
fieldsX=x1;
fieldsY=y1;
}
~kletka_pust(void) // деструктор по умолчанию
{
}
virtual void paint(int g,int h,int iSizeFl) // виртуальный метод
{
}
};
Члены класса fieldsX, fieldsY, s объявлены как protected, то есть как защищённые элементы, которые доступны базовому классу и его потомкам. Члены класса, объявленные в конструкторе kletka_pust, имеют общий доступ public. Это необходимо для доступа этих элементов в других классах этой программы. Метод класса paint является виртуальным (virtual), что означает, что он переопределяется в классах-наследниках kletka_cross и kletka_nolik. И не обязательно знать точный тип объекта для работы с ним через виртуальный метод: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.
Виртуальный метод paint представляет собой одну из форм полиморфизма. Таким образом, создаётся общий код, который позволяет работать как с объектами базового класса kletka_pust, так и с объектами его классов-наследников kletka_cross и kletka_nolik.
Базовый класс kletka_pust определяет способ работы с объектами, и его наследники kletka_cross и kletka_nolik предоставляют свою реализацию этого метода.
В классе kletka_cross метод paint реализует отрисовку крестиков и через объект, созданный в методе game класса common используется, когда необходимо нарисовать крестик.
В классе kletka_nolik метод paint реализует отрисовку ноликов и через объект, созданный в методе game класса common используется, когда необходимо нарисовать нолик.
3. Переопределение стандартной операции
В данной программе в классе pair происходит переопределение стандартной операции инкремента (++), что позволяет сдвигать координаты X, Y не на единицу, как это определено стандартно, а на 40 и 10. Это необходимо для вывода текста на экране с одинаковым межстрочным расстоянием и сдвигом влево. Таким образом, для объекта ob созданного в классе common операция инкремента будет означать одновременное увеличение членов класса X, Y на 40 и 10.
class pair
{
public:
int X, Y;
friend pair& operator ++ (pair&);
// дружественная функция для класса pair, префиксная версия переопределения
pair()
{
X=40; Y=10; // конструктор
}
~pair() {}; // деструктор по умолчанию
};
pair& operator ++ (pair& P)
{
P.Y=P.Y+30; // переопределение операции инкремента
P.X=P.X+10;
return P;
}
4. Структура класса common
Класс common состоит:
Из конструктора common, где происходит инициализация членов класса, которые объявлены как public, то есть доступны любому классу в этом модуле программы;
Из деструктора ~common, который уничтожает объекты;
Из методов inilization_graph, mouse, mov_mouse, resize, chose_fl, save, oformlenie, game, swap, record, spravka, find, enter, registration, menu, privet, которые объявлены как public, то есть доступные для других классов в программе;
Подробная характеристика методов класса common:
· inilization_graph() - метод класса common, который выполняет инициализацию графического режима для создания графической оболочки игры
· mouse () - метод класса common, который выполняет подключение мыши в консоле
· mov_mouse() - метод класса common, который выполняет считывание координат мыши на экранном поле
· resize() - метод класса common, который устанавливает для управления мыши границы экрана 640 x 480
· chose_fl() - метод класса common, который реализует выбор поля во время игры в «Крестики- нолики»
· save() - метод класса common, который сохранение количества побед пользователя в любой момент
· oformlenie() - метод класса common, который реализует графическое оформление подменю Begin
· game() - метод класса common, который реализует алгоритм игры или «искусственный интеллект»
· swap() - метод класса common, который сортировку ников пользователей по количеству побед, при этом у пользователей с одинаковым количеством побед ники также сортируются , но посимвольно в алфавитном порядке
· record() - метод класса common, который реализует графический интерфейс подменю Record
· spravka() - метод класса common, который реализует графический интерфейс раздела About в главном меню, в котором содержится правила и краткое описание игры «Крестики-нолики»
· find() - метод класса common, который проверяет введенный пользователем ник на уже существующий, сохранённый в файле
· enter() - метод класса common, который описывает реализацию экранной клавиатуры в консоле для авторизации пользователей
· registration() - метод класса common, который отвечает за реализацию графического оформления авторизации
menu() - метод класса common, который описывает графический
· интерфейс главного меню
· privet() - метод класса common, который реализует графическое оформление приветствия в начале программы
5. Подробное описание метода game
Метод реализует «искусственный интеллект» компьютера. Игрок всегда будет ходить первым и фишкой - крестик, а компьютер, соответственно, ноликом. В массиве маркер - крестик обозначен цифрой «1», нолик - цифрой «0», пустая клетка - цифрой «2». Алгоритм стратегии игры основывается на оценочной функции. Имеется три двумерных массива:
1) chArrPie[i][j]
2) iArrVes0 [i] [j]
3) iArrVesX[i] [j]
Первый массив chArrPie[i] [j] содержит ходы, как компьютера, так и игрока, или, образно говоря, его можно назвать игровой доской ходов. Вторая матрица iArrVes0 [i] [j] содержит текущие ходы фишки - нолик или матрица весов для ноликов, и третья матрица iArrVesX[i] [j], соответственно, текущие ходы фишки - крестик или матрица весов для фишек - крестики.
Изначально каждая ячейка матрицы имеет вес равный нулевому значению. Далее в процессе игры у каждой клетки на вертикали, горизонтали, главной и побочной диагонали изменяется свой вес и, где вес ячейки второй матрицы iArrVes0 [i] [j] наибольший, там ставится соответствующая фишка компьютера, при этом с рядом уже стоящей своей фишкой, таким образом, выстраивая возможный выигрышный ряд из своих фишек. Либо же фишка компьютера ставится, исходя из веса клеток третьей матрицы iArrVesX[i] [j] игрока, таким образом, компьютер блокирует возможный выигрышный ряд игрока.
Данный алгоритм оценивает все четыре выигрышные линии. Далее проверяется выигрышная ситуация игрока и компьютера и, соответственно, если такова существует, то осуществляется вычёркивание пяти подряд стоящих фишек с помощью функции line() для каждой линии.
Также в программе присутствуют члены класса, которые считают победы компьютера - win_comp, игрока - winZnak и ничью - countTie. Все счётчики для игрока отображаются на экране в правом верхнем углу в подменю Start меню Begin, а также вызывается метод сохранения количества побед игрока в любой момент - save (wins_old_nick,win_new_nick) - то есть сохраняются именно победы игрока, которые отображаются в разделе меню Record, при условии, если игрок попал в десятку лучших игроков. За количество побед отвечают два члена класса - wins_old_nick и win_new_nick. Первый - содержит количество побед уже зарегистрированного ника, второй - количество побед нового ника. Значения этих переменных передаются из метода game() в метод save(), таким образом, происходит обновление значений членов. Сохранение побед происходит в файле data.txt (рис. 5.1).
Рис. 5.1 Структура файла
Изначально в файле первая строка содержит количество ников: за количество ников отвечает член класса - n , на второй указана длина ника: массив length [i] отвечает за длины ников, так как ников содержится несколько в файле, и на этой же строке далее находится название ника, которое представлено, как массив символов - char nick[10][10], причём массив двумерный, так как ников несколько в файле, на третьей - количество побед, за которое отвечают члены wins_old_nick или win_new_nick. Члены wins_old_nick или win_new_nick обновляются в том случае, если игрок увеличивает количество побед, и, таким образом, его победы сохраняются в файле.
Графический интерфейс игры реализован с помощью стандартных функций графического режима, который инициализируется при помощи функции inilization_graph(). При этом, управление меню происходит с помощью мыши.
6. Описание метода privet()
Данный метод отвечает за приветствие, которое пользователь видит на экране при заходе в программу (рис. 6.1). Эффект анимации создан с помощью стандартных функций графического режима, таких как: cleardevice(); - очистка экрана, setbkcolor(); - установка цвета фона экрана, delay(); - задержка, outtextxy(); - вывод текста на экран в зависимости от заданных координат, settextstyle(); - установка стиля текста, setcolor(); - установка цвета текста. За счёт того, что функции выполняются в цикле, достигается эффект анимации.
Рис. 6.1 Приветствие игрока
7. Описание методов registration() и enter()
Метод описывают авторизацию игрока при заходе в игру, которая изображена на рисунке 7.1.
Рис. 7.1 Авторизация пользователя
На экране игроку предоставляется возможность нажать на одну из двух кнопок в зависимости от того, хочет ли он зарегистрироваться под новым ником или сменить ник, либо зайти под уже зарегистрированным ником. Кнопки нарисованы с помощью функции bar();. Считывание нажатия на кнопки происходит с помощью метода подключения мыши mouse(1); и считывания координат мыши mov_mouse(3);. Далее в зависимости от нажатия игрока на кнопку, вызывается метод enter(0);, которой передаётся значение члена класса authoriz=0, которое указывает на введение старого ника и, соответственно, authoriz=1 на введение нового ника.
Метод enter (int authoriz) рисует экранную клавиатуру пользователю и окно для ввода ника (рис. 7.2) с помощью стандартных функций графического режима.
Рис. 7.2 Экранная клавиатура для ввода ника
Клавиатура состоит из кнопок с латинскими буквами и двух кнопок - Finish и Back. Максимальная длина ника составляет 10 символов. Кнопка Back позволяет игроку при вводе ника корректировать ошибку набора в случае неверного набора символа.
Затирание символа происходит в массиве old_nick[u] для уже существующего ника или new_nick[u] для нового ника. Член класса ASCII хранит значение символа в таблице ASCII и, если символ введен неверно, то элемент массива затирается пустым символом, для которого установлен цвет с помощью функции setcolor(). Неверный символ закрашивается в цвет окна для ввода. Кнопка Finish предназначена для завершения ввода ника. Переменная Finish принимает значение 1, когда происходит считывание координат кнопки Finish. Это означает, что ввод ника закончен. И далее пользователь переходит в главное меню. Считывание латинских символов осуществляется с помощью оператора switch().
Если пользователь нажимает на кнопку Enter your nick, то есть член класса authoriz==1, то вызывается метод find (u);, члену класса u соответствует длина ника, значение которой передаётся из метода enter(), в соответствие от значения члена authoriz. Если authoriz==1, то в length_new_nick лежит значение u, иначе, если authoriz==0, то в length_old_nick лежит тоже значение u. То есть в метод find(u); передаётся длина либо нового ника, либо длина старого ника.
Далее файл открывается для чтения. С помощью файловой переменной f считываются данные из файла: длина ника, количество побед, имя ника.
Когда пользователь вводит новый ник, то длина нового ника сохраняется в length_new_nick, а в символьном одномерном массиве new_nick[j] сохраняется имя нового ника, и далее проверяется условие на совпадение длины ников в файле с новой длиной ника, и чтобы избежать лишних проверок, сразу отсеиваются ники с длиной, которая не соответствует длине нового ника, и тут же ники с совпадающей длиной проверяются посимвольно.
В count накапливается в процессе выполнения цикла количество таких совпавших символов и, если длина нового ника совпадает ещё и с количеством совпавших символов ников (count), то тогда на экран выводится сообщение о том, что такой ник уже существует, и следует ввести новый ник (рис. 7.3). В противном случае он ничего не выводит.
Рис. 7.3 Вывод на экран сообщение
8. Описание метода menu()
Метод menu() описывает графический интерфейс главного меню. Меню состоит из 4 кнопок: Begin, Record, Spravka, Exit (рис .8.1).
Кнопки рисуются с помощью функций bar(); в цикле. Управление меню осуществляется мышкой. Считываются соответствующие координаты при нажатии на кнопку с помощью метода mov_mouse(3);, пользователь попадает в соответствующее подменю.
Рис. 8.1 Главное меню игры
9. Описание метода record()
Метод record() содержит описание графики и запись файл ника, введённого во время авторизации, за которую отвечает метод registration(). Подменю Record состоит из окна, где содержится ник и соответствующие количество побед данного ника (рис. 9.1.). Причём, если в файле хранится несколько ников, то выводится на экран 10 самых лучших, отсортированных по убыванию количества побед.
Рис. 9.1 Вывод в окне рекордов ника игрока и его количество побед
Рисуется окно так же с помощью функции в графическом режиме bar();. Так же есть кнопка выхода в главное меню. Она создана тоже с помощью функции bar();. Реализация выхода осуществляется при помощи цикла, в котором происходит считывание координат при нажатии на кнопку с помощью метода mov_mouse(3); и проверяется условие нажатия мыши в данную область кнопки, если условие верно, то происходит завершение выполнения метода record() с помощью функции return();
Количество ников, длина ника, идентификатор ника, количество побед содержатся в файле, но в окне рекордов отображается только идентификатор ника и количество побед. Nick[i][j] - символьный двумерный массив ников, winer[i] - одномерный массив количества побед игрока, переменная n отвечает за количество ников в файле, length[i] - одномерный массив длин ников, при этом длина не превосходит 10. Считывание в файле данных происходит с помощью файловой переменной f. При этом ifstream f ("data.txt"); - означает связывание потоковой переменной с файлом, при этом в скобках указывается имя файла.
После считывания данных из файла, в цикле проверяется условие на неравенство количества побед в файле, то есть у разных ников различное количество побед, тогда, если это выполняется, то вызывается метод swap (winer[i],winer[i+1]), в котором передаются значения winer[i] и winer[i+1] из метода record(), которым соответствуют s и d и, далее в самой этой функции происходит сортировка обменом по убыванию количества побед. Для этого создаются дополнительные члены bufer, t. И, собственно, при помощи них в цикле происходит обмен значениями переменных.
Далее рассматривается случай, когда победы совпадают, но имена ников разные, то есть проверяется условие на равенство количества побед и, если они равны, то сортируются ники посимвольно в алфавитном порядке. Сортировка используется простая обменная. Создаётся дополнительный массив buf [k], который необходим для такого типа сортировки и хранит промежуточные значения, при этом одновременно сортируется и длина ника для того, чтобы правильно определять границы массива.
10. Описание метода spravka()
Метод spravka() реализует подменю кнопки About (рис. 9). Подменю содержит кнопку, нарисованную в графическом режиме с помощью функций:
- setbkcolor();
- setfillstyle();
- bar();
Надпись на кнопке с помощью функций:
- settextstyle();
- setcolor();
- outtextxy();
Также в подменю нарисовано прямоугольное окно, где содержится краткая информация об игре и правила игры. Прямоугольник нарисован с помощью функции bar();
Информация об игре считывается из файла data1.txt. Для этого сначала создаётся указатель на переменную типа FILE (FILE* file;). Открытие файла производится вызовом функции fopen.
Рис. 10.1 Подменю About
Первый параметр этого метода- имя файла, второй - указывает в каком режиме должен быть открыт файл, в данном случае "r" - означает открыть для чтения. Далее в цикле while считывается символьный одномерный массив load_string[256] с помощью функции считывания данных из файла fgets (load_string,256,file);, при этом используется в этом же цикле функция вывода текста в графическом режиме outtextxy (150,60+i,load_string);
Для того, чтобы выйти из подменю About в главное меню, нужно нажать на кнопку Exit main. Для этого подключена мышь с помощью функций mouse(1); и mov_mouse(3);
Внутри цикла while задается условие попадания в область кнопки, и далее оператор прерывания функции return;. Таким образом, осуществляется выход в главное меню.
11. Описание подменю Begin
Пользователь зашёл в подменю Begin. В результате он видит 4 кнопки (рис. 11.1). Первые три кнопки позволяют выбрать игроку тот размер поля, на котором он хочет играть. Четвертая, соответственно, возврат в главное меню.
Кнопки нарисованы в метода chose_fl() аналогично, как в других частях программы с помощью стандартных функций графического режима. Также подключена мышь с помощью методов mouse(1); и mov_mouse(3);
Обработка координат кнопок происходит в цикле for. В зависимости от значения q переменная iSizeFl устанавливает размер поля.
Рис. 11.1 Подменю Begin
При нажатии на любую из трёх первых кнопок игрок попадает в новое подменю (рис. 11.2) которое для всех кнопок идентично, только поле разлиновано в зависимости от выбора его размерности. Это подменю состоит также из трёх кнопок расположенных в ряд в левом верхнем углу, в правом верхнем углу располагаются два окна, первое отображает ник пользователя, количество побед игрока, компьютера, ничью, второе выводит сообщения пользователю о выигрыше или наоборот о проигрыше, либо сообщение о равном количестве побед, а также о сохранении игры. Посередине располагается само поле.
Рис. 11.2 Подменю кнопки Flied 9 x 9
Для того, чтобы начать игру, игрок должен нажать кнопку Start. При нажатии начинается игра, то есть вызывается метод game();.Первым всегда ходит игрок и фишкой - крестик. На рисунке 11.3 изображён процесс игры.
Рис. 11.3 Процесс игры
12. Руководство по использованию
Чтобы запустить программу, необходимо нажать NEW_KUR.exe из соответствующей директории.
При запуске программы сначала появляется титульный лист. Далее появится приветствие пользователя в виде анимации. Необходимо нажать любую кнопку для продолжения. После нажатия кнопки пользователь должен зарегистрироваться или ввести ник, если он уже существует у него. После этого он попадает в главное меню. В главном меню у него есть четыре возможности: войти в игру, посмотреть рекорды, прочитать информацию об игре, либо выйти из игры. Управлять игрой осуществляется мышкой, если нет сообщений на экране о нажатии на кнопку.
Анализ результатов разработки программы
Для тестирования работы программы были использованы различные варианты расположения фишек на различных полях. Программа работает правильно без явных сбоев. В таблице рекордов программа корректно выполняет считывание данных из файла и производит запись или перезапись данных в файл.
ЗАКЛЮЧЕНИЕ
В ходе написания программы были использованы элементы объектно-ориентированного программирования. Основу программы составили классы. Было использовано переопределение стандартных операций для переменных абстрактных типов, а так же работа с графикой, строками и т.д.
Были применены знания, полученные в процессе изучения курса «Программирование на ЯВУ». При выполнении курсовой была проработана литература по языкам С/С++, объектно-ориентированному программированию. Работать с объектами класса при помощи функций членов намного удобнее, нежели не использовать классы, а применять только стандартный набор типов данных.
Пользователю не придётся тратить много времени на освоение правил игры «Крестики-нолики». Простота и наглядность интерфейса делают игру удобной в использовании.
Выполнение курсовой работы помогло закрепить материал и навыки, полученный на лекциях и лабораторных работах, помогло систематизировать знание языка и научится применять их к конкретным задачам.
СПИСОК ЛИТЕРАТУРЫ
1. Мирошниченко Е.А. и др. Программирование на языке С++. Часть II. Учебное пособие/ Н.В. Триханова, Е.А. Мирошниченко. - Томск: Изд. ТПУ, 2001. - 118с.
2. Костюк Ю.Л. Основы алгоритмизации: Учебное пособие. / Ю.Л.Костюк. - Томск: Изд. ТГУ, 1996. - 124с.
3. Бондарев В.М. и др. Основы программирования. / В.М. Бондарев, В.И. Рублинецкий, Е.Г. Качко. / Худож.-оформитель С.А. Пяткова. - Харьков: Фолио; Ростов н/Д: Феникс, 1997. - 368с.
4. Вирт Н. Алгоритмы и структуры данных. / Н. Вирт. - М.: Мир, 1989. - 310с.:ил.
5. Рейзлин В.И. Программирование на языке высокого уровня: учебник http://ad.cctpu.edu.ru/cpp/Textbook.htm
ЛИСТИНГ ПРОГРАММЫ
#include <iostream.h>
#include <fstream.h>
#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
class kletka_pust
{
protected:
int fieldsX,fieldsY;
int s;
public:
kletka_pust(){};
kletka_pust(int x1,int y1)
{
fieldsX=x1;
fieldsY=y1;
}
~kletka_pust(void)
{
}
virtual void paint(int g,int h,int iSizeFl)
{
}
};
class kletka_cross:kletka_pust
{
public:
kletka_cross(){};
kletka_cross(int x1,int y1)
{
fieldsX=x1;
fieldsY=y1;
}
kletka_cross::~kletka_cross(void)
{
}
void paint(int g,int h,int iSizeFl)
{
int t=0;
int kletka = 450/iSizeFl;
setcolor(1);
if(iSizeFl!=45)
{
do
{
line(fieldsX+kletka*(g-1)+t,fieldsY+kletka*(h-1),fieldsX+kletka*g,fieldsY+kletka*h-t);
line(fieldsX+kletka*(g-1),fieldsY+kletka*h-t,fieldsX+kletka*g-t,fieldsY+kletka*(h-1));
line(fieldsX+kletka*(g-1),fieldsY+kletka*(h-1)+t,fieldsX+kletka*g-t,fieldsY+kletka*h);
line(fieldsX+kletka*(g-1)+t,fieldsY+kletka*h,fieldsX+kletka*g,fieldsY+kletka*(h-1)+t);
t++;
}while(t!=5);
}
else
do
{
line(fieldsX+kletka*(g-1)+t,fieldsY+kletka*(h-1),fieldsX+kletka*g,fieldsY+kletka*h-t);
line(fieldsX+kletka*(g-1),fieldsY+kletka*h-t,fieldsX+kletka*g-t,fieldsY+kletka*(h-1));
line(fieldsX+kletka*(g-1),fieldsY+kletka*(h-1)+t,fieldsX+kletka*g-t,fieldsY+kletka*h);
line(fieldsX+kletka*(g-1)+t,fieldsY+kletka*h,fieldsX+kletka*g,fieldsY+kletka*(h-1)+t);
t++;
}while(t!=2);
setcolor(9);
}
};
class kletka_nolik:kletka_pust
{ public:
kletka_nolik(){};
kletka_nolik(int x1,int y1)
{
fieldsX=x1;
fieldsY=y1;
}
kletka_nolik::~kletka_nolik(void)
{
}
void paint(int g,int h,int iSizeFl)
{
int t=0;
int kletka = 450/iSizeFl;
setcolor(13);
do
{
circle(fieldsX+(kletka)*(g-0.5),fieldsY+(kletka)*(h-0.5),kletka/2-5+t);
circle(fieldsX+(kletka)*(g-0.5),fieldsY+(kletka)*(h-0.5),kletka/2-5-t);
t++;
}while(t!=5);
setcolor(9);
}
};
class pair
{
public:
int X, Y;
friend pair& operator ++ (pair&);
pair()
{
X=40; Y=10;
}
~pair() {};
};
pair& operator ++ (pair& P)
{
P.Y=P.Y+30;
P.X=P.X+10;
return P;
}
class common
{
public:
int i,j,x,y,button,n,q,just,d,countTie,e;
int MenuXm;
int MenuYm ;
int LongMenum;
int WidthMenum;
int CountMenum;
int SpaceMenum;
int lengthKnob;
int widthKnob;
int quantilyKnobWi;
int quantilyKnobLe;
int spaceKnob;
int xKnob;
int yKnob;
int xWin;
int yWin;
int lengthWin;
int widthWin;
int MenuXau;
int MenuYau;
int LongMenuAu;
int WidthMenuAu;
int SpaceMenuAu;
int fieldsX;
int fieldsY ;
int menuX, menuY;
int Longmenu;
int widthmenu;
int space;
int endcikl, p,a, count,max;
int length[10];
char nick[10][10];
int winer[10];
char buf[10];
char buf1[10];
int length_buf;
char old_nick[10];
char new_nick[10];
int length_old_nick;
int wins_old_nick;
int length_new_nick;
int win_new_nick;
int place,finish;
int k,l, n1, n2, n3,u, Finish,probel;
int ASCII;
char back_buf[1];
int type_of_nick;
int number;
int win_comp;
int tie;
int w,er,kletka;
int iSizeFl;
int vixod2;
int znak;
int i0,j0,exitFor,AllMax0,AllMaxX,maxX, countX,count0,exitMark;
char chArrPie[45][45];
int iArrVes0[45][45];
int iArrVesX[45][45];
int win,winZnak,way;
int vixod_4,gor,vert,diag,pdiag,proverka_2,for_break;
common()
{
LongMenum = 160;
WidthMenum = 60;
CountMenum = 4;
SpaceMenum = 10;
lengthKnob = 68;
widthKnob = 32;
quantilyKnobWi = 4;
quantilyKnobLe = 6;
spaceKnob = 10;
xKnob = 91;
yKnob = 200;
xWin = 220;
yWin =100;
lengthWin = 200;
widthWin = 20;
MenuXau = 190;
MenuYau = 240;
LongMenuAu = 260;
WidthMenuAu = 60;
SpaceMenuAu = 30;
fieldsX = 95;
fieldsY = 15;
menuX=5, menuY=30;
Longmenu=95;
widthmenu=30;
space=10;
MenuXm=240;
MenuYm = 60;
endcikl=0, p,a, count=0,max=0;
length[10];
win_new_nick=0;
place = 0;
u=0;
finish = 0;
probel=0;
ASCII=0;
type_of_nick;
number =2;
win_comp=0;
tie=0;
iSizeFl=5;
vixod2=1;
znak = 1;
i0,j0,exitFor=0,AllMax0,AllMaxX,maxX, countX,count0,exitMark;
vixod_4=0;
gor=0;
vert=0;
diag=0;
pdiag=0;
proverka_2;
endcikl=0; count=0;max=0;
length_old_nick=0;
wins_old_nick=0;
length_new_nick=0;
win_new_nick=0;
place = 0;
k=0;
n1=0;
n2=0; n3=0;u=0; Finish = 0;probel=0;
ASCII=0;
type_of_nick=0;
number =2;
win_comp=0;
tie=0;
w=0;er=0;kletka=0;
iSizeFl=5;
vixod2=1;
znak = 1;
i0=0;j0=0;exitFor=0;AllMax0=0;AllMaxX=0;maxX=0; countX=0;count0=0;exitMark=0;
win=0;winZnak=0;way=0;
vixod_4=0;gor=0;vert=0;diag=0;pdiag=0;proverka_2=0;for_break=0;
}
~common(void) {};
/*************************************************************************/
void inilization_graph()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "EGAVGA.bgi");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
}
/*************************************************************************/
void mouse(int mode)
{
_AX = mode;
geninterrupt(0x33);
}
void mov_mouse(int mode2)
{
do
{
_AX=mode2;
geninterrupt (0x33);
x=_CX;
y=_DX;
button=_BL ;
}
while (button == 0);
}
void resize()
{
_AX = 7;
_CX = 0;
_DX = 640;
geninterrupt (0x33);
_AX = 8;
_CX = 0;
_DX = 480;
geninterrupt (0x33);
}
/*************************************************************************/
void chose_fl()
{
just=0;
const int Xupravlemie = 230;
const int Yupravlemie = 110;
const int kolishestvo = 4;
const int longKnoBypr= 180;
const int widthKnoBypr= 60;
const int probel_upravleni=10;
int q,obchee,eZxxxit=1;
inilization_graph();
do
{
cleardevice();
setbkcolor(7);
setfillstyle(1,14);
setcolor(9);
obchee=probel_upravleni*(kolishestvo-1)+widthKnoBypr*kolishestvo;
for(i=0;i<obchee;i+=probel_upravleni+widthKnoBypr)
{
mouse(2);
bar(Xupravlemie,Yupravlemie+i,Xupravlemie+longKnoBypr,Yupravlemie+widthKnoBypr+i);
mouse(1);
}
settextstyle(0,0,3);
outtextxy(Xupravlemie-75,Yupravlemie+widthKnoBypr/2-5-100,"Choose Flied");
settextstyle(0,0,2);
outtextxy(Xupravlemie+4,Yupravlemie+widthKnoBypr/2-8,"Flied 9x9");
outtextxy(Xupravlemie+4,Yupravlemie+widthKnoBypr/2-8+widthKnoBypr+probel_upravleni,"Flied 15x15");
outtextxy(Xupravlemie+4,Yupravlemie+widthKnoBypr/2-8+probel_upravleni*2+widthKnoBypr*2,"Flied 45x45");
outtextxy(Xupravlemie+4,Yupravlemie+widthKnoBypr/2-8+probel_upravleni*3+widthKnoBypr*3,"Exit main");
settextstyle(0,0,0);
delay(200);
mouse(1);
mov_mouse(3);
for (q = 1; q <= kolishestvo ; q++)
if((y > (Yupravlemie+probel_upravleni*(q-1)+widthKnoBypr*(q-1)))&&(y < (Yupravlemie+probel_upravleni*(q-1)+widthKnoBypr*q))&&(x>Xupravlemie)&&(x<Xupravlemie+longKnoBypr))break;
if(q==1) {iSizeFl=9;eZxxxit=0;}
if(q==2) {iSizeFl=15;eZxxxit=0;}
if(q==3) {iSizeFl=45;eZxxxit=0;}
if(q==4) {just=1;return;}
}
while(eZxxxit==1);
}
/*************************************************************************/
void save(int wins_old_nick,int win_new_nick)
{
ifstream f("data.txt");
f >> n;
for(i = 0; i<n; i++)
{
f >> length[i];
if(length[i]>max) max=length[i];
for (j = 0; j < length[i]; j++)
f>>nick[i][j];
}
for(i = 0; i<n; i++)
{
f>> winer[i];
}
if(type_of_nick==0)
{
for(i = 0; i<n; i++)
{
if(length[i]==length_old_nick)
for (j = 0; j < length[i]; j++)
if(nick[i][j]==old_nick[j]) count++;
if (count==length_old_nick)
{
winer[i]=winer[i]+wins_old_nick;
}
}
ofstream fl("data.txt");
fl<<n;
fl<<'\n';
for(i=0;i<n;i++)
{
fl << length[i];
if(length[i]>max) max=length[i];
for (j = 0; j < length[i]; j++)
fl<<nick[i][j];
fl<<'\n';
}
for(i = 0; i<n; i++)
{
fl<< winer[i];
if(i!=n-1)fl<<'\n';
}
}
if(type_of_nick==1)
{
for(j=0;j<length_new_nick;j++)
{
nick[n][j] = new_nick[j];
}
length[n]=length_new_nick;
winer[n] = win_new_nick;
n=n+1;
ofstream fl("data.txt");
fl<<n;
fl<<'\n';
for(i=0;i<n;i++)
{
fl << length[i];
if(length[i]>max) max=length[i];
for (j = 0; j < length[i]; j++)
fl<<nick[i][j];
fl<<'\n';
}
for(i = 0; i<n; i++)
{
fl<< winer[i];
fl<<'\n';
}
}
wins_old_nick=0;win_new_nick=0;
for (i = 0; i < 10; i++)
for (j = 0; j < 10; j++)
{
nick[i][j]=' ';
winer[i]=0;
}
}
/*************************************************************************/
void oformlenie()
{
cleardevice();
setbkcolor(7);
setcolor(9);
kletka = 450/iSizeFl;
setfillstyle(1,15);
bar(fieldsX,fieldsY,640-fieldsX,480-fieldsY);
for(i=0;i<(iSizeFl+1)*kletka;i=i+kletka)
{
line(fieldsX+i,fieldsY,fieldsX+i,480-fieldsY);
line(fieldsX,fieldsY+i,640-fieldsX,fieldsY+i);
}
setfillstyle(1,14);
for(i=0;i<3;i++)
bar(menuX,menuY+widthmenu*i+space*i,menuX+Longmenu-10,menuY+widthmenu*(i+1)+space*i);
outtextxy(menuX+5,menuY+widthmenu/2,"start");
outtextxy(menuX+5,menuY+widthmenu/2+widthmenu+space,"save");
outtextxy(menuX+5,menuY+widthmenu/2+widthmenu*2+space*2,"Exit main");
w=0;
setfillstyle(1,15);
bar(640-fieldsX+w+3,fieldsY,640-fieldsX+w+5+80,100);
setfillstyle(1,15);
bar(640-fieldsX+w+3,fieldsY+100,640-fieldsX+w+5+80,200);
if(type_of_nick==0)
{
for(i=0;i<length_old_nick;i++)
{
setcolor(4);
back_buf[0]=old_nick[i];
back_buf[1]='\x0';
outtextxy(640-fieldsX+w+5,30,back_buf);
w+=8;
}
setcolor(9);
back_buf[0]=char(48+wins_old_nick);
back_buf[1]='\x0';
outtextxy(640-fieldsX+5,40,back_buf);
}
if(type_of_nick==1)
{
setcolor(4);
for(i=0;i<length_new_nick;i++)
{
back_buf[0]=new_nick[i];
back_buf[1]='\x0';
outtextxy(640-fieldsX+w+5,30,back_buf);
w+=8;
}
setcolor(9);
back_buf[0]=char(48+win_new_nick);
back_buf[1]='\x0';
outtextxy(640-fieldsX+5,40,back_buf);
}
setcolor(4);
outtextxy(640-fieldsX+5,55,"Computer");
setcolor(9);
back_buf[0]=char(48+win_comp);
back_buf[1]='\x0';
outtextxy(640-fieldsX+5,65,back_buf);
setcolor(4);
outtextxy(640-fieldsX+5,80,"Tie");
setcolor(9);
back_buf[0]=char(48+tie);
back_buf[1]='\x0';
outtextxy(640-fieldsX+5,90,back_buf);
}
/****************************************************************************/
void paint(int znak,int g, int h)
{
int t=0;
kletka = 450/iSizeFl;
setcolor(1);
if(znak==1)
{
if(iSizeFl!=45)
{
do
{
line(fieldsX+kletka*(g-1)+t,fieldsY+kletka*(h-1),fieldsX+kletka*g,fieldsY+kletka*h-t);
line(fieldsX+kletka*(g-1),fieldsY+kletka*h-t,fieldsX+kletka*g-t,fieldsY+kletka*(h-1));
line(fieldsX+kletka*(g-1),fieldsY+kletka*(h-1)+t,fieldsX+kletka*g-t,fieldsY+kletka*h);
line(fieldsX+kletka*(g-1)+t,fieldsY+kletka*h,fieldsX+kletka*g,fieldsY+kletka*(h-1)+t);
t++;
}while(t!=5);
}
else
do
{
line(fieldsX+kletka*(g-1)+t,fieldsY+kletka*(h-1),fieldsX+kletka*g,fieldsY+kletka*h-t);
line(fieldsX+kletka*(g-1),fieldsY+kletka*h-t,fieldsX+kletka*g-t,fieldsY+kletka*(h-1));
line(fieldsX+kletka*(g-1),fieldsY+kletka*(h-1)+t,fieldsX+kletka*g-t,fieldsY+kletka*h);
line(fieldsX+kletka*(g-1)+t,fieldsY+kletka*h,fieldsX+kletka*g,fieldsY+kletka*(h-1)+t);
t++;
}while(t!=2);
}
setcolor(13);
if(znak==0)
{
do
{
circle(fieldsX+(kletka)*(g-0.5),fieldsY+(kletka)*(h-0.5),kletka/2-5+t);
circle(fieldsX+(kletka)*(g-0.5),fieldsY+(kletka)*(h-0.5),kletka/2-5-t);
t++;
}while(t!=5);
}
setcolor(9);
}
/****************************************************************************/
void game()
{
cleardevice();
int proverka;
vixod2=1;
do
{
cleardevice();
mouse(2);
oformlenie();
mouse(1);
mov_mouse(3);
for(er=1;er<=3;er++)
{
if((x>menuX)&&(x<menuX+Longmenu)&&(y>menuY+widthmenu*(er-1)+space*(er-1))&&(y<menuY+widthmenu*er+space*(er-1)))break;
}
if(er==2)
{
mouse(2);
save(wins_old_nick,win_new_nick);
setcolor(4);
outtextxy(640-fieldsX+8,fieldsY+40+100,"You save!");;
delay(2000);
setfillstyle(1,15);
bar(640-fieldsX+w+3,fieldsY+100,640-fieldsX+w+5+80,200);
mouse(1);
}
if(er==3) {return;}
if(er==1)
{
for(i=0; i<iSizeFl; i++)
for(j=0; j<iSizeFl; j++)
{
chArrPie[i][j]='2';
iArrVes0[i][j]=0;
iArrVesX[i][j]=0;
}
delay(200);
mouse(1);
int cikl;
cikl=0;
do
{
for(er=1;er<=3;er++)
{
if((x>menuX)&&(x<menuX+Longmenu)&&(y>menuY+widthmenu*(er-1)+space*(er-1))&&(y<menuY+widthmenu*er+space*(er-1)))break;
}
if(er==2)
{
mouse(2);
save(wins_old_nick,win_new_nick);
outtextxy(640-fieldsX+8,fieldsY+40+100,"You save!");;
delay(1000);
setfillstyle(1,15);
bar(640-fieldsX+w+3,fieldsY+100,640-fieldsX+w+5+80,200);
cikl=1;
mouse(1);
}
else cikl=0;
if(er==3)
{
cleardevice();
return;
}
do
{
mov_mouse(3);
for(i=1;i<=iSizeFl;i++)
if((x>(fieldsX+(i-1)*kletka))&&(x<(fieldsX+i*kletka))) break;
for(j=1;j<=iSizeFl;j++)
if((y>(fieldsY+(j-1)*kletka))&&(y<(fieldsY+j*kletka))) break;
}
while((i<1)||(i>iSizeFl)||(j<1)||(j>iSizeFl));
}
while(cikl==1);
if((i!=iSizeFl+1)&&(j!=iSizeFl+1))
{
chArrPie[i-1][j-1]='1';
znak=1;
mouse(2);
if (znak==1)
{
kletka_cross cr(fieldsX,fieldsY);
cr.paint(i,j,iSizeFl);
}else
{
kletka_nolik kr (fieldsX,fieldsY);
kr.paint(i,j,iSizeFl);
}
mouse(1);
}
randomize();
u=0;
do
{
proverka_2=1;
do
{
i0=random(iSizeFl-1);
j0=random(iSizeFl-1);
if((chArrPie[i0][j0]!='0')&&(chArrPie[i0][j0]!='1'))break;
}
while(proverka_2==1);
chArrPie[i0][j0]='0';
znak=0;
mouse(2);
if (znak==1)
{
kletka_cross cr(fieldsX,fieldsY);
cr.paint(i0+1,j0+1,iSizeFl);
}else
{
kletka_nolik kr (fieldsX,fieldsY);
kr.paint(i0+1,j0+1,iSizeFl);
}
//paint(znak,i0+1,j0+1);
mouse(1);
u++;
delay(200);
mouse(1);
cikl=0;
do
{
for(er=1;er<=3;er++)
{
if((x>menuX)&&(x<menuX+Longmenu)&&(y>menuY+widthmenu*(er-1)+space*(er-1))&&(y<menuY+widthmenu*er+space*(er-1)))break;
}
if(er==2)
{
mouse(2);
save(wins_old_nick,win_new_nick);
outtextxy(640-fieldsX+8,fieldsY+40+100,"You save!");;
delay(1000);
setfillstyle(1,15);
bar(640-fieldsX+w+3,fieldsY+100,640-fieldsX+w+5+80,200);
mouse(1);
cikl=1;
}
else(cikl=0);
if(er==3) {cleardevice();return;vixod2=0;}
}
while(cikl==1);
do
{
mov_mouse(3);
for(i=1;i<=iSizeFl;i++)
if((x>(fieldsX+(i-1)*kletka))&&(x<(fieldsX+i*kletka))) break;
for(j=1;j<=iSizeFl;j++)
if((y>(fieldsY+(j-1)*kletka))&&(y<(fieldsY+j*kletka))) break;
}
while((i<1)||(i>iSizeFl)||(j<1)||(j>iSizeFl));
if((i!=iSizeFl+1)&&(j!=iSizeFl+1))
{
chArrPie[i-1][j-1]='1';
znak=1;
mouse(2);
if (znak==1)
{
kletka_cross cr(fieldsX,fieldsY);
cr.paint(i,j,iSizeFl);
}else
{
kletka_nolik kr (fieldsX,fieldsY);
kr.paint(i,j,iSizeFl);
}
//paint(znak,i,j);
mouse(1);
}
}
while(u!=2);
proverka=1;
do
{
exitFor=0;
do
{
AllMax0=0;AllMaxX=0;
for(i=0; i<iSizeFl; i++)
for(j=0; j<iSizeFl; j++)
{
iArrVes0[i][j]=0;
iArrVesX[i][j]=0;
}
for(i=0; i<iSizeFl; i++)
{
for(j=0; j<iSizeFl; j++)
{
max=0;count=0; maxX=0;countX=0;
if((exitFor==0)&&(chArrPie[i][j]=='2')&&((chArrPie[i][j-1]=='0')||(chArrPie[i][j+1]=='0')))
{
if((chArrPie[i][j-1]=='0')&&(j!=0))
{
l=j-1;
do
{
count++;
l--;
}
while((chArrPie[i][l]=='0'));
}
else
{
if(j!=iSizeFl-1)
{
l=j+1;
do
{
count++;
l++;
}
while((chArrPie[i][l]=='0'));
}
}
}
if((exitFor==0)&&(chArrPie[i][j]=='2')&&((chArrPie[i][j-1]=='1')||(chArrPie[i][j+1]=='1')))
{
if((chArrPie[i][j-1]=='1')&&(j!=0))
{
l=j-1;
do
{
countX++;
l--;
}
while((chArrPie[i][l]=='1'));
}
else
{
if(j!=iSizeFl-1)
{
l=j+1;
do
{
countX++;
l++;
}
while((chArrPie[i][l]=='1'));
}
}
}
if(count>max) max=count;
if(countX>maxX) maxX=countX;
if(count==4) exitFor=1;
count=0;countX=0;
if((exitFor==0)&&(chArrPie[i][j]=='2')&&((chArrPie[i-1][j]=='0')||(chArrPie[i+1][j]=='0')))
{
if((chArrPie[i-1][j]=='0')&&(i!=0))
{
l=i-1;
do
{
count++;
l--;
}
while((chArrPie[l][j]=='0'));
}
else
{
if(i!=iSizeFl-1)
{
l=i+1;
do
{
count++;
l++;
}
while((chArrPie[l][j]=='0'));
}
}
}
if((exitFor==0)&&(chArrPie[i][j]=='2')&&((chArrPie[i-1][j]=='1')||(chArrPie[i+1][j]=='1')))
...Подобные документы
Общая характеристика языков программирования. Краткий обзор C, C++, Java, PHP, Python, Delphi и Visual Basic. Процесс разработки программы игра "Крестики и нолики" с помощью AppWizard. Компиляция и компоновка модулей, определение интерфейса приложения.
курсовая работа [2,5 M], добавлен 27.05.2014Разработка популярной развлекательной игры крестики-нолики. Возможность играть с компьютером, который играет согласно созданному алгоритму. Новые возможности Visual Studio. Легкое усвоение программы. Удобный интерфейс - "визитная карточка" приложения.
курсовая работа [74,6 K], добавлен 20.12.2009Разработка алгоритма, выполняющего поиск наилучшего решения на каждый ход в игре "крестики-нолики" (используя минимальный алгоритм). Обоснование выбора программных средств для решения задачи. Блок-схема интеллектуального алгоритма реализации программы.
контрольная работа [380,0 K], добавлен 28.04.2014Проект программы "Крестики-нолики". Блок-схема алгоритма. Описание работы программного продукта. Инструкция по инсталляции. Инструкция программисту, возможность доработки с целью упрощения исполняемых кодов. Инструкция по проверке и тестированию.
курсовая работа [235,8 K], добавлен 05.12.2009Знакомство с интерфейсом пользователя и сценарием использования программы игры в крестики и нолики. Функциональные и нефункциональные требования для персонального компьютера. Исключительные ситуации и реакция программы. Пример кода игры и комментарии.
курсовая работа [236,5 K], добавлен 27.01.2014Технические и пользовательские характеристики игры, требования к программному обеспечению и среде разработки C#. Составление блок-схемы алгоритма, uml-диаграммы и текста программы, тестирование корректности компьютерного кода и результатов его работы.
курсовая работа [1,8 M], добавлен 05.03.2013Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.
курсовая работа [352,8 K], добавлен 14.04.2011Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Описание этапов разработки программы "дневник": формулирование проблемной ситуации, определение технических требований в функциональным характеристикам и надежности программы, проектирование интерфейса, создание алгоритмов. Тестирование готового продукта.
курсовая работа [1,7 M], добавлен 26.12.2011Анализ предметной области разрабатываемого программного продукта. Разработка интерфейса пользователя и структурной схемы игровой программы "Крестики-нолики". Отладка и тестирование. Проведение исследования компонентов программной среды Borland Delphi 6.0.
курсовая работа [660,4 K], добавлен 08.03.2015Требования к функциональным характеристикам проектируемого интернет-магазина. Требования к составу и параметрам технических средств и программной документации. Стадии и этапы разработки интернет-магазина, проверка и контроль правильности ее работы.
курсовая работа [598,2 K], добавлен 17.05.2011Программный продукт для игры "Крестики-нолики". Описание пользовательского интерфейса. Факт базы данных, определяющий состояние счёта. Предикат изменяющий состояние игрового процесса и подсчитывающий количество занятых ячеек поля. Исходный код программы.
курсовая работа [34,6 K], добавлен 19.05.2014Стадии и этапы разработки программного продукта для осуществления упрощенной работы с клиентами и учёта услуг оказываемых "Интернет-центром". Требования к функциональным характеристикам и надежности программы, к составу и параметрам технических средств.
лабораторная работа [29,4 K], добавлен 13.06.2014Требования к функциональным характеристикам программы, составу и параметрам технических средств, программной совместимости. Особенности программирования в среде Access. Описание интерфейса программы, ввод и редактирование данных, добавление новых книг.
курсовая работа [1,5 M], добавлен 17.11.2010Анализ программной системы, способной облегчить действия руководителя тушения пожара и повысить эффективность пожарных работ. Требования к функциональным характеристикам, составу и параметрам технических средств. Разработка программной документации.
курсовая работа [381,6 K], добавлен 13.08.2013Обзор известных программ, которые выполняют аналогичные функции. Выбор инструментальных средств разработки. Проектирование пользовательского интерфейса и структур данных (во внешней и оперативной памяти). Выбор стандартных визуальных компонентов.
курсовая работа [1,1 M], добавлен 13.10.2015Основание для разработки web-сайта. Требования к программной документации, стадии и этапы разработки сайта. Установка пакета Denwer. Установка программы создания и редактирования Web-сайтов Joomla 1.5. Расчет себестоимости программного продукта.
дипломная работа [7,7 M], добавлен 30.06.2012Обоснование выбора технологии и программных средств для разработки утилиты. Требования к функциональным характеристикам и моделирование предметной области. Спецификация вариантов использования и расчет показателей экономической эффективности проекта.
дипломная работа [1,1 M], добавлен 13.12.2013Особенности документирования программных средств, стадии разработки продуктов. Классификация обеспечивающего пакета документов. Сущность и основные недостатки Единой системы программной документации. Классификация стандартов, Гост 19.102-77 ЕСПД.
презентация [64,8 K], добавлен 22.03.2014Разработка аналога игры "Крестики-нолики", где игроки выбирают размер поля. Правила игры. Интерфейс программы. Главная функция main. Класс XO. Метод вывода поля и хода игроков. Методы поиска крестиков, ноликов. Методы проверки выигрышных ситуаций игроков.
курсовая работа [281,5 K], добавлен 30.01.2018