Материалы для студентов→ Курсовая работа /

Техническое задание на разработку программной реализации игры «крестики-нолики»

Скачать файл
Добавил: fafnir
Размер: 1.12 MB
Добавлен: 14.02.2015
Просмотров: 6472
Закачек: 38
Формат: doc
Посмотреть документ в хорошем качестве (с картинками, формулами, таблицами)

Министерство образования и науки Российской Федерации

Государственное образовательное учреждение высшего

профессионального образования

«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ

ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Кафедра ИПС

ИГРА «КРЕСТИКИ-НОЛИКИ»

по дисциплине "Программирование на языке высокого уровня"

студент группы 8В01

Щукова К.Б.

доцент Погребная Т. К.

Томск – 2011

СОДЕРЖАНИЕ

Техническое задание

1. ВВЕДЕНИЕ

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, играть против компьютера и ходить крестиками во время игры. Данная игра предназначена для тренировки логического мышления пользователя.

  1. ОСНОВАНИЕ ДЛЯ РАЗРАБОТКИ

2.1. Документ, на основании которого ведётся разработка

Задание на курсовую работу по дисциплине «Программирование на языке высокого уровня».

2.2. Организация, утвердившая документ

Национальный Исследовательский  Томский политехнический университет.

  1. НАЗНАЧЕНИЕ РАЗРАБОТКИ

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

  1. ТРЕБОВАНИЯ К РАЗРАБОТКЕ

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», выбрать одно из трех возможных полей: 9x 9, 15x 15, 45x 45.

   4.1.6. Программа должна предоставить возможность пользователю в ходе игрового процесса наблюдать за своим количеством побед, за количеством побед компьютера, видеть свой ник и текущие победы в специальном окне  левом верхнем углу, а также в любой момент игры сохранить своё текущее количество побед.

             4.1.7. Программа должна предоставить возможность пользователю в ходе игрового процесса в случае выигрыша или проигрыша видеть в левом верхнем углу сообщение о победе или неудаче: «Youwin!»  или  «Youlose

             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. Требования к составу и параметрам технических средств

Для функционирования игры «Крестики-нолики» необходим компьютерIBMPC совместимый и следующие технические средства:

процессорIntel 80286 или совместимый;

объем свободной оперативной памяти 700 Кб;

объем необходимой памяти на жестком диске 600 Кб;

стандартныйVGA-монитор или совместимый;

стандартная клавиатура;

манипулятор «мышь»;

4.4. Требования к информационной и программной совместимости

Для функционирования текстового редактора необходимо наличие операционной системыMS-DOS или совместимой. Язык интерфейса – английский.

  1. ТРЕБОВАНИЯ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ

Предварительный состав программной документации:

«Техническое задание», текст программы с комментариями, описание алгоритма и программы.

«Руководство пользователя».

  1. ТЕХНИКО-ЭКОНОМИЧЕСКИЕ ПОКАЗАТЕЛИ

Существует эмулятор DosBox, который позволяет увеличить быстродействие выполнение программы и отрисовку графики, что значительно экономит время  при выполнении программы.

7. СТАДИИ И ЭТАПЫ РАЗРАБОТКИ

ТЗ - техническое задание, ПЗ -  пояснительная записка.

ВВЕДЕНИЕ

Данная курсовая работа посвящена разработке игры «Крестики-нолики»,реализованная с применением объектно-ориентированного программирования. Курсовая работа ставит перед собой цель проработки и упорядочивания знаний, полученных в течение двух семестров изучения дисциплины «Программирование на языке высокого уровня». Курсовая работа представляет собой индивидуальное задание повышенной сложности по разработке программы на изучаемом  языке высокого уровня.

В курсовой работе будут рассмотрены: алгоритм выполнения  стратегии ходов компьютера, работа с файлами, графический режим, объектно-ориентированное программирование. Все элементы будут рассмотрены на языке программирования  высокого уровня С++.

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

Игра «Крестики-нолики», описанная в данной работе, является полноценным программным продуктом, готовым для использования. Она обладает доступным, понятным и наглядным для пользователя интерфейсом.

ПОСТАНОВКА ЗАДАЧИ

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

ВЫБОР И ПРОРАБОТКА ПРОГРАММНЫХ СРЕДСТВ

Язык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. Функции классов

     2. Наследование класса kletka_pust

Наследование, представленное в программе относиться к простому наследованию, когда существуют один базовый класс и несколько потомков. Класс kletka_pust являеться базовым для классов kletka_cross и kletka_nolik. Рассмотрим подробно  структуру:

class kletka_pust

{

protected:

int fieldsX,fieldsY;

int s;

public:

kletka_pust(){}; //конструкторпоумолчанию

kletka_pust(intx1,inty1)

        // инициализация членов класса в конструкторе

{

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;

friendpair&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, который устанавливает для управления мыши границы экрана 640x 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().

Если пользователь нажимает на кнопкуEnteryournick, то есть член класса 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  в главное меню, нужно нажать на кнопкуExitmain. Для этого подключена мышь с помощью функций 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 9x 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')))

{

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>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;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);

}

countX=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]=='1')

{

countX=0;

l=p+1;

do

{

countX++;

l++;

}

while((chArrPie[q][l]=='1'));

if(countX==4)

{

for_break=1;

gor=1;

break;

}

countX=0;

l=q+1;

do

{

countX++;

l++;

}

while((chArrPie[l][p]=='1'));

if(countX==4)

{

for_break=1;

vert=1;

break;

}

countX=0;

l=p+1;k=q+1;

do

{

countX++;

l++;

k++;

}

while((chArrPie[k][l]=='1'));

if(countX==4)

{

for_break=1;

diag=1;

break;

}

countX=0;

l=p+1;k=q-1;

do

{

countX++;

l++;

k--;

}

while((chArrPie[k][l]=='1'));

if(countX==4)

{

for_break=1;

pdiag=1;

break;

}

}

}

if(for_break==1)break;

}

if(countX==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=1;

}

}

countTie=0;

for(w=0;w<iSizeFl;w++)

for(e=0;e<iSizeFl;e++)

if(chArrPie[w][e]=='2') countTie++;

if(countTie<10)

{

exitFor=1;

winZnak=3;

}

}

while(exitFor==0);

if(exitFor==1)proverka=0;

if(winZnak==1)

{

if(type_of_nick==0)wins_old_nick++;

if(type_of_nick==1)win_new_nick++;

setcolor(4);

outtextxy(640-fieldsX+15,fieldsY+40+100,"You win!");

delay(2000);

proverka=0;

}

if(winZnak==0)

{

win_comp++;

setcolor(4);

outtextxy(640-fieldsX+10,fieldsY+40+100,"You lose!");

delay(2000);

proverka=0;

}

if(winZnak==3)

{

tie++;

setcolor(4);

outtextxy(640-fieldsX+10,fieldsY+40+100,"Tie!");

delay(2000);

proverka=0;

}

}

while(proverka==1);

}

}

while(vixod2==1);

}

/****************************************************************************/

void swap(int s,int d)

{

   char bufer;

   int t,k;

   t = s;

   s = d;

   d = t;

   winer[i] = s;

   winer[i+1] = d;

   for(k=0; k<10; k++)

   {

bufer = ' ';

   }

   for(k=0; k<10; k++)

   {

bufer=nick[i][k];

nick[i][k]=nick[i+1][k];

nick[i+1][k]=bufer;

   }

   t=length[i+1];

   length[i+1] = length[i] ;

   length[i]=t;

}

/*--------------------------------------------------------------------------*/

void record()

{

const int menuXr=5, menuYr=30;

const int Longmenur=95;

const int widthmenur=30;

const int spacer=10;

char out[50];

int t,w, step,vixod_3=0;

int x1=450, y1=250, x2=550, y2=350;

int dirx = -1, diry = -1;

int k = 10;

int dt = 10;

int maxx = getmaxx(), maxy = getmaxy();

cleardevice();

delay(100);

while( !kbhit() )

{

delay(dt);

if (x1 <= 0 || x2 >= maxx)  dirx = -dirx;

if (y1 <= 0 || y2 >= maxy)  diry = -diry;

setcolor(11);

setfillstyle (1, 9);

bar (x1,y1,x2,y2);

x1 += dirx *k;

x2 += dirx *k;

y1 += diry *k;

y2 += diry *k;

setcolor(5);

settextstyle(0,0,5);

outtextxy(100,200,"RECORD");

setfillstyle (7, 5);

bar (x1,y1,x2,y2);

line (0, 0, maxx, 0);

line (0, 0, 0, maxy);

line (maxx, maxy, 0, maxy);

line (maxx, maxy, maxx, 0);

setcolor(1);

setfillstyle (1, 0);

settextstyle(0,0,1);

outtextxy(220,440,"To continue, press any key");

}

cleardevice();

setbkcolor(7);

setfillstyle(1,14);

mouse(2);

bar(menuXr,menuYr,menuXr-15+Longmenur,menuYr+widthmenur);

settextstyle(0,0,1);

setcolor(9);

outtextxy(menuXr+3,menuYr+widthmenur/2-3,"Exit main");

setcolor(1);

settextstyle(0,0,3);

outtextxy(menuXr+Longmenur+10,menuYr,"The records of game:");

setfillstyle(7,8);

bar(40,70,100+510,100+380);

setfillstyle(7,9);

bar(50,80,100+500,100+370);

setfillstyle(1,1);

bar(57,87,100+493,100+363);

setfillstyle(1,11);

bar(60,90,100+490,100+360);

mouse(1);

for (i = 0; i < 10; i++)

for (j = 0; j < 10; j++)

{

nick[i][j]=' ';

winer[i]=0;

}

ifstream f("data.txt");

f >> n;

for(i = 0; i<n; i++)

{

f >> length[i];

for (j = 0; j < length[i]; j++)

f>>nick[i][j];

}

for(i = 0; i<n; i++)

{

f>> winer[i];

}

for (j=0; j<n-1; j++)

for (i=0; i<n-j-1; i++)

if (winer[i] < winer[i+1]) swap(winer[i],winer[i+1]);

t=0;w=0;step=40;

for(i = 0; i<n; i++)

{

if((winer[i]==winer[i+1])&&(i!=n-1))

{

for(j=0; j<10; j++)

{

if(int(nick[i][j]) > int(nick[i+1][j]))

{

for(k=0; k<10; k++)

{

      buf[k] = nick[i+1][k];

      nick[i+1][k] = nick[i][k];

      nick[i][k] = buf[k];

}

length_buf = length[i];

length[i] = length[i+1];

length[i+1] = length_buf;

break;

}

}

}

w=0;

for(j = 0; j<length[i]; j++)

{

back_buf[1]='\x0';

back_buf[0]=nick[i][j];

setcolor(8);

settextstyle(0,0,2);

outtextxy(100+w,100+t,back_buf);

w+=20;

}

sprintf(out,"%d",winer[i]);

setcolor(1);

settextstyle(0,0,2);

outtextxy(250,100+t,out);

t+=20;

}

mouse(1);

do

{

mov_mouse(3);

if( (x>menuXr)&&(x<menuXr+Longmenur)&&(y>menuYr)&&(y< menuYr+widthmenur)) return;

sound(80);

delay(100);

nosound();

}

while(vixod_3==0);

}

/****************************************************************************/

void spravka()

{

  int vixod_3=0;

  int midx,midy;

  int r=50;

  int x1=450, y1=250, x2=550, y2=350;

  int dirx = -1, diry = -1;

  int k = 10;

  int dt = 10;

  int maxx = getmaxx(), maxy = getmaxy();

  const int menuXs=5, menuYs=30;

  const int Longmenus=95;

  const int widthmenus=30;

  const int spaces=10;

  int vixod_2=0;

  cleardevice();

  delay(100);

  while( !kbhit() )

  {

delay(dt);

if (x1 <= 0 || x2 >= maxx)  dirx = -dirx;

if (y1 <= 0 || y2 >= maxy)  diry = -diry;

setcolor(11);

setfillstyle (1, 9);

bar (x1,y1,x2,y2);

x1 += dirx *k;

x2 += dirx *k;

y1 += diry *k;

y2 += diry *k;

setcolor(5);

settextstyle(0,0,5);

outtextxy(20,200,"ABOUT THIS GAME");

setfillstyle (7, 5);

bar (x1,y1,x2,y2);

line (0, 0, maxx, 0);

line (0, 0, 0, maxy);

line (maxx, maxy, 0, maxy);

line (maxx, maxy, maxx, 0);

setcolor(1);

setfillstyle (1, 0);

settextstyle(0,0,1);

outtextxy(220,440,"To continue, press any key");

   }

   cleardevice();

   mouse(2);

   setbkcolor(7);

   setfillstyle(1,14);

   bar(menuXs,menuYs,menuXs+Longmenus-15,menuYs+widthmenus);

   settextstyle(0,0,1);

   setcolor(9);

   outtextxy(menuXs+4,menuYs+widthmenus/2-3,"Exit main");

   setfillstyle(7,8);

   bar(130,5,640,480);

   setfillstyle(7,9);

   bar(140,15,630,470);

   setfillstyle(1,1);

   bar(147,22,623,463);

   setfillstyle(1,11);

   bar(150,25,620,460);

   setcolor(1);

   settextstyle(0,0,2);

   outtextxy(170,70,"About the game and the rule ");

   i=0;

   FILE *file;

   char* file_name="data1.txt" ;

   char load_string[256] ;

   file = fopen(file_name,"r");

   if(file != 0)

   {

do

{

fgets(load_string,256,file);

load_string[sizeof(load_string)-1]=' ';

setcolor(8);

settextstyle(0,0,1);

outtextxy(150,60+i,load_string);

i=i+20;

}

while(!feof(file));

   }

   mouse(1);

   do

   {

mouse(1);

mov_mouse(3);

if((x>menuXs)&&(x<menuXs+Longmenus)&&(y>menuYs)&&(y< menuYs+widthmenus)) return;

   }

   while(vixod_2==0);

}

/****************************************************************************/

void find(int length_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];

}

for(i = 0; i<n; i++)

{

if(length[i]==length_new_nick)

for (j = 0; j < length[i]; j++)

if(nick[i][j]==new_nick[j]) count++;

}

if (count==length_new_nick)

{

cleardevice();

setbkcolor(7);

setcolor(4);

settextstyle(0,0,2);

outtextxy(160,50,"Please choose other nick.");

settextstyle(0,0,1);

outtextxy(180,70,"Please press enter.");

endcikl=1;

getch();

}

else endcikl=0;

}

/*--------------------------------------------------------------------------*/

void enter(int authoriz)

{

   do

   {

   //endcikl=0;

   mouse(2);

   Finish=0;

   u=0;

   probel=0;

   for(i=0; i< 10; i++) new_nick[i]=' ';

   cleardevice();

   setbkcolor (7);

   setfillstyle (1,14);

   n1 = widthKnob * quantilyKnobWi + (quantilyKnobWi-1) * spaceKnob;

   n2 = lengthKnob * quantilyKnobLe + (quantilyKnobLe-1) * spaceKnob;

   for (j = 0; j < n1; j+=spaceKnob + widthKnob)

for (i = 0; i < n2; i+=spaceKnob + lengthKnob)

   bar (xKnob + i, yKnob + j, xKnob + lengthKnob + i, yKnob + widthKnob + j);

   bar (xKnob, yKnob+spaceKnob*4+widthKnob*4, xKnob + lengthKnob, yKnob +spaceKnob*4+widthKnob*5);

   bar (xKnob+spaceKnob+lengthKnob, yKnob+spaceKnob*4+widthKnob*4, xKnob+spaceKnob+lengthKnob + lengthKnob, yKnob +spaceKnob*4+widthKnob*5);

   bar (xKnob, yKnob+spaceKnob*5+widthKnob*5, xKnob+lengthKnob*2+spaceKnob, yKnob +spaceKnob*5+widthKnob*6);

   bar (xKnob+2*spaceKnob+2*lengthKnob, yKnob+spaceKnob*5+widthKnob*5, xKnob+lengthKnob*3+2*spaceKnob, yKnob +spaceKnob*5+widthKnob*6);

   setfillstyle (1,15);

   bar (xWin, yWin,xWin+lengthWin,yWin+widthWin);

   setcolor(9);

   settextstyle(0,0,2);

   outtextxy(xKnob+lengthKnob/2-7,yKnob+widthKnob/2-5,"A");

   outtextxy(xKnob+lengthKnob/2+spaceKnob+lengthKnob-7,yKnob+widthKnob/2-5,"B");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*2+lengthKnob*2-7,yKnob+widthKnob/2-5,"C");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*3+lengthKnob*3-7,yKnob+widthKnob/2-5,"D");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*4+lengthKnob*4-7,yKnob+widthKnob/2-5,"E");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*5+lengthKnob*5-7,yKnob+widthKnob/2-5,"F");

   outtextxy(xKnob+lengthKnob/2-7,yKnob+spaceKnob+widthKnob+widthKnob/2-5,"G");

   outtextxy(xKnob+lengthKnob/2+spaceKnob+lengthKnob-7,yKnob+spaceKnob+widthKnob+widthKnob/2-5,"H");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*2+lengthKnob*2-7,yKnob+spaceKnob+widthKnob+widthKnob/2-5,"I");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*3+lengthKnob*3-7,yKnob+spaceKnob+widthKnob+widthKnob/2-5,"J");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*4+lengthKnob*4-7,yKnob+spaceKnob+widthKnob+widthKnob/2-5,"K");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*5+lengthKnob*5-7,yKnob+spaceKnob+widthKnob+widthKnob/2-5,"L");

   outtextxy(xKnob+lengthKnob/2-7,yKnob+spaceKnob*2+widthKnob*2+widthKnob/2-5,"M");

   outtextxy(xKnob+lengthKnob/2+spaceKnob+lengthKnob-7,yKnob+spaceKnob*2+widthKnob*2+widthKnob/2-5,"N");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*2+lengthKnob*2-7,yKnob+spaceKnob*2+widthKnob*2+widthKnob/2-5,"O");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*3+lengthKnob*3-7,yKnob+spaceKnob*2+widthKnob*2+widthKnob/2-5,"P");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*4+lengthKnob*4-7,yKnob+spaceKnob*2+widthKnob*2+widthKnob/2-5,"Q");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*5+lengthKnob*5-7,yKnob+spaceKnob*2+widthKnob*2+widthKnob/2-5,"R");

   outtextxy(xKnob+lengthKnob/2-7,yKnob+spaceKnob*3+widthKnob*3+widthKnob/2-5,"S");

   outtextxy(xKnob+lengthKnob/2+spaceKnob+lengthKnob-7,yKnob+spaceKnob*3+widthKnob*3+widthKnob/2-5,"T");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*2+lengthKnob*2-7,yKnob+spaceKnob*3+widthKnob*3+widthKnob/2-5,"U");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*3+lengthKnob*3-7,yKnob+spaceKnob*3+widthKnob*3+widthKnob/2-5,"V");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*4+lengthKnob*4-7,yKnob+spaceKnob*3+widthKnob*3+widthKnob/2-5,"W");

   outtextxy(xKnob+lengthKnob/2+spaceKnob*5+lengthKnob*5-7,yKnob+spaceKnob*3+widthKnob*3+widthKnob/2-5,"X");

   outtextxy(xKnob+lengthKnob/2-7,yKnob+spaceKnob*4+widthKnob*4+widthKnob/2-5,"Y");

   outtextxy(xKnob+lengthKnob/2+spaceKnob+lengthKnob-7,yKnob+spaceKnob*4+widthKnob*4+widthKnob/2-5,"Z");

   outtextxy(xKnob+2*spaceKnob+2*lengthKnob+lengthKnob/2-28,yKnob+spaceKnob*5+widthKnob*5+widthKnob/2-5,"Back");

   outtextxy(xKnob+lengthKnob/2-7,yKnob+spaceKnob*5+widthKnob*5+widthKnob/2-5,"Finish");

   mouse(1);

   resize();

   u=0;

   do

   {

   place = 0;

   delay(250);

   mouse(1);

   mov_mouse(3);

   for (j = 1; j <= quantilyKnobLe ; j++)

     if((x < (xKnob+lengthKnob*j+spaceKnob*(j-1)))&&(x > (xKnob+lengthKnob*(j-1)+spaceKnob*(j-1)))) break;

    for (i = 1; i <= quantilyKnobWi+i; i++)

     if((y > (yKnob+widthKnob*(i-1)+spaceKnob*(i-1)))&&(y < (yKnob+widthKnob*i+spaceKnob*(i-1)))) break;

   if(((x > xKnob)&&(x<xKnob+lengthKnob*2+spaceKnob))&&((y>yKnob+spaceKnob*5+widthKnob*5)&&(y<yKnob +spaceKnob*5+widthKnob*6)))

   {

Finish=1;

   }

   if(((x>xKnob+2*spaceKnob+2*lengthKnob)&&(x<xKnob+lengthKnob*3+2*spaceKnob))&&((y>yKnob+spaceKnob*5+widthKnob*5)&&(y<yKnob +spaceKnob*5+widthKnob*6))&&(u!=0))

   {

setcolor(15);

u--;

if(authoriz==0) ASCII = int(old_nick[u]);

else ASCII = int(new_nick[u]);

back_buf[0] = char(ASCII);

new_nick[u]=' ';

probel-=16;

outtextxy(xWin+5+probel,yWin+3,back_buf);

setcolor(9);

   }

   if(u<10)

   {

   switch(i)

   {

case 1:

{

switch(j)

{

case 1:

{

outtextxy(xWin+5+probel,yWin+3,"A");

if(authoriz==0) old_nick[u]='A';

else new_nick[u]='A';

u++;

place = 1;

};break;

case 2:

{

outtextxy(xWin+5+probel,yWin+3,"B");

if(authoriz==0) old_nick[u]='B';

else new_nick[u]='B';

u++;

place = 1;

};break;

case 3:

{

outtextxy(xWin+5+probel,yWin+3,"C");

if(authoriz==0) old_nick[u]='C';

else new_nick[u]='C';

u++;

place = 1;

};break;

case 4:

{

outtextxy(xWin+5+probel,yWin+3,"D");

if(authoriz==0) old_nick[u]='D';

else new_nick[u]='D';

u++;

place = 1;

};break;

case 5:

{

outtextxy(xWin+5+probel,yWin+3,"E");

if(authoriz==0) old_nick[u]='E';

else new_nick[u]='E';

u++;

place = 1;

};break;

case 6:

{

outtextxy(xWin+5+probel,yWin+3,"F");

if(authoriz==0) old_nick[u]='F';

else new_nick[u]='F';

u++;

place = 1;

};break;

}

};break;

case 2:

{

switch(j)

{

case 1:

{

outtextxy(xWin+5+probel,yWin+3,"G");

if(authoriz==0) old_nick[u]='G';

else new_nick[u]='G';

u++;

place = 1;

};break;

case 2:

{

outtextxy(xWin+5+probel,yWin+3,"H");

if(authoriz==0) old_nick[u]='H';

else new_nick[u]='H';

u++;

place = 1;

};break;

case 3:

{

outtextxy(xWin+5+probel,yWin+3,"I");

if(authoriz==0) old_nick[u]='I';

else new_nick[u]='I';

u++;

place = 1;

};break;

case 4:

{

outtextxy(xWin+5+probel,yWin+3,"J");

if(authoriz==0) old_nick[u]='J';

else new_nick[u]='J';

u++;

place = 1;

};break;

case 5:

{

outtextxy(xWin+5+probel,yWin+3,"K");

if(authoriz==0) old_nick[u]='K';

else new_nick[u]='K';

u++;

place = 1;

};break;

case 6:

{

outtextxy(xWin+5+probel,yWin+3,"L");

if(authoriz==0) old_nick[u]='L';

else new_nick[u]='L';

u++;

place = 1;

};break;

}

};break;

case 3:

{    switch(j)

{

case 1:

{

outtextxy(xWin+5+probel,yWin+3,"M");

if(authoriz==0) old_nick[u]='M';

else new_nick[u]='M';

u++;

place = 1;

};break;

case 2:

{

outtextxy(xWin+5+probel,yWin+3,"N");

if(authoriz==0) old_nick[u]='N';

else new_nick[u]='N';

u++;

place = 1;

};break;

case 3:

{

outtextxy(xWin+5+probel,yWin+3,"O");

if(authoriz==0) old_nick[u]='O';

else new_nick[u]='O';

u++;

place = 1;

};break;

case 4:

{

outtextxy(xWin+5+probel,yWin+3,"P");

if(authoriz==0) old_nick[u]='P';

else new_nick[u]='P';

u++;

place = 1;

};break;

case 5:

{

outtextxy(xWin+5+probel,yWin+3,"Q");

if(authoriz==0) old_nick[u]='Q';

else new_nick[u]='Q';

u++;

place = 1;

};break;

case 6:

{

outtextxy(xWin+5+probel,yWin+3,"R");

if(authoriz==0) old_nick[u]='R';

else new_nick[u]='R';

u++;

place = 1;

};break;

}

};break;

case 4:

{    switch(j)

{

case 1:

{

outtextxy(xWin+5+probel,yWin+3,"S");

if(authoriz==0) old_nick[u]='S';

else new_nick[u]='S';

u++;

place = 1;

};break;

case 2:

{

outtextxy(xWin+5+probel,yWin+3,"T");

if(authoriz==0) old_nick[u]='T';

else new_nick[u]='T';

u++;

place = 1;

};break;

case 3:

{

outtextxy(xWin+5+probel,yWin+3,"U");

if(authoriz==0) old_nick[u]='U';

else new_nick[u]='U';

u++;

place = 1;

};break;

case 4:

{

outtextxy(xWin+5+probel,yWin+3,"V");

if(authoriz==0) old_nick[u]='V';

else new_nick[u]='V';

u++;

place = 1;

};break;

case 5:

{

outtextxy(xWin+5+probel,yWin+3,"W");

if(authoriz==0) old_nick[u]='W';

else new_nick[u]='W';

u++;

place = 1;

};break;

case 6:

{

outtextxy(xWin+5+probel,yWin+3,"X");

if(authoriz==0) old_nick[u]='X';

else new_nick[u]='X';

u++;

place = 1;

};break;

}

};break;

case 5:

{   switch(j)

{

case 1:

{

outtextxy(xWin+5+probel,yWin+3,"Y");

if(authoriz==0) old_nick[u]='Y';

else new_nick[u]='Y';

u++;

place = 1;

};break;

case 2:

{

outtextxy(xWin+5+probel,yWin+3,"Z");

if(authoriz==0) old_nick[u]='Z';

else new_nick[u]='Z';

u++;

place = 1;

};break;

}

};break;

   }

   if(place == 1) probel+=16;

   }

   }

   while(Finish==0);

   if(authoriz==1)length_new_nick = u;

   else length_old_nick=u;

   if(authoriz==1)

   find(u);

   cleardevice();

   }

   while(endcikl==1);

}

/*--------------------------------------------------------------------------*/

void registration()

{

  cleardevice();

  setbkcolor(7);

  settextstyle(0,0,3);

  setcolor(1);

  outtextxy(160,10,"Authoriezation");

  setfillstyle(1,14);

  n = WidthMenuAu * number + (number-1) * SpaceMenuAu;

  for ( i = 0; i < n; i+=SpaceMenuAu+WidthMenuAu)

{

mouse(2);

bar(MenuXau,MenuYau+i,MenuXau+LongMenuAu, MenuYau + WidthMenuAu +i);

mouse(1);

}

  settextstyle(0,0,2);

  setcolor(9);

  outtextxy(MenuXau+12,MenuYau+WidthMenuAu/2-5,"Enter your nick");

  outtextxy(MenuXau+20,MenuYau+WidthMenuAu/2-5+WidthMenuAu+SpaceMenuAu,"Enter new nick");

  resize();

  mouse(1);

  mov_mouse(3);

  sound(100);

  delay(3);

  sound(50);

  nosound();

  for (i = 1; i <= number+i; i++)

     if((y > (MenuYau+WidthMenuAu*(i-1)+SpaceMenuAu*(i-1)))&&(y < (MenuYau+WidthMenuAu*i+SpaceMenuAu*(i-1)))) break;

  if((i==1)&&(x>MenuXau)&&(x<MenuXau+LongMenuAu)) {enter(0); type_of_nick=0;}

  if((i==2)&&(x>MenuXau)&&(x<MenuXau+LongMenuAu)) {enter(1); type_of_nick=1;}

}

/****************************************************************************/

void menu()

{

  cleardevice();

  setbkcolor(7);

  setfillstyle(1,14);

  n = WidthMenum * CountMenum + (CountMenum-1) * SpaceMenum;

  for ( i = 0; i < n; i+=SpaceMenum+WidthMenum)

  bar(MenuXm,MenuYm+i,MenuXm+LongMenum, MenuYm + WidthMenum +i);

  setcolor(9);

  settextstyle (0,0,2);

  outtextxy(256,75,"Begin");

  outtextxy(256,75+(WidthMenum+SpaceMenum),"Record");

  outtextxy(256,75+(WidthMenum+SpaceMenum)*2,"About");

  outtextxy(256,75+(WidthMenum+SpaceMenum)*3,"Exit");

}

/****************************************************************************/

void privet()

{

cleardevice();

setbkcolor(14);

for(int i=0;i<11;i++)

{

  setbkcolor(i);

  sound(i+50);

  delay(50);

  sound(i*5);

  delay(10);

  sound(i*30);

  delay(20);

  settextstyle(i-1,0,6);

  setcolor(i+2);

  outtextxy(70,240,"Tic-tac-toe");

  if (i==10)

  {

  cleardevice();

  setbkcolor(9);

  setcolor(13);

  settextstyle(0,0,3);

  outtextxy(100,180,"Welcome to the game");

  settextstyle(0,0,1);

  outtextxy(230,450,"Please,press any key");

  delay(100);

  }

  cleardevice;

  delay(400);

} nosound();

/* settextstyle(0,0,3);

setbkcolor(9);

setcolor(13);

outtextxy(100,180,"Welcome to the game");

settextstyle(0,0,6);

outtextxy(70,240,"Tic-tac-toe");

settextstyle(0,0,1);

outtextxy(230,450,"Please,press any key"); */

for(i=100;i<1500;i*=4)

{

sound(i);

delay(100);

i*=30;

sound(i);

delay(100);

i/=25;

sound(i);

delay(100);

sound(300);

delay(45);

sound(500);

delay(100);

sound(100);

delay(50);

sound(1500);

delay(40);

sound(350);

delay(80);

}

sound(800);

delay(100);

for(i=30;i<2000;i*=10)

 {

  sound(i);

  delay(100);

  i+=30;

  sound(i);

  delay(100);

  i/=13;

  sound(i);

  delay(10);

  i-=13;

  sound(i);

  delay(10);

  i+=100;

  sound(i);

  delay(50);

  i*=6;

  sound(i);

  delay(100);

  sound(1000);

  delay(50);

  sound(500);

  delay(10);

 }

 sound(440);

 delay(50);

 sound(200);

 delay(40);

 sound(1500);

 delay(30);

 sound(10);

 sound(5);

 nosound();

getch();

}

};

/****************************************************************************/

void main()

{

common tic;

pair ob;

tic.inilization_graph();

cleardevice();

setbkcolor(15);

setcolor(8);

settextstyle(0,0,3);

outtextxy(ob.X,ob.Y,"NATIONAL RESEARCH TOMSK");

++ob;

settextstyle(0,0,3);

outtextxy(ob.X,ob.Y,"POLYTECHNIC UNIVERSITY");

settextstyle(0,0,2);

ob++;

outtextxy(ob.X+50,ob.Y,"Institute of Cybernetics");

settextstyle(0,0,1);

ob++;

outtextxy(ob.X+58,ob.Y,"Departament of Information Retrieval System");

settextstyle(0,0,6);

ob++;

outtextxy(ob.X-15,ob.Y+60,"TIC-TAC-TOE");

settextstyle(0,0,1);

ob++;

outtextxy(ob.X+220,ob.Y+150,"Made by student of 8V01:Chshukova C.B.");

settextstyle(0,0,1);

ob++;

outtextxy(ob.X+210,ob.Y+140,"Check by assistant:Pogrebnai T.K.");

settextstyle(0,0,2);

ob++;

outtextxy(ob.X+130,ob.Y+230,"Tomsk, 2011");

delay(10000);

int vixod=0;

tic.privet();

tic.registration();

tic.mouse(1);

do

{

  tic.mouse(2);

  cleardevice();

  tic.menu();

  tic. resize();

  tic.mouse(1);

  delay(200);

  tic.mov_mouse(3);

  for ( int j = 1; j <= tic.CountMenum ; j++)

  if( ( tic.y > (tic.MenuYm+tic.WidthMenum*(j-1)+tic.SpaceMenum*(j-1)))&&(tic.y < (tic.MenuYm+tic.WidthMenum*j+tic.SpaceMenum*(j-1))) &&(tic.x > tic.MenuXm)&&(tic.x < (tic.MenuXm+tic.LongMenum)) ) break;

if (j<4)

{

   if (j< 2)

   {

tic.mouse(2);

tic.chose_fl();

if(tic.just==0)tic.game();

}

   else

     if(j>2) tic.spravka();

     else tic.record();

}

else

{

   if(j==4) {return;vixod=1;}

}

}while(vixod==0);

closegraph();

}