Создание компьютерной игры "Крестики и нолики"

Общая характеристика языков программирования. Краткий обзор C, C++, Java, PHP, Python, Delphi и Visual Basic. Процесс разработки программы игра "Крестики и нолики" с помощью AppWizard. Компиляция и компоновка модулей, определение интерфейса приложения.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 27.05.2014
Размер файла 2,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Содержание

Введение

1. Языки программирования

1.1 Распространенные языки программирования

1.1.1 Краткий обзор C

1.1.2 Краткий обзор C++

1.1.3 Краткий обзор Java

1.1.4 Краткий обзор PHP

1.1.5 Краткий обзор Python

1.1.6 Краткий обзор Delphi

1.1.7 Краткий обзор Visual Basic

2. Используемые методы

2.1 Среда разработки Microsoft Visual C++ 6.0

2.1.1 Мастер приложений MFC AppWizard

2.1.2 Мастер классов MFC ClassWizard

2.1.3 Меню, панель управления и панель состояния

3. Код программы

3.1 Команды игрока

3.1.1 Класс C KrestikiAndNolikiView

3.1.1.1 Функция CKrestikiAndNolikiView

3.1.1.2 Функция OnDraw

3.1.1.3 Функция OnLButtonDown

3.1.1.4 Функции DrawX и Draw0

3.1.2 Класс CKrestikiAndNolikiDoc

3.1.2.1 Функция OnNewDocument

3.1.2.2 Функция AddX

3.1.2.3 Функция Add0

3.1.2.4 Функция GetSquare

Введение

язык программирование игра интерфейс

С развитием цифровых технологий компьютеры все больше вливаются в жизнь человека. Если раньше ЭВМ использовались исключительно для сложных математических вычислений, то сегодня сфера их применения существенно расширилась. Компьютерные игры - одно из наиболее массовых применений электронных вычислительных машин.

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

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

1. Языки программирования

1.1 Распространенные языки программирования

За последние 20 лет появились сотни языков программирования разных видов, которые сменяли друг друга на определённых этапах развития технологий. По мере того, как развивался Интернет, началась популяризация языков программирования, которые ориентируются на создание сайтов и веб-приложений. Популярность того или иного языка тяжело спрогнозировать даже на ближайшие 5-10 лет. Десятки языков, которые считались ведущими в конце 1990-ых, сейчас полностью пропали или же кардинально изменились, вплоть до названия. Сегодня же есть около 10 языков, которые прочно занимают свои позиции в программерской среде и без них невозможно представить дальнейшее развитие компьютеров и Интернета: Java, PHP, C/C++, Python, Delphi, Visual Basic.

1.1.1 Краткий обзор С

Язык C (Си), созданный Денисом Ритчи в начале 70-х годов в Bell Laboratory американской корпорации AT&T, является одним из универсальных языков программирования. Язык Си считается языком системного программирования, хотя он удобен и для написания прикладных программ. Среди преимуществ языка Си следует отметить переносимость программ на компьютеры различной архитектуры и из одной операционной системы в другую, лаконичность записи алгоритмов, логическую стройность программ, а также возможность получить программный код, сравнимый по скорости выполнения с программами, написанными на языке ассемблера. Последнее связано с тем, что хотя Си является языком высокого уровня, имеющим полный набор конструкций структурного программирования, он также обладает набором низкоуровневых средств, обеспечивающих доступ к аппаратным средствам компьютера.

Си является орудием системного программиста и позволяет глубоко влезать в самые тонкие механизмы обработки информации на ЭВМ. Хотя язык требует от программиста высокой дисциплины, он не строг в формальных претензиях и допускает краткие формулировки.

Си - современный язык. Он включает в себя те управляющие конструкции, которые рекомендованы теорией и практикой программирования. Его структура побуждает программиста использовать в своей работе нисходящее проектирование, структурное программирование и пошаговую разработку модулей.

Также это мощный и гибкий язык. Большая часть операционной системы Unix, компиляторы и интерпретаторы языков Fortran, Pascal, LISP и Basic написаны именно с его помощью.

Си является удобным языком. Он достаточно структурирован, чтобы поддерживать хороший стиль программирования и вместе с тем не связан жесткими ограничениями. Язык располагает управляющими инструкциями, позволяющими создавать хорошо структурированные программы: составная инструкция или блок ({…}), ветвление по условию (if - else), выбор одного из многих вариантов (switch), циклы с предусловием (while, for), циклы с постусловием (do), прерывание и продолжение цикла (break,continue). В некотором смысле язык С - самый универсальный, т.к. кроме набора средств, присущих современным языкам программирования высокого уровня (структурность, модульность, определенные типы данных), в него включены средства для программирования практически на уровне ассемблера. Большой набор операторов и средств требуют от программиста осторожности, аккуратности и хорошего знания языка со всеми иго преимуществами и недостатками.

1.1.2 Краткий обзор С++

С++ - это универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей С++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, С++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. Такие объекты просты и надежны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы.

Ключевым понятием С++ является класс. Класс - это тип, определяемый пользователем. Классы обеспечивают сокрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. С++ предоставляет гораздо лучшие, чем в C, средства выражения модульности программы и проверки типов. В языке есть также усовершенствования, не связанные непосредственно с классами, включающие в себя символические константы, inline-подстановку функций, параметры функции по умолчанию, перегруженные имена функций, операции управления свободной памятью и ссылочный тип. В С++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем.

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

Являясь одним из самых популярных языков программирования, язык С++ широко используется для разработки программного обеспечения. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (например, видеоигры).

1.1.3 Краткий обзор Java

Java - это объектно-ориентированный язык программирования, основанный на классах. Класс Java - это тип данных, состоящий из некоего набора данных и методов, т. е. функций, манипулирующих этими данными. В процессе работы программы создаются объекты, т. е. переменные, которые являются экземплярами реализации данного класса. Новые классы описываются как наследники существующих классов и тем самым образуют иерархию. Взаимосвязанные наборы классов Java объединяются в пакеты, которые являются самостоятельно компилируемыми единицами.

Одно из главных преимуществ языка Java - его независимость от платформы, на которой выполняются программы. Таким образом, один и тот же код можно запускать под управлением операционных систем Windows, Linux, FreeBSD, Solaris, Apple Mac и др. Это становится очень важным, когда программы загружаются посредством глобальной сети интернет и используются на различных платформах.

Другое преимущество заключается в том, что синтаксис языка Java похож на синтаксис языка C++, и программистам, знающим языки С и C++, его изучение не составляет труда. Однако разработать еще один, слегка улучшенный, диалект языка C++ недостаточно. Принципиально важно, что разрабатывать программы, не содержащие ошибок, на языке Java легче, чем на языке C++, так как разработчики снабдили язык Java средствами, позволяющими исключить саму возможность создавать программы, в которых были бы скрыты наиболее распространенные ошибки. Для этого в языке Java сделано следующее:

- Исключена возможность явного выделения и освобождения памяти. Память в языке Java освобождается автоматически с помощью механизма сборки мусора. Программист гарантирован от ошибок, связанных с неправильным использованием памяти.

- Введены истинные массивы и запрещена арифметика указателей. Теперь программисты в принципе не могут стереть данные из памяти вследствие неправильного использования указателей.

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

1.1.4 Краткий обзор PHP

Как известно, серьезные веб-приложения используют код, который выполняется на сервере. Существует множество языков программирования, которые могут выполнять эту работу. Одним из самых популярных языков программирования для создания веб-приложений является PHP. Код, написанный на этом языке, может легко встраиваться в HTML-документы. Но при этом программы, написанные на PHP, выполняются именно на сервере.

В общем случае порядок выполнения PHP-программ следующий. Сначала браузер конечного пользователя посылает запрос на получение веб-страницы. Если в состав этой веб-страницы входит код PHP, сервер должен выполнить некоторые действия перед ее отправкой пользователю. Сначала документ передается системе выполнения языка PHP, которую называют движком. Эта система обрабатывает полученный код, выполняет ту функциональность, которая в нем заложена и формирует конечный документ на чистом языке HTML. Этот документ возвращается серверу, который затем передает его пользователю, который отсылал стартовый запрос.

Популярность PHP обусловлена не только простотой и мощью языка, но и тем, что он может взаимодействовать со всеми наиболее популярными веб-серверами.

Функциональные возможности PHP определяются его функциями. Несмотря на то, что PHP не является языком со строгой типизацией, в него введены все необходимые функции для конвертации значений из одного типа в другой. Разработчик может пользоваться как встроенными функциями, так и прописывать свои.

В качестве функций языка PHP можно отметить следующие:

- функции управляющей логики (условные операторы, циклы);

- функции работы с массивами;

- встроенные математические функции (sin, cos, exp, tan);

- функции подключаемых модулей при помощи ключевого слова include: например, модуль отправки электронной почты;

- пользовательские функции, т.е. функции, задаваемые при помощи ключевого слова "function";

- встроенные функции для работы с базами данных MySQL;

- встроенные функции для обращения к XML-документам;

- графические функции языка.

1.1.5 Краткий обзор Python

Python - интерпретируемый, объектно-ориентированный высокоуровневый язык программирования с динамической семантикой. Встроенные высокоуровневые структуры данных в сочетании с динамическими типизацией и связыванием делают язык привлекательным для быстрой разработки приложений (RAD, Rapid Application Development). Кроме того, его можно использовать в качестве сценарного языка для связи программных компонентов. Синтаксис Python прост в изучении, в нем придается особое значение читаемости кода, а это сокращает затраты на сопровождение программных продуктов. Python поддерживает модули и пакеты, поощряя модульность и повторное использование кода. Интерпретатор Python и большая стандартная библиотека доступны бесплатно в виде исходных и исполняемых кодов для всех основных платформ и могут свободно распространяться.

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

Следующая немаловажная черта - расширяемость языка. Это означает, что имеется возможность совершенствования языка всеми заинтересованными программистами. Интерпретатор написан на С и исходный код доступен для любых манипуляций. В случае необходимости, можно вставить его в свою программу и использовать как встроенную оболочку. Или же, написав на C свои дополнения к Python и скомпилировав программу, получить "расширенный" интерпретатор с новыми возможностями.

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

- Numerical Python - расширенные математические возможности, такие как манипуляции с целыми векторами и матрицами;

- Tkinter - построение приложений с использованием графического пользовательского интерфейса (GUI) на основе широко распространенного на X-Windows Tk-интерфейса;

- OpenGL - использование обширной библиотеки графического моделирования двух- и трехмерных объектов Open Graphics Library фирмы Silicon Graphics Inc. Данный стандарт поддерживается, в том числе, в таких распространенных операционных системах как Microsoft Windows 95 OSR 2, 98 и Windows NT 4.0.

1.1.6 Краткий обзор Delphi

Delphi - язык программирования, который используется в одноимённой среде разработки и является комбинацией нескольких важнейших технологий:

- высокопроизводительный компилятор в машинный код;

- объектно-ориентированная модель компонент;

- визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов;

- масштабируемые средства для построения баз данных.

Сначала язык назывался Object Pascal. Начиная со среды разработки Delphi 7.0, в официальных документах Borland стала использовать название Delphi для обозначения языка Object Pascal.

Основу Delphi составляет не только сам язык, но и RAD (Rapid Application Development) - среда быстрой разработки программ. Благодаря визуальному программированию, а также достаточно большой библиотеке визуальных компонентов, Delphi позволяет создавать программы наиболее быстро и эффективно, принимая на себя основную работу, и оставляя программисту творческий процесс.

Delphi предлагает довольно мощный набор компонентов для работы с базами данных. Причем иерархия компонентов для работы с базой данных организована таким образом, что практически неважно, какой именно базой данных пользуется приложение - это может быть и локальная база данных, и промышленный сервер, типа Orace или MS SQL Server. Существенным преимуществом Delphi в этой области является возможность управления базами данных на логическом уровне, соответствующем понятиям самих баз данных, без использования низкоуровневых запросов к драйверам. Такие возможности Delphi обусловили ее широкую применяемость при разработке АСУП - автоматизированных систем управления предприятиями. Однако это не единственная область применения, так как возможности Delphi не ограничиваются вышеперечисленными. Delphi является языком программирования широкого назначения и позволяет разработать программный продукт любой сложности для любой области. Даже если какие-либо возможности и не поддерживаются напрямую, то этот недостаток может быть исправлен добавлением соответствующих компонентов в систему (такой подход касается, например, технологии DirectX, не поддерживаемой Delphi в ее исходной комплектации, но существуют компоненты для использования DirectX, которые легко интегрируются в среду разработки).

1.1.7 Краткий обзор Visual Basic

Visual Basic - является языком программирования третьего поколения (событийный язык программирования) и среда разработки от Microsoft для модели программирования COM. Этот язык был получен из BASIC и допускает быструю прикладную разработку (RAD) графического интерфейса пользователя (GUI), доступ к базам данных при помощи DAO, RDO, ADO, создание элементов управления ActiveX и объектов.

Язык Visual Basic унаследовал дух, стиль и отчасти синтаксис своего предка - языка BASIC, у которого есть немало диалектов. В то же время Visual Basic - современный язык программирования, сочетающий процедуры и элементы объектно-ориентированных и компонетно-ориентированных языков программирования. Среда разработки Visual Basic включает инструменты для визуального конструирования пользовательского интерфейса. Программист может создавать приложение, используя компоненты, предоставленные в Visual Basic.

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

Формы создаются при помощи технологии "перетащи и брось" (drag and drop). Элементы управления просто размещаются на форме (например, поля ввода, кнопки, и т.д.). Элементы управления имеют свои атрибуты и обработчики событий. Многие атрибуты могут быть изменены во время исполнения программы, что позволяет создавать программы, динамически реагирующие на действия пользователя.

Visual Basic может создать исполняемые программы (EXE файлы), элементы управления ActiveX, библиотеки DLL, но, прежде всего, используется для разработки Windows приложений. Диалоговые окна с ограниченными функциональными возможностями могут использоваться для обеспечения подсказок. Элементы управления обеспечивают основные функциональные возможности приложения, а программист может расширить логику программы при помощи обработчиков событий. Обработчик событий вызывается для исполнения дополнительного кода в зависимости от выбранного элемента.

Рассматривая все представленные выше языки программирования, я остановился на языке С++. Поводом для этого послужили следующие причины:

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

- В С++ поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, объектно-ориентированное программирование, обобщенное программирование, метапрограммировнаие (шаблоны, макросы).

- Главным преимуществом этого языка, по моему мнению, является сочетание в нем возможности работы на низком и высоком уровнях. Таким образом, код, создаваемый программистом, может быть максимально адаптирован к системным возможностям той платформы, на которой он будет работать. А именно это свойство дает неоспоримое преимущество в оптимальном использовании ресурсов вычислительной системы (компьютера или другого устройства, например, мобильного телефона или игровой приставки).

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

- Основные сферы использования C++ сегодня - это: программирование игр (так называемый gamedev), работа с компьютерной графикой, решение задач с высокими требованиями к производительности и, конечно же, системное программирование (разработка ядра операционной системы, драйверов устройств, сетевые решения и т.д.).

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

2. Используемые методы

2.1 Среда разработки Microsoft Visual C++ 6.0

Microsoft Visual C++ 6.0 - это интегрированная среда разработки программ, объединяющая текстовый редактор, компилятор, компоновщик и отладчик. Visual C++ выполняет компиляцию и запуск программ в соответствии с проектом.

Проект - это структура данных, содержащая всю информацию, необходимую для компиляции исходных файлов программы и ее компоновки со стандартными библиотеками (например, библиотекой ввода/вывода).

Компиляция и компоновка исходных файлов называется сборкой проекта. В результате успешной сборки Visual C++ создает приложение (двоичный исполняемый файл программы).

2.1.1 Мастер приложений MFC AppWizard

Процесс разработки Windows-программы в Visual C++ начинается с создания нового проекта и подготовки исходных файлов. Всю работу берет на себя мастер AppWizard.

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

Подготовка нового проекта выполняется следующим образом. Выберем команду верхнего меню File>New. Далее перейдем на закладку Projects и выберем проект типа MFC AppWizard(exe) (рис. 1). В строке Location укажем место для сохранения программы и ее исходного кода (например, "D:\"), а в строке Project Name введем "KrestikiAndNoliki". По умолчанию Visual C++ сделает новую папку проекта D:\Games. В ней будут сохраняться все файлы, относящиеся к данному проекту.

Нажимаем ОК. Теперь нужно указать мастеру, должно ли приложение поддерживать работу с одним документом, с несколькими документами или же это будет диалоговое окно. Выбираем Single Document (рис. 2), чтобы сообщить мастеру AppWizard о нашем намерении создать программу в соответствии со спецификацией SDI (интерфейс для обработки одного документа). Особенность SDI-программ заключается в том, что при их работе допускается одновременное открытие лишь одного документа. Нажимаем Next.

Рисунок 1 - Закладка Projects в окне создания нового файла.

Рисунок 2 - Шаг 1 создания MFC проекта.

Установки во втором окне мастера делаются только в том случае, если в приложении будет осуществляться работа с базами данных. В нашем примере следует оставить опцию None. Нажимаем Next (рис. 3).

Рисунок 3 - Шаг 2 создания MFC проекта.

В диалоговом окне Step 3 на вопрос "What compound document support would you like to include?" (Какой тип обслуживания предполагается использовать) указываем вариант ответа None (рис. 4).

Рисунок 4 - Шаг 3 создания MFC проекта.

Четвертое окно мастера позволяет добавлять в программу различные средства, определяющие интерфейс приложения (например, панель инструментов или строку состояния).

Помечаем значком выбора3Dcontrols. Нажимаем Next (рис. 5).

Рисунок 5 - Шаг 4 создания MFC проекта.

В диалоговом окне Step 5 в ответ на запрос, вставлять ли комментарии в исходный файл, выбираем Yes, please. Наживаем Next (рис. 6).

Рисунок 6 - Шаг 5 создания MFC проекта.

Диалоговое окно Step 6 мастера AppWizard отображается список классов, которые будут сгенерированы для нашего приложения, а именно CKrestikiAndNolikiApp, CMainFrame, CKrestikiAndNolikiDoc и CKrestikiAndNolikiView (рис. 7).

Рисунок 7 - Шаг 6 создания MFC проекта.

После щелчка на кнопке Finish будет выведено окно с итоговым отчетом, подготовленным мастером AppWizard (рис. 8).

Рисунок 8 - Отчет, выдаваемый мастером AppWizard после установки всех опций.

По завершении работы AppWizard можно переходить к сборке (компиляции и компоновке) сформированных программных модулей. Перейдем в меню Build>Build Games.exe. Затем после выполнения команды можно запускать программу на исполнение, выбрав Build>Execute Games.exe. На экране появится рабочее окно программы.

Данное окно называется Frame Window - термин MFC для обозначения окон самого верхнего уровня, служащих контейнерами для размещения панелей инструментов, строк состояния и прочих объектов.

2.1.2 Мастер классов MFC ClassWizard

Средство ClassWizard предоставляет широкий спектр услуг.

При помощи ClassWizard можно добавить новый класс, созданный на основе базовых классов. В качестве базового класса можно использовать классы, наследованные от класса CCmdTarget или класса CRecordset. Для наследования классов от других базовых классов использовать средства ClassWizard нельзя. Такие классы надо создавать вручную, непосредственно в текстовом редакторе.

Очень удобно использовать ClassWizard для включения в состав класса новых методов. Можно добавлять к классу методы, служащие для обработки сообщений Windows и команд от объектов, а также методы, переопределяющие виртуальные методы базовых классов. Мастер ClassWizard не только позволяет добавить в класс новые методы, но и удалить их. ClassWizard самостоятельно удалит объявление метода из класса.

ClassWizard позволяет включать в класс не только новые методы, но и элементы данных, связанные с полями диалоговых панелей, форм просмотра и форм для просмотра записей баз данных и полей наборов записей. ClassWizard использует специальные процедуры, чтобы привязать созданные им элементы данных и класса к полям диалоговых панелей. Эти процедуры носят названия "обмен данными диалоговой панели" и "проверка данных диалоговой панели" (Dialog Data Exchange and Dialog Data Validation - DDX/DDV). Чтобы привязать поля из наборов записей к переменным, используется процедура обмена данными с полями записей (Record Field Exchange - RFX). Процедуры DDX/DDV и RFX значительно упрощают программисту работу с диалоговыми панелями. Они позволяют связать поля диалоговых панелей и переменные. Когда пользователь редактирует поля диалоговых панелей, процедуры DDV проверяют введенные значения и блокируют ввод запрещенных значений. Затем процедуры DDX автоматически копируют содержимое полей диалоговых панелей в привязанные к ним элементы данных класса. И наоборот, когда приложение изменяет элементы данных класса, привязанные к полям диалоговой панели, процедуры DDX могут сразу отобразить новые значения полей на экране компьютера. Воспользуемся мастером ClassWizard для отслеживания щелчка мыши. Он подготовит для класса View нашей программы функцию, которая будет обрабатывать сообщения WM_LBUTTONDOWN, получаемое при нажатии левой клавиши мыши.

Для того чтобы вызвать ClassWizard, зайдем в меню View>ClassWizard. Перейдем на закладку Message Maps. В окне Class Name выберем C KrestikiAndNolikiView. В окне Object IDs выберем C KrestikiAndNolikiView. В списке Messages теперь отображается перечень сообщений, связанных с этим классом. Выберем в окне Messages сообщение WM_LBUTTONDOWN. Щелкнем на кнопке Add Function (рис. 9).

При нажатии кнопки Add Function мастер ClassWizard добавляет в состав класса View программы Games принадлежащую функцию с именем OnLButtonDown. Кроме того, он создает в этом View-модуле программный блок для подготовки карты сообщений - особой таблицы, в которой устанавливается соответствия между сообщениями и их обработчиками. С ее помощью будет обеспечиваться вызов функции OnLButtonDown при приеме View-модулем сообщения WM_LBUTTONDOWN.

Теперь нажимаем Edit Code. При нажатии на эту кнопку мы переходим в режим редактирования исходного текста функции CKrestikiAndNolikiView:OnLButtonDown. Здесь мы можем редактировать код функции в зависимости от того, какие действия она должна выполнять.

Рисунок 9 - Окно мастера классов MFC ClassWizard.

2.1.3 Меню, панель управления и панель состояния

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

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

Меню и панели управления служат для передачи команд приложению. Напротив, панель состояния отражает текущее состояние приложения и может давать пользователю краткие подсказки, состоящие буквально из нескольких строк.

Самый простой и удобный способ создания меню приложения основан на использовании специального ресурса - шаблона меню. Так как мы использовали для создания приложения средства MFC AppWizard, и создали однооконное приложение, то оно по умолчанию имеет один ресурс меню.

Для создания и изменения меню приложения следует использовать редактор ресурсов Microsoft Visual C++. С его помощью разрабатывается меню буквально за несколько минут.

Чтобы добавить новую строку к меню, достаточно выполнить двойной щелчок левой кнопкой мыши по одному из пустых прямоугольников из точек, которые располагаются в конце главного меню и в низу каждого из меню (создается новая строка меню). При этом на экране появится диалоговая панель Menu Item Properties, которую нужно заполнить. Чтобы удалить меню или строку, нужно выделить и нажать кнопку Delete.

Рисунок 10 - Редактор меню и диалоговая панель Menu Item Properties.

3. Код программы

Игра крестики и нолики состоит из команд которые делает игрок и основного кода который отвечает на эти команды.

3.1 Команды игрока

Структура KrestikiAndNoliki строится из пяти классов, каждый из которых создан на основе своего базового класса, взятого из MFC. (рис. 11). "Мастер" AppWizard подготовил для нас следующие классы:

· C KrestikiAndNoliki App относится к работе самой программы;

· C KrestikiAndNoliki Doc занимается обработкой рабочих документов;

· C KrestikiAndNoliki View осуществляет отображение документов в рабочем окне;

· CMainFrame обслуживает работу базового окна программы;

· CAboutDlg обеспечивает работу диалогового окна About (О программе).

Рисунок 11 - Структура KrestikiAndNoliki .

3.1.1 Класс CKrestikiAndNolikiView

Класс CKrestikiAndNolikiView отвечает за отображение документов на рабочем окне.

3.1.1.1 Функция CKrestikiAndNolikiView

Для начала зададим клетки, образующие игровое поле.

В библиотеке MFC имеется подходящий для подобных целей класс под именем CRect, позволяющий воспроизводить отдельные клетки. Добавим в класс CKrestikiAndNolikiView матрицу CRect-элементов размерностью 32х16.

Для этого найдите в окне Project Workspace (рис. 11)элемент CKrestikiAndNolikiView и щелкните на нем правой клавишей мыши; выберите в контекстном меню команду Add MemberVariable (Добавить переменную). Введите в появившемся диалоговом окне(рис. 12) в поле Variable Type (Тип переменной) слово "CRect" (разумеется, без кавычек), а в поле Variable Name (Название переменной) - подстроку "m_rect[32][16]". Префикс m_ означает, что данна переменная является членом класса. Щелкните на кнопке с зависимой фиксацией Protected, чтобы ограничить доступ к новой переменной члена класса; нажмите OK.

Рисунок 12- Инициализация переменной m_rect .

Далее раскройте в окне Project Workspace класс CKrestikiAndNolikiView (рис. 13) и выведите на экран список его функций и элементов данных для чего щелкните на маленьком значке "плюс", расположенном рядом с именем этого класса. Если дважды щелкнуть на имени класса CKrestikiAndNolikiView, то появится исходный код для конструктора класса CKrestikiAndNolikiView.

Рисунок 13- Открытие функции CKrestikiAndNolikiView

И далее добавьте следующий код в эту функцию.

CKrestikiAndNolikiView::CKrestikiAndNolikiView()

{

for (int i=1; i<=31; i++) {

for (int j=1; j<=15; j++) {

int x = ((i-1) * 60) + 15;

int y = - ((j-1) * 60) - 25;

m_rect[i][j].SetRect (x, y, x + 55, y - 55);

m_rect[i][j].NormalizeRect(); } }

}

Поскольку начало координат находиться в левом верхнем углу ось X направлена вправо, ось Y - вверх. По этому Y-координаты клеток имеют отрицательные значения, поскольку ось Y в нашем случае направлена в низ.

Функция m_rect[i][j].SetRect (x, y, x + 55, y - 55) задает координаты клетки , а именно верхний левый угол и нижний правый.

Функция CRect::NormalizeRect. Нужна для того чтобы, функция PtInRect (позволяющая выяснить, был ли щелчок мыши произведён в пределах границ конкретно клетки) работала корректно.

3.1.1.2 Функция OnDraw

Для прорисовки игрового поля используется элемент OnDraw.

Дл его вызова выберем список функций класса CKrestikiAndNolikiView и щелкнем дважды на элементе OnDraw(рис. 13). И далее запишем там следующий код:

CKrestikiAndNolikiDoc* pDoc= GetDocument();// получить указатель на документ

ASSERT_VALID(pDoc);

pDC->SetMapMode (MM_LOENGLISH);//присваивает схеме //соответствия единицу измерения =0.01 логического дюйма

for (int i=1; i<=31; i++) {

for (int j=1; j<=15; j++) {

//if ( i==0&&j==0){ pDC->Rectangle (m_rect[0][0]);}

pDC->Rectangle (m_rect[i][j]);

BYTE bVal = pDoc->GetSquare (i,j);

if (bVal == 1)

DrawX (pDC, &m_rect[i][j]);

else if (bVal == 2)

Draw0 (pDC, &m_rect[i][j]);}

Функция pDC->Rectangle (m_rect[i][j]) рисует прямоугольник с координатами верхнего левого и нижнего правого углов.

DrawX и Draw0 - функции для прорисовки X и 0 соответственно.

3.1.1.3 Функция OnLButtonDown

В пункте 2.1.2 мы уже добавили функцию OnLButtonDown . Далее откроем её в классе CKrestikiAndNolikiView (рис. 13).И добавим следующий код:

CKrestikiAndNolikiDoc* pDoc=GetDocument //получит указатель на класс document

CClientDC dc (this);

dc.SetMapMode(MM_LOENGLISH);//преобразовать записаные в переменной

dc.DPtoLP (&point); //point значения к логической системе координат

for (int i=1; i<=31 ; i++) {

for (int j=1; j<=14 ; j++) {

if (m_rect[i][j].PtInRect (point)){

if ( pDoc->GetSquare ( i, j) == 0 ) {

pDoc->AddX (i, j);

DrawX (&dc, &m_rect[i][j]); }}}}

Функция pDoc->GetSquare (i, j) - проверяет пустая ли это клетка. Если да, то прорисовывает X (DrawX), а также выполняет функцию AddX.

3.1.1.4 Функции DrawX и Draw0

Для создания функции DrawX найдите в окне Project Workspace (рис. 11) элемент CKrestikiAndNolikiView и щелкните на нем правой клавишей мыши; выберите в контекстном меню команду Add Member Function (Добавить функцию). Введите в появившемся диалоговом окне (рис. 14) в поле Function Type (Тип функции) слово "void", а в поле Function Declaration (Декларируемая функция) - подстроку "DrawX(CDC *pDC, CRect *pRect)".

Рисунок 14 - Создание функции DrawX

Далее откроем эту функцию и добавим следующий код:

// Скопировать параметры переданного прямоугольника и

// уменьшить его размеры.

CRect rect;

rect.CopyRect (pRect);

rect.DeflateRect (10, 10);

// Создать красный карандаш и нарисовать им Х.

CPen pen (PS_SOLID, 10, RGB (255, 0, 0));

CPen* pOldPen = pDC->SelectObject (&pen);

pDC->MoveTo (rect.left, rect.top);

pDC->LineTo (rect.right, rect.bottom);

pDC->MoveTo (rect.left, rect.bottom);

pDC->LineTo (rect.right, rect.top);

pDC->SelectObject (pOldPen);

Функция CPen pen создает инструмент для рисования - карандаш красного цвета для линий толщиной 10 условных единиц.

Функция pDC->MoveTo определяет начало линии, а функция pDC->LineTo -определяет конец линии , а также прочерчивает саму линию.

Таким же способом образом создаём функцию Draw0(рис.15).

Рисунок 15 - Создание функции Draw0

Далее откроем эту функцию и добавим следующий код:

// Скопировать параметры переданного прямоугольника и

// уменьшить его размеры.

CRect rect;

rect.CopyRect (pRect);

rect.DeflateRect (10, 10);

// Создать зелёный карандаш и нарисовать им 0.

CPen pen (PS_SOLID, 10, RGB (0, 255, 0));

CPen* pOldPen = pDC->SelectObject (&pen);

pDC->SelectStockObject (NULL_BRUSH);

pDC->Ellipse (rect);

pDC->SelectObject (pOldPen);

Функция pDC->Ellipse (rect) рисует ноль в полученном прямоугольнике.

3.1.2 Класс CKrestikiAndNolikiDoc

В программе, создаваемой средствами Visual C++, данные хранятся в объекте document.Для хранения информации добавим новую принадлежащую переменную m_grid, представляющую собой массив 32х16, состоящий из 1-байт элементов. Для этого найдите в окне Project Workspace (рис. 11)элемент CKrestikiAndNolikiDoc и щелкните на нем правой клавишей мыши; выберите в контекстном меню команду Add MemberVariable (Добавить переменную). Введите в появившемся диалоговом окне(рис. 16) в поле Variable Type (Тип переменной) слово "BOOL" ,а в поле Variable Name (Название переменной) - подстроку "m_grid[32][16]". Теперь щелкните кнопку OK, и массив m_grid будет внесен в класс document. Каждый элемент этого массива будет соответствовать одной клетке игрового поля. Для начала всем элементами будут присвоены нулевые значения, чтобы все клетки оказались пустыми. При вводе X или O надлежащему элементу будет присваиваться соответственно значение 1 или 2. Чтобы исключить возможность прямого обращения из объекта view к массиву m_grid, мы добавим две принадлежащие public-функции - AddX и AddO, - которые будут вносить в этот массив сведения о крестиках и ноликах.

Рисунок 16 - Создание функции Draw0

3.1.2.1 Функция OnNewDocument

Далее, чтобы инициализация значений m_grid происходила при начале каждой новой игры, необходимо добавить соответствующий фрагмент программы в функцию OnNewDocument этого класса. Это виртуальная функция класса CDocument, которая вызывается при создании каждого нового документа. Сначала, щелкнув на вкладке ClassView, найдите в списке принадлежащих функций класса CKrestikiAndNolikiDoc элемент OnNewDocument и дважды щелкните на нем, чтобы на экране появился исходный текст CKrestikiAndNolikiDoc::OnNewDocument. Далее замените код следующим:

if (!CDocument::OnNewDocument())

return FALSE;

for (int i=1; i<=31; i++){

for (int j=1; j<=15; j++){

m_grid[i][j]=0; }} //

return TRUE;

3.1.2.2 Функция AddX

Теперь, когда мы добавили массив m_grid и присвоили начальные значения его элементам, приступим к подготовке функций, которые будут использоваться в классе view для внесения в этот массив сведений о крестиках и ноликах. В списке ClassView, щелкните правой клавишей мыши на элементе CTicDoc и выберите в контекстном меню команду Add Function (Добавить функцию). Введите в диалоговом окне Add Member Function (Ввод принадлежащей функции) в поле Function Type (Тип функции) слово "void", а в поле Function Declaration (Объявление функции) строку "AddX(int i, int j)". Переключатель в панели Access (Доступ) установлен в положение Public. Щелкните OK.

Далее добавим следующий код:

m_grid[i][j]=1;

Т.е присваиваем значение переменное =1 если ставим крестик.

3.1.2.3 Функция Add0

Также в списке ClassView, щелкните правой клавишей мыши на элементе CTicDoc и выберите в контекстном меню команду Add Function (Добавить функцию).

Введите в диалоговом окне Add Member Function (Ввод принадлежащей функции) в поле Function Type (Тип функции) слово "void", а в поле Function Declaration (Объявление функции) строку "Add0(int i, int j)". Переключатель в панели Access (Доступ) установлен в положение Public. Щелкните OK.

Далее добавим следующий код:

m_grid[i][j]=2;

Т.е присваиваем значение переменное =2 если ставим нолик.

3.1.2.4 Функция GetSquare

Теперь в класс document входит массив для записи данных об X и O, а также принадлежащие public-функции для внесения в него значений соответствующих значкам X и O. Однако прежде чем выбранная клетка будет заполнена, необходимо, чтобы в классе view выполнялась проверка, пуста ли данная клетка. Значит далее добавляем в класс document принадлежащую public-функцию с именем GetSquare, которая считывает содержащиеся в клетке с заданными координатами данные.

Вновь щелкните в ClassView правой клавишей мыши на элементе CKrestikiAndNolikiDoc и выберите в контекстном меню команду Add Function. Введите в диалоговом окне (рис. 11) Add Member Function в поле Function Type слово "BYTE", а в поле Function Declaration - строку "GetSquare(int i, int j)". Щелкните OK, и эта функция будет создана.

Добавьте в тело функции CTicDoc::GetSquare следующую строку:

return m_grid[i][j];

Рисунок 16 - Создание функции GetSquare

Основной код программы.

Цель игры крестики и нолики состоит в том, чтобы выстроить и линию пять крестиков или ноликов. Побеждает тот ,кто сделает это первым. Мы уже ознакомились со всеми основными функциями игры для создания основы.

Далее приводиться описание кода и действий которые должен выполнять компьютер. Весь этот код помещён в класс CKrestikiAndNolikiView в функцию OnLButtonDown и происходит он сразу после того, как игрок поставит крестик.

Описание работы компьютера. Опасные ходы

Опасными ходами можно назвать те, которые неминуемо приведут к поражению, и которые обязательно должны быть блокированы (рис. 17).

1. Если 4 крестика стоят в ряд

2. Если 3 крестика стоят в ряд

3. Если есть 2 крестика и ещё один стоящий через 1 позицию, и все они стоят на одном ряду.

4. Если есть 2 крестика и ещё 2 крестика чтоящих через 1 позицию, и все они стоят на одном ряду.

И все эти условия можно отнести ко всем крестикам стоящим на вертикальной, горизонтальной и диагональной линиях.

Рисунок 17 - Опасные ходы

Для работы с опасными ходами созданы массивы: m_rez (для работы с крестиками), m_rezkomp(для работы с ноликами). Далее все массивы с постфиксом "komp" будут относиться к ноликам, а остальные массивы без него к крестикам. Компьютер блокирует этот ход (если это атака игрока), и ходит так (если это атака компьютера).

Скрытые опасные ходы

Такими ходами можно назвать некоторые ситуации которые состоят из двух и более безопасных ситуаций, но вместе которые представляют серьёзную угрозу. Вариантов таких ситуаций множество (рис 18).

Рисунок 18 - Скрытые опасные ходы

Для нахождения таких ситуаций компьютер находит все безопасные ситуации и заносит и в массив m_dop и m_dopkomp, и затем сранивает все элементы. И если есть хоть одно совпадение, то компьютер блокирует этот ход (если это атака игрока), и ходит так (если это атака компьютера).

Безопасные ходы

Все безопасные ходы компьютер заносит в массивы: m_dopdop и m_dopdopkomp. Они необходимы для решения спорных ситуаций.

Атаковать или обороняться?

Для решения такой ситуации в коде есть переменные y, yy, и чем меньше значение переменной, тем больше приоритет.

Для кода программы нужны не только переменные, но и массивы. Для их создания найдите в окне Project Workspace (рис. 11)элемент CKrestikiAndNolikiViev и щелкните на нем правой клавишей мыши; выберите в контекстном меню команду Add MemberVariable (Добавить переменную). Введите в появившемся диалоговом окне (рис. 16) в поле Variable Type (Тип переменной) слово "BOOL", а в поле Variable Name (Название переменной) - подстроку "m_rez[4][300];". Теперь щелкните кнопку OK, и массив m_rez будет внесен в класс viev. То же самое надо проделать с пятью другими массивами: m_rezkomp[4][300], m_dop[4][300], m_dopkomp[4][300],m_dopdop[4][300], m_dopdopkomp[4][300].

Код программы

Int k=0,l=0,m=0,q=0,w=0,e=0,o=0,kon=0,p=0,a=0,b=0, c=0,d=0,f=0,i1=0, j1=0,e1=0,w1=0,e0=0,w0=0,n=0,o1=0,a1=0,b1=0,c1=0,n1=0,m1=0, oo=0,aa=0,r=0,rr=0,y=0,yy=0;

for (i=1; i<=31; i++) { k=0;

for (j=1; j<=15; j++) {

if (pDoc->GetSquare (i, j) == 1){ k++;

if(k==4){if( pDoc->GetSquare (i, j+1) == 0) {o++;m_rez[1][o]=i;m_rez[2][o]=j+1;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>1){y=1;}} if( pDoc->GetSquare (i, j-4) == 0) {o++;m_rez[1][o]=i;m_rez[2][o]=j4;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>1){y=1;}}}

if(pDoc->GetSquare (i, j)==1&&pDoc->GetSquare (i, j-1) ==1 && pDoc->GetSquare ( i, j+1) == 0&&pDoc->GetSquare (i, j+2)==1 &&pDoc->GetSquare ( i, j+3)==1) {o++;m_rez[1][o]=i;m_rez[2][o]=j+1;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>1){y=1;}

if(pDoc->GetSquare ( i, j) == 1 && pDoc->GetSquare ( i, j-1) == 1 ){

if (pDoc->GetSquare ( i, j+1) == 0 && pDoc->GetSquare ( i, j+2) == 0) {a++;m_dop[1][a]=i;m_dop[2][a]=j+2;m_dop[3][a]=i;m_dop[4][a]=j+3;}

if (pDoc->GetSquare ( i, j-2) == 0 && pDoc->GetSquare ( i, j-3) == 0 ) {a++;m_dop[1][a]=i;m_dop[2][a]=j-2;m_dop[3][a]=i;m_dop[4][a]=j-3;}}

if( pDoc->GetSquare ( i, j+1) == 0 && pDoc->GetSquare ( i, j+2) == 1 &&

(pDoc->GetSquare ( i, j+3) == 1 || pDoc->GetSquare ( i, j-1) == 1 ) && pDoc->GetSquare ( i, j+4) == 0 && pDoc->GetSquare ( i, j-2) == 0){o++;m_rez[1][o]=i;m_rez[2][o]=j+1;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>2){y=2;}}

if( pDoc->GetSquare ( i, j+1) == 0 && pDoc->GetSquare ( i, j+2) == 1 &&

pDoc->GetSquare ( i, j+3) == 0 && pDoc->GetSquare ( i, j-1) == 0 )

{a+=2;m_dop[1][a-1]=i;m_dop[2][a-1]=j+1;m_dop[3][a-1]=0;m_dop[4][a-1]=0;

m_dop[1][a]=i;m_dop[2][a]=j-1;m_dop[3][a]=i;m_dop[4][a]=j+3;}

if( pDoc->GetSquare ( i, j+1) == 0 && pDoc->GetSquare ( i, j+2) == 0 &&

pDoc->GetSquare ( i, j-2) == 0 && pDoc->GetSquare ( i, j-1) == 0 )

{r+=2;m_dopdop[1][r-1]=i;m_dopdop[2][r-1]=j+1;m_dopdop[3][r-1]=i;m_dopdop[4][r-1]=j-1;

m_dopdop[1][r]=i;m_dopdop[2][r]=j+2;m_dopdop[3][r]=i;m_dopdop[4][r]=j-2;}}

else k=0;}}

for ( j=1; j<=15 ; j++) {k=0;

for ( i=1; i<=31 ; i++) {

if ( pDoc->GetSquare (i, j) == 1 ){ k++;

if(k==4){k=0;if(pDoc->GetSquare (i+1, j) == 0) {o++;m_rez[1][o]=i+1;m_rez[2][o]=j;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>1){y=1;}}

if( pDoc->GetSquare (i-4, j) == 0) {o++;m_rez[1][o]=i-4;m_rez[2][o]=j;m_rez[3][o]=0; m_rez[4][o]=0 ;if(y==0||y>1){y=1;}}}

if( pDoc->GetSquare ( i, j) == 1 && pDoc->GetSquare ( i-1, j) == 1 &&

pDoc->GetSquare ( i+1, j) == 0 && pDoc->GetSquare ( i+2, j) == 1 &&

pDoc->GetSquare (i+3, j) == 1) {o++;m_rez[1][o]=i+1;m_rez[2][o]=j;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>1){y=1;}}

if( pDoc->GetSquare (i, j) == 1 && pDoc->GetSquare ( i-1, j) == 1 ){

if (pDoc->GetSquare (i+1, j) == 0 && pDoc->GetSquare ( i+2, j) == 0 ) {a++;m_dop[1][a]=i+2;m_dop[2][a]=j;m_dop[3][a]=i+3;m_dop[4][a]=j;}

if (pDoc->GetSquare (i-2, j) == 0 && pDoc->GetSquare ( i-3, j) == 0 ){

a++;m_dop[1][a]=i-2;m_dop[2][a]=j;m_dop[3][a]=i-3;m_dop[4][a]=j;}}

if( pDoc->GetSquare ( i+1, j) == 0 && pDoc->GetSquare ( i+2, j) == 1 &&

(pDoc->GetSquare (i+3, j) == 1 || pDoc->GetSquare ( i-1, j) == 1 ) &&

pDoc->GetSquare (i+4, j) == 0 && pDoc->GetSquare ( i-2, j) == 0) {o++;m_rez[1][o]=i+1;m_rez[2][o]=j;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>2){y=2;}}

if( pDoc->GetSquare ( i+1, j) == 0 && pDoc->GetSquare ( i+2, j) == 1 &&

pDoc->GetSquare ( i+3, j) == 0 && pDoc->GetSquare ( i-1, j) == 0 )

{a+=2;m_dop[1][a-1]=i+1;m_dop[2][a-1]=j;m_dop[3][a-1]=0;m_dop[4][a-1]=0;

m_dop[1][a]=i-1;m_dop[2][a]=j;m_dop[3][a]=i+3;m_dop[4][a]=j;}

if( pDoc->GetSquare ( i+1, j) == 0 && pDoc->GetSquare ( i+2, j) == 0 &&

pDoc->GetSquare ( i-2, j) == 0 && pDoc->GetSquare ( i-1, j) == 0 )

{r+=2;m_dopdop[1][r-1]=i+1;m_dopdop[2][r-1]=j;m_dopdop[3][r-1]=i-1;m_dopdop[4][r-1]=j;

m_dopdop[1][r]=i+2;m_dopdop[2][r]=j;m_dopdop[3][r]=i2;m_dopdop[4][r]=j;}}

else k=0;}}

for ( j=1; j<=15 ; j++) {

for ( i=1; i<=31 ; i++ ) {k=0;

if(pDoc->GetSquare (i, j) ==1&&pDoc->GetSquare (i+1,j+1) == 0&& pDoc->GetSquare ( i+2, j+2) == 1 && pDoc->GetSquare ( i+3, j+3) == 0&&pDoc->GetSquare ( i-1, j-1) == 0 )

{a+=2;m_dop[1][a-1]=i+1;m_dop[2][a-1]=j+1;m_dop[3][a-1]=0;m_dop[4][a-1]=0;

m_dop[1][a]=i-1;m_dop[2][a]=j-1;m_dop[3][a]=i+3;m_dop[4][a]=j+3;}

if( pDoc->GetSquare ( i, j) == 1 && pDoc->GetSquare ( i-1,j-1) == 1 ){

if (pDoc->GetSquare ( i+1, j+1) == 0 && pDoc->GetSquare ( i+2, j+2) == 0 ){a++;m_dop[1][a]=i+2;m_dop[2][a]=j+2;m_dop[3][a]=i+3;m_dop[4][a]=j+3;}

if (pDoc->GetSquare ( i-2, j-2) == 0 && pDoc->GetSquare ( i-3, j-3) == 0 ){a++;m_dop[1][a]=i-2;m_dop[2][a]=j-2;m_dop[3][a]=i-3;m_dop[4][a]=j-3;}}

if( pDoc->GetSquare ( i, j) == 1 && pDoc->GetSquare ( i+1, j+1) == 0 &&

pDoc->GetSquare (i+2, j+2) == 1 && (pDoc->GetSquare ( i+3, j+3) == 1

|| pDoc->GetSquare (i-1, j-1) == 1 ) && pDoc->GetSquare ( i+4, j+4) == 0 && pDoc->GetSquare (i-2, j-2) == 0) {o++;m_rez[1][o]=i+1;m_rez[2][o]=j+1;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>2){y=2;}}

if( pDoc->GetSquare ( i, j) == 1 && pDoc->GetSquare ( i+1, j+1) == 0 && pDoc->GetSquare ( i+2, j+2) == 0 && pDoc->GetSquare ( i-2, j-2) == 0 && pDoc->GetSquare ( i-1, j-1) == 0 )

{r+=2;m_dopdop[1][r-1]=i+1;m_dopdop[2][r-1]=j+1;m_dopdop[3][r-1]=i-1;m_dopdop[4][r-1]=j-1;m_dopdop[1][r]=i+2;m_dopdop[2][r]=j+2;m_dopdop[3][r]=i-2;m_dopdop[4][r]=j-2;}

if(pDoc->GetSquare ( i, j) == 1 && pDoc->GetSquare ( i-1, j-1) == 1 && pDoc->GetSquare ( i+1, j+1) == 0 && pDoc->GetSquare ( i+2, j+2) == 1 && pDoc->GetSquare ( i+3, j+3) == 1)

{o++;m_rez[1][o]=i+1;m_rez[2][o]=j+1;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>1){y=1;}}

for ( j1=j,i1=i,f=0; f<4 ;f++,j1++,i1++){

if ( pDoc->GetSquare ( i1, j1) == 1 ){ k++;

if(k==4){k=0;if(pDoc->GetSquare (i1+1, j1+1)==0) {o++;m_rez[1][o]=i1+1;m_rez[2][o]=j1+1;m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>1){y=1;}}

if( pDoc->GetSquare (i1-4, j1-4)==0) {o++;m_rez[1][o]=i1- 4;m_rez[2][o]=j1-4; m_rez[3][o]=0;m_rez[4][o]=0;if(y==0||y>1){y=1;}}}}

else k=0;}}}

for ( j=1; j<=15 ; j++) {


Подобные документы

  • Разработка популярной развлекательной игры крестики-нолики. Возможность играть с компьютером, который играет согласно созданному алгоритму. Новые возможности Visual Studio. Легкое усвоение программы. Удобный интерфейс - "визитная карточка" приложения.

    курсовая работа [74,6 K], добавлен 20.12.2009

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

    курсовая работа [34,6 K], добавлен 19.05.2014

  • Проект программы "Крестики-нолики". Блок-схема алгоритма. Описание работы программного продукта. Инструкция по инсталляции. Инструкция программисту, возможность доработки с целью упрощения исполняемых кодов. Инструкция по проверке и тестированию.

    курсовая работа [235,8 K], добавлен 05.12.2009

  • Знакомство с интерфейсом пользователя и сценарием использования программы игры в крестики и нолики. Функциональные и нефункциональные требования для персонального компьютера. Исключительные ситуации и реакция программы. Пример кода игры и комментарии.

    курсовая работа [236,5 K], добавлен 27.01.2014

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

    методичка [819,6 K], добавлен 12.05.2013

  • Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.

    курсовая работа [821,5 K], добавлен 13.02.2012

  • Разработка алгоритма, выполняющего поиск наилучшего решения на каждый ход в игре "крестики-нолики" (используя минимальный алгоритм). Обоснование выбора программных средств для решения задачи. Блок-схема интеллектуального алгоритма реализации программы.

    контрольная работа [380,0 K], добавлен 28.04.2014

  • Разработка аналога игры "Крестики-нолики", где игроки выбирают размер поля. Правила игры. Интерфейс программы. Главная функция main. Класс XO. Метод вывода поля и хода игроков. Методы поиска крестиков, ноликов. Методы проверки выигрышных ситуаций игроков.

    курсовая работа [281,5 K], добавлен 30.01.2018

  • Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.

    курсовая работа [352,8 K], добавлен 14.04.2011

  • Технические и пользовательские характеристики игры, требования к программному обеспечению и среде разработки C#. Составление блок-схемы алгоритма, uml-диаграммы и текста программы, тестирование корректности компьютерного кода и результатов его работы.

    курсовая работа [1,8 M], добавлен 05.03.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.