Игра "Крестики-нолики"
Разработка игры "Крестики-нолики" с применением объектно-ориентированного программирования. Выполнение стратегии ходов компьютера, работа с файлами. Переопределение стандартных операций для абстрактных типов данных. Проработка программных средств.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 12.01.2015 |
Размер файла | 2,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Курсовая работа
по дисциплине
Программирование на языке высокого уровня
Игра Крестики-нолики"
ВВЕДЕНИЕ
Данная курсовая работа посвящена разработке игры «Крестики-нолики», реализованная с применением объектно-ориентированного программирования. Курсовая работа ставит перед собой цель проработки и упорядочивания знаний, полученных в течение двух семестров изучения дисциплины «Программирование на языке высокого уровня». Курсовая работа представляет собой индивидуальное задание повышенной сложности по разработке программы на изучаемом языке высокого уровня.
В курсовой работе будут рассмотрены: алгоритм выполнения стратегии ходов компьютера, работа с файлами, графический режим, объектно-ориентированное программирование. Все элементы будут рассмотрены на языке программирования высокого уровня С++.
Выполнение задания требует комплексного применения своих знаний как в части владения языком программирования, так и в части умения создавать и реализовывать сложные алгоритмы.
Игра «Крестики-нолики», описанная в данной работе, является полноценным программным продуктом, готовым для использования. Она обладает доступным, понятным и наглядным для пользователя интерфейсом.
1. ПОСТАНОВКА ЗАДАЧИ
Используя ООП, написать программу, реализующую идею игры. Выполнить переопределение стандартных операций для абстрактных типов данных. Использовать конструкторы, деструкторы. Использовать графический режим.
игра объектный программирование файл
2. ВЫБОР И ПРОРАБОТКА ПРОГРАММНЫХ СРЕДСТВ
Язык C был разработан в начале семидесятых небольшой группой инженеров, работающих в лабораториях Белла, для создания операционной системы Unix. Язык С оказался достаточно мощным и очень скоро завоевал передовые позиции среди средств разработки программного обеспечения. Однако со временем в программировании появились новые технологии (например, объектно-ориентированное программирование), которые постепенно вытесняли язык С.
Язык программирования С++ был разработан на основе языка С Бьярном Страуструпом (Bjarne Stroustrup) и вышел за пределы его исследовательской группы в начале 80-х годов. Язык С++ является надмножеством языка Си, поэтому программы, написанные на языке Си могут обрабатываться компилятором языка С++. В программах на языке С++ можно использовать тексты на языке С и обращаться к библиотечным функциям языка Си. Язык С++ был создан с учетом следующих целей: улучшить язык Си, поддержать абстракцию данных и обеспечить объектно-ориентированное программирование.
Объектно-ориентированное программирование (ООП) -- методология программирования, основанная на представлении программы в виде совокупности объектов каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
Объектно-ориентированное программирование -- это обобщение структурного и модульного программирования для оптимизации создания программ и программных комплексов. ООП позволяет быстро и с минимальным количеством ошибок написать программу, код которой легко понять другим и самому, и, следовательно, изменить при необходимости. Язык программирования является объектно-ориентированным, когда выполняются условия:
· поддерживаются объекты или абстракции данных, имеющие интерфейс в виде именованных операций и собственные данные с ограничением доступа к ним;
· объекты относятся к соответствующим типам;
· типы (классы) могут наследовать атрибуты супертипов (базовых классов);
Три основные положения объектно-ориентированного программирования:
· инкапсуляция
· наследование
· полиморфизм
В языке C++ программист имеет возможность вводить собственные типы данных и определять операции над ними с помощью классов.
Классы -- это производные структурированные типы, введенные программистом на основе уже существующих типов. Механизм классов позволяет вводить собственные типы данных, т.е. класс задает некоторую структурированную совокупность типизированных данных и позволяет определить набор операций над этими данными. Закрытые данные - члены класса и определения всех функций членов класса входят во внутреннюю используемую часть класса private. Для возможности работы с этим классом часть членов должна быть открытой. Эта часть класса называется интерфейсом (public). В отличие от прототипов функции членов класса, объявленных открытыми, определение этих функций не входит в интерфейс класса. Класс инкапсулирует информацию, связывая вместе члены и методы и обращаясь с ними как с одним целым.
Возможность изменения используемой части класса, без опасности возникновения ошибок в программах, использующих этот класс, называется инкапсуляцией. Важность инкапсуляции заключается в том, что каждый класс может изменяться в процессе разработки или даже после ее завершения без нарушения работоспособности остальных частей программы.
Инкапсуляция - это максимально возможная независимость каждого объекта. Внутренняя структура объекта скрыта для всех остальных объектов. Одним из способов организации взаимодействия объектов является обмен сообщениями. Структура этих сообщений не зависит от конкретных объектов, которым или от которых они передаются. Имя функции обрабатывающей одно и то же событие для всех объектов одинаково, но ее реализация зависит от объекта, точнее от класса этого объекта, и определяется во время выполнения программы. Конкретная реализация функции с учетом объекта будет выполняться во время выполнения программы. Это свойство называется полиморфизмом и поддерживается с помощью механизма виртуальных функций. Общая концепция виртуальных функций поддерживает наследование в том, что позволяет двум или более объектам в иерархии наследования иметь методы с одним и тем же объявлением, выполняющие различные задачи.
Объекты разных классов и сами классы могут находиться в отношении наследования, при котором формируется иерархия объектов, соответствующая заранее предусмотренной иерархии классов. Иерархия классов позволяет определять новые классы на основе уже имеющихся. Производный класс получает данные и методы базового класса - и, кроме того, может пополняться собственными компонентами (данными или методами). Наследуемые компоненты не перемещаются в производный класс, а остаются в базовом классе. Сообщение, обработку которого не могут выполнить методы производного класса, автоматически передается в базовый класс.
3. ПРОЕКТИРОВАНИЕ ПРОГРАММЫ
3.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. |
3.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.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;
}
3.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, который реализует графическое оформление приветствия в начале программы
3.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(). При этом, управление меню происходит с помощью мыши.
3.6 Описание метода privet()
Данный метод отвечает за приветствие, которое пользователь видит на экране при заходе в программу (рис. 6.1). Эффект анимации создан с помощью стандартных функций графического режима, таких как: cleardevice(); - очистка экрана, setbkcolor(); - установка цвета фона экрана, delay(); - задержка, outtextxy(); - вывод текста на экран в зависимости от заданных координат, settextstyle(); - установка стиля текста, setcolor(); - установка цвета текста. За счет того, что функции выполняются в цикле, достигается эффект анимации.
Рис. 6.1 Приветствие игрока
3.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 Вывод на экран сообщение
3.8 Описание метода menu()
Метод menu() описывает графический интерфейс главного меню. Меню состоит из 4 кнопок: Begin, Record, Spravka, Exit (рис .8.1).
Кнопки рисуются с помощью функций bar(); в цикле. Управление меню осуществляется мышкой. Считываются соответствующие координаты при нажатии на кнопку с помощью метода mov_mouse(3);, пользователь попадает в соответствующее подменю.
Рис. 8.1 Главное меню игры
3.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], который необходим для такого типа сортировки и хранит промежуточные значения, при этом одновременно сортируется и длина ника для того, чтобы правильно определять границы массива.
3.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;. Таким образом, осуществляется выход в главное меню.
3.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 Процесс игры
3.12 Руководство по использованию
Чтобы запустить программу, необходимо нажать NEW_KUR.exe из соответствующей директории.
При запуске программы сначала появляется титульный лист. Далее появится приветствие пользователя в виде анимации. Необходимо нажать любую кнопку для продолжения. После нажатия кнопки пользователь должен зарегистрироваться или ввести ник, если он уже существует у него. После этого он попадает в главное меню. В главном меню у него есть четыре возможности: войти в игру, посмотреть рекорды, прочитать информацию об игре, либо выйти из игры. Управлять игрой осуществляется мышкой, если нет сообщений на экране о нажатии на кнопку.
4. АНАЛИЗ РЕЗУЛЬТАТОВ РАЗРАБОТКИ ПРОГРАММЫ
Для тестирования работы программы были использованы различные варианты расположения фишек на различных полях. Программа работает правильно без явных сбоев. В таблице рекордов программа корректно выполняет считывание данных из файла и производит запись или перезапись данных в файл.
ЗАКЛЮЧЕНИЕ
В ходе написания программы были использованы элементы объектно-ориентированного программирования. Основу программы составили классы. Было использовано переопределение стандартных операций для переменных абстрактных типов, а так же работа с графикой, строками и т.д.
Были применены знания, полученные в процессе изучения курса «Программирование на ЯВУ». При выполнении курсовой была проработана литература по языкам С/С++, объектно-ориентированному программированию. Работать с объектами класса при помощи функций членов намного удобнее, нежели не использовать классы, а применять только стандартный набор типов данных.
Пользователю не придется тратить много времени на освоение правил игры «Крестики-нолики». Простота и наглядность интерфейса делают игру удобной в использовании.
Выполнение курсовой работы помогло закрепить материал и навыки, полученный на лекциях и лабораторных работах, помогло систематизировать знание языка и научится применять их к конкретным задачам.
СПИСОК ЛИТЕРАТУРЫ
1. Мирошниченко Е.А. и др. Программирование на языке С++. Часть II. Учебное пособие/ Н.В. Триханова, Е.А. Мирошниченко. - Томск: Изд. ТПУ, 2011. - 118с.
2. Костюк Ю.Л. Основы алгоритмизации: Учебное пособие. / Ю.Л.Костюк. - Томск: Изд. ТГУ, 2008. - 124с.
3. Бондарев В.М. и др. Основы программирования. / В.М.Бондарев, В.И.Рублинецкий, Е.Г.Качко. / Худож.-оформитель С.А.Пяткова. - Харьков: Фолио; Ростов н/Д: Феникс, 2007. - 368с.
4. Вирт Н. Алгоритмы и структуры данных. / Н.Вирт. - М., 2012. - 310с.:ил.
ПРИЛОЖЕНИЕ 1
ЛИСТИНГ ПРОГРАММЫ
#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')))
{
if((chArrPie[i-1][j]=='1')&&(i!=0))
{
l=i-1;
do
{
countX++;
l--;
}
while((chArrPie[l][j]=='1'));
}
else
{
if(i!=iSizeFl-1)
{
l=i+1;
do
{
countX++;
l++;
}
while((chArrPie[l][j]=='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-1]=='0')||(chArrPie[i+1][j+1]=='0')))
{
if((chArrPie[i-1][j-1]=='0')&&(j!=0))
{
l=j-1;k=i-1;
do
{
count++;
l--;
k--;
}
while((chArrPie[k][l]=='0'));
}
else
{
if(i!=iSizeFl-1)
{
l=j+1;k=i+1;
do
{
count++;
l++;
k++;
}
while((chArrPie[k][l]=='0'));
}
}
}
if((exitFor==0)&&(chArrPie[i][j]=='2')&&((chArrPie[i-1][j-1]=='1')||(chArrPie[i+1][j+1]=='1')))
{
if((chArrPie[i-1][j-1]=='1')&&(j!=0))
{
l=j-1;k=i-1;
do
{
countX++;
l--;
k--;
}
while((chArrPie[k][l]=='1'));
}
else
{
if(i!=iSizeFl-1)
{
l=j+1;k=i+1;
do
{
countX++;
l++;
k++;
}
while((chArrPie[k][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-1]=='0')||(chArrPie[i-1][j+1]=='0')))
{
if((chArrPie[i+1][j-1]=='0')&&(j!=0))
{
l=j-1;k=i+1;
do
{
count++;
k++;
l--;
}
while((chArrPie[k][l]=='0'));
}
else
{
if(j!=iSizeFl-1)
{
l=j+1;k=i-1;
do
{
count++;
l++;
k--;
}
while((chArrPie[k][l]=='0'));
}
}
}
if((exitFor==0)&&(chArrPie[i][j]=='2')&&((chArrPie[i+1][j-1]=='1')||(chArrPie[i-1][j+1]=='1')))
{
if((chArrPie[i+1][j-1]=='1')&&(j!=0))
{
l=j-1;k=i+1;
do
{
countX++;
k++;
l--;
}
while((chArrPie[k][l]=='1'));
}
else
{
if(j!=iSizeFl-1)
{
l=j+1;k=i-1;
do
{
countX++;
l++;
k--;
}
while((chArrPie[k][l]=='1'));
}
}
}
if(count>max) max=count;
if(countX>maxX) maxX=countX;
if(count==4) exitFor=1;
count=0; countX=0;
iArrVes0[i][j]=max;
if(max>AllMax0)AllMax0=max;
iArrVesX[i][j]=maxX;
if(maxX>AllMaxX)AllMaxX=maxX;
if(exitFor==1) break;
}
if(exitFor==1) break;
}
exitMark=1; way=0;
for(i=0; i<iSizeFl; i++)
{
for(j=0; j<iSizeFl; j++)
if((iArrVesX[i][j]==AllMaxX)&&(AllMaxX==4)&&(exitMark==1)&&(chArrPie[i][j]=='2'))
{
chArrPie[i][j]='0';
exitMark=0;
way=1;
znak=0;
mouse(2);
if (znak==1)
{
kletka_cross cr(fieldsX,fieldsY);
cr.paint(i+1,j+1,iSizeFl);
}else
{
kletka_nolik kr (fieldsX,fieldsY);
kr.paint(i+1,j+1,iSizeFl);
}
//paint(znak,i+1,j+1);
mouse(1);
count0=0;for_break=0;gor=0;vert=0;diag=0;pdiag=0;
for(q=0;q<iSizeFl;q++)
{
for(p=0;p<iSizeFl;p++)
{
if(chArrPie[q][p]=='0')
{
count0=0;
l=p+1;
do
{
count0++;
l++;
}
while((chArrPie[q][l]=='0'));
if(count0==4)
{
for_break=1;
gor=1;
break;
}
count0=0;
l=q+1;
do
{
count0++;
l++;
}
while((chArrPie[l][p]=='0'));
if(count0==4)
{
for_break=1;
vert=1;
break;
}
count0=0;
l=p+1;k=q+1;
do
{
count0++;
l++;
k++;
}
while((chArrPie[k][l]=='0'));
if(count0==4)
{
for_break=1;
diag=1;
break;
}
count0=0;
l=p+1;k=q-1;
do
{
count0++;
l++;
k--;
}
while((chArrPie[k][l]=='0'));
if(count0==4)
{
for_break=1;
pdiag=1;
break;
}
}
}
if(for_break==1)break;
}
if(count0==4)
{
mouse(2);
setcolor(4);
d=0;
if(vert==1)
do
{
line(fieldsX+kletka*q,fieldsY+kletka*p+kletka/2,fieldsX+kletka*q+kletka*5,fieldsY+kletka*p+kletka/2);
d++;
}
while(d!=3);
if(gor==1)
do
{
line(fieldsX+kletka/2+kletka*q,fieldsY+kletka*p,fieldsX+kletka/2+kletka*q,fieldsY+kletka*p+kletka*5);
d++;
}
while(d!=3);
if(diag==1)
do
{
line(fieldsX+kletka*q,fieldsY+kletka*p,fieldsX+kletka*q+kletka*5,fieldsY+kletka*p+kletka*5);
d++;
}
while(d!=3);
if(pdiag==1)
do
{
line(fieldsX+kletka*(q+1),fieldsY+kletka*p,fieldsX+kletka*(q+1)-kletka*5,fieldsY+kletka*p+kletka*5);
d++;
}
while(d!=3);
setcolor(9);
mouse(1);
exitFor=1;
winZnak=0;
}
}
//if(exitMark==0)break;
}
if(way!=1)
{
for(i=0; i<iSizeFl; i++)
for(j=0; j<iSizeFl; j++)
if((iArrVes0[i][j]==AllMax0)&&(exitMark==1)&&(chArrPie[i][j]=='2'))
{
chArrPie[i][j]='0';
exitMark=0;
znak=0;
mouse(2);
if (znak==1)
{
kletka_cross cr(fieldsX,fieldsY);
cr.paint(i+1,j+1,iSizeFl);
}else
{
kletka_nolik kr (fieldsX,fieldsY);
kr.paint(i+1,j+1,iSizeFl);
}
// paint(znak,i+1,j+1);
mouse(1);
}
count0=0;for_break=0;gor=0;vert=0;diag=0;pdiag=0;
for(q=0;q<iSizeFl;q++)
{
for(p=0;p<iSizeFl;p++)
{
if(chArrPie[q][p]=='0')
{
count0=0;
l=p+1;
do
{
count0++;
l++;
}
while((chArrPie[q][l]=='0'));
if(count0==4)
{
for_break=1;
gor=1;
break;
}
count0=0;
l=q+1;
do
{
count0++;
l++;
}
while((chArrPie[l][p]=='0'));
if(count0==4)
{
for_break=1;
vert=1;
break;
}
count0=0;
l=p+1;k=q+1;
do
{
count0++;
l++;
k++;
}
while((chArrPie[k][l]=='0'));
if(count0==4)
{
for_break=1;
diag=1;
break;
}
count0=0;
l=p+1;k=q-1;
do
{
count0++;
l++;
k--;
}
while((chArrPie[k][l]=='0'));
if(count0==4)
{
for_break=1;
pdiag=1;
break;
}
}
}
if(for_break==1)break;
}
if(count0==4)
{
mouse(2);
setcolor(4);
d=0;
if(vert==1)
do
{
line(fieldsX+kletka*q,fieldsY+kletka*p+kletka/2+d,fieldsX+kletka*q+kletka*5,fieldsY+kletka*p+kletka/2+d);
line(fieldsX+kletka*q,fieldsY+kletka*p+kletka/2-d,fieldsX+kletka*q+kletka*5,fieldsY+kletka*p+kletka/2-d);
d++;
}
while(d!=3);
if(gor==1)
do
{
line(fieldsX+kletka/2+kletka*q+d,fieldsY+kletka*p,fieldsX+kletka/2+kletka*q+d,fieldsY+kletka*p+kletka*5);
line(fieldsX+kletka/2+kletka*q-d,fieldsY+kletka*p,fieldsX+kletka/2+kletka*q-d,fieldsY+kletka*p+kletka*5);
d++;
}
while(d!=3);
if(diag==1)
do
{
line(fieldsX+kletka*q,fieldsY+kletka*p+d,fieldsX+kletka*q+kletka*5,fieldsY+kletka*p+kletka*5+d);
line(fieldsX+kletka*q,fieldsY+kletka*p-d,fieldsX+kletka*q+kletka*5,fieldsY+kletka*p+kletka*5-d);
d++;
}
while(d!=3);
if(pdiag==1)
do
{
line(fieldsX+kletka*(q+1),fieldsY+kletka*p+d,fieldsX+kletka*(q+1)-kletka*5,fieldsY+kletka*p+kletka*5+d);
line(fieldsX+kletka*(q+1),fieldsY+kletka*p-d,fieldsX+kletka*(q+1)-kletka*5,fieldsY+kletka*p+kletka*5-d);
d++;
}
while(d!=3);
setcolor(9);
mouse(1);
exitFor=1;
winZnak=0;
}
}
if(exitFor==0)
{
delay(200);
mouse(1);
cikl=0;
do
{
for(er=1;er<=3;er++)
{
if((x>menuX)&&(x<menuX+Longmenu)&&(y>m...
Подобные документы
Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Разработка популярной развлекательной игры крестики-нолики. Возможность играть с компьютером, который играет согласно созданному алгоритму. Новые возможности 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, C++, Java, PHP, Python, Delphi и Visual Basic. Процесс разработки программы игра "Крестики и нолики" с помощью AppWizard. Компиляция и компоновка модулей, определение интерфейса приложения.
курсовая работа [2,5 M], добавлен 27.05.2014Программный продукт для игры "Крестики-нолики". Описание пользовательского интерфейса. Факт базы данных, определяющий состояние счёта. Предикат изменяющий состояние игрового процесса и подсчитывающий количество занятых ячеек поля. Исходный код программы.
курсовая работа [34,6 K], добавлен 19.05.2014Разработка аналога игры "Крестики-нолики", где игроки выбирают размер поля. Правила игры. Интерфейс программы. Главная функция main. Класс XO. Метод вывода поля и хода игроков. Методы поиска крестиков, ноликов. Методы проверки выигрышных ситуаций игроков.
курсовая работа [281,5 K], добавлен 30.01.2018Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.
курсовая работа [352,8 K], добавлен 14.04.2011Документ, на основании которого ведется разработка. Требования к составу и параметрам технических средств, к информационной и программной совместимости. Проработка программных средств. Переопределение стандартных операций для абстрактных типов данных.
курсовая работа [371,5 K], добавлен 21.02.2012Разработка консольного приложения: описание и сценарий использования программы, интерфейс пользователя. Поэтапное описание создание кода компьютерной игры "Крестики нолики". Функциональные и нефункциональные требования, описание исключительных ситуаций.
методичка [819,6 K], добавлен 12.05.2013Технические и пользовательские характеристики игры, требования к программному обеспечению и среде разработки C#. Составление блок-схемы алгоритма, uml-диаграммы и текста программы, тестирование корректности компьютерного кода и результатов его работы.
курсовая работа [1,8 M], добавлен 05.03.2013Архитектура и тестирование программного комплекса. Описание реализованного протокола данных. Обработка входящих подключений. Работа пользовательского потока и потока отправки. Выбор языка программирования. Структура серверного и клиентского приложений.
курсовая работа [999,1 K], добавлен 20.12.2012Обзор известных программ, которые выполняют аналогичные функции. Выбор инструментальных средств разработки. Проектирование пользовательского интерфейса и структур данных (во внешней и оперативной памяти). Выбор стандартных визуальных компонентов.
курсовая работа [1,1 M], добавлен 13.10.2015Средства выделения и освобождения памяти. Динамические структуры данных. Связные линейные списки и их машинное представление. Структура одно- и двухсвязного списка. Реализация операций над связными линейными списками. Разработка программы на языке С++.
курсовая работа [944,7 K], добавлен 14.03.2015Составление программы искусственного интеллекта в среде программирования Delphi 7, осуществляющую игру "крестики-нолики" с пользователем. Данная программа имеет возможность запоминания ходов и на основе них ходить так, чтобы не оказаться в проигрыше.
контрольная работа [787,7 K], добавлен 16.01.2011Проектирование интеллектуальной логической игры "Галочки-нолики". Описание составляющих программы. Объявление переменных, Command1 по Command18. Основные кнопки, проектирование и проверка работы таймеров. Руководство по использованию, тестирование.
контрольная работа [444,2 K], добавлен 17.04.2015Использование объектно-ориентированного программирования - хорошее решение при разработке крупных программных проектов. Объект и класс как основа объектно-ориентированного языка. Понятие объектно-ориентированных языков. Языки и программное окружение.
контрольная работа [60,1 K], добавлен 17.01.2011Причины возникновения объектно-ориентированного программирования. Графическое представление классов; их отличия от других абстрактных типов данных. Типы абстракции, используемые при построении объекта. Сущность инкапсуляции, наследования и полиморфизма.
контрольная работа [222,1 K], добавлен 04.06.2014Разработка объектно-ориентированной модели животного, которая объясняется построением модели игры Terrarium. Модель построена на базе концепций объектно-ориентированного программирования. Разработка компонента, моделирующего поведение животного.
курсовая работа [23,2 K], добавлен 30.11.2008