Бакалавр
Дипломные и курсовые на заказ

Крестики-нолики

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

За основу можно взять обработчики нажатий панелей, которых ровно 9 на игровом поле. Каждый обработчик вызывает несколько функций. В начале идет условие, если пользователь выбирает тип игры «X против 0», просто клетки заполняются значениями 1 или 2 (крестик или нолик). Далее идут функции: индикация хода (CrossZero ()), которая меняет крестик на нолик и наоборот, блокировка занятых клеток… Читать ещё >

Крестики-нолики (реферат, курсовая, диплом, контрольная)

МИНОБРНАУКИ РОССИИ

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

«Вологодский государственный университет»

Кафедра автоматики и вычислительной техники Пояснительная записка к курсовому проекту по дисциплине

Программирование и основы алгоритмизации

«Крестики-нолики»

Выполнил студент группы ЭМ-21

Буторова Л.Ю.

Принял Ржеуцкая С. Ю.

Вологда

  • 1. АНАЛИЗ ЗАДАЧИ И ОПРЕДЕЛЕНИЕ ТРЕБОВАНИЙ К РАЗРАБАТЫВАЕМОЙ ПРОГРАММЕ
  • 1.1 Назначение программы, ее пользователи, основные функции и цели, которые преследуются при разработке
  • 1.2 Обзор известных программ, которые выполняют аналогичные функции
  • 1.3 Теоретические основы разработки
  • 1.4 Выбор инструментальных средств разработки
  • 2. ПРОЕКТНАЯ ЧАСТЬ РАЗРАБОТКИ
  • 2.1 Разработка пользовательского интерфейса
  • 2.2 Разработка структур данных (во внешней и оперативной памяти)
  • 2.3 Разработка и анализ алгоритмов
  • 3. РЕАЛИЗАЦИЯ ПРОГРАММЫ НА ЯЗЫКЕ С++
  • 3.1 Архитектура программы
  • 3.2 Выбор стандартных визуальных и не визуальных компонентов
  • 4. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ
  • ЗАКЛЮЧЕНИЕ
  • Список используемой литературы
  • Приложения

Крестики-нолики — логическая игра между двумя противниками на квадратном поле 3 на 3 клетки или большего размера (вплоть до «бесконечного поля»). Один из игроков играет «крестиками», второй — «ноликами». Эта игра стала популярна задолго до появления компьютеров, только раньше в нее играли с помощью обычного листка бумаги и ручки. В традиционной китайской игре используются черные и белые камни.

В данной курсовой работе сохранены основные правила и стандартный размер поля игры (3×3 клетки). Для удобства игры право первого хода оставлено за пользователем, то есть «крестиками».

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

В игре присутствуют три типа: X против 0 — пользователь против пользователя, «1 уровень с компьютером» — для тех кто только осваивает азы мировой игры, и уровень «2 уровень с компьютером» — для тех, кто абсолютно уверен в своей победе. На 1 и 2 уровне возможны три исхода: «победа», «проигрыш» и «ничья». Выигрыш фиксируется, если крестиками или ноликами полностью заполняется вертикаль, горизонталь или диагональ.

Если свободные клетки поля закончились, но никто не одержал победы, то считается, что игра закончилась «ничьей».

1. АНАЛИЗ ЗАДАЧИ И ОПРЕДЕЛЕНИЕ ТРЕБОВАНИЙ К РАЗРАБАТЫВАЕМОЙ ПРОГРАММЕ

программа крестик интерфейс

1.1 Назначение программы, ее пользователи, основные функции и цели, которые преследуются при разработке

Назначение данной программы служит, прежде всего, для развлечения пользователей, для того, чтобы скрасить время ожидания человека, ведь в любой работе нужен отдых, а данная простенькая игра поможет расслабиться и отвлечься от повседневных дел. Так же «крестики — нолики» относят к классу интеллектуальных и логических игр, которые предназначены для тренировки логического мышления, позволяют сконцентрировать внимание и развивают память.

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

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

1.2 Обзор известных программ, которые выполняют аналогичные функции

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

Мой курсовой проект представляет собой приложение для ПК. Игра предназначена как для одного пользователя, соперником которого является искусственный интеллект (или компьютер), так и для двух пользователей. Она представлена на классическом поле 3×3.

Наиболее интересной и необычной, по моему мнению, оказалась игра «Крестики-нолики 3D». Поэтому именно ее я выбрала для сравнение.

Трёхмерные крестики-нолики гораздо интереснее, чем на бумаге или на обычном поле. Здесь больше возможностей выиграть и проиграть, и ничья встречается реже. Играть можно одному — против компьютера — или вдвоём с другом. А самое необычное здесь то, что для выигрыша можно составить комбинацию из трех шаров своего цвета (черного или белого) не только на каком-либо одном уровне, но и по плоскости стенок и даже по диагонали всего поля (рис. 1.1).

Рис. 1.1

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

1.3 Теоретические основы разработки

Анализ

Для каждой из сторон общеизвестны алгоритмы, которые гарантируют ничью при любой игре противника, а при его ошибке позволяют выиграть. Таким образом, игра находится в состоянии «ничейной смерти». Ниже приведены некоторые из таких стратегий. Считается, что игрок всегда соблюдает два правила, имеющие приоритет над всеми остальными:

Правило 1. Если игрок может немедленно выиграть, он это делает.

Правило 2. Если игрок не может немедленно выиграть, но его противник мог бы немедленно выиграть, сделав ход в какую-то клетку, игрок сам делает ход в эту клетку, предотвращая немедленный проигрыш.

За крестики:

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

1.Если противник ответил ходом в угловое поле — сходить в ответ в соседний угол. Противник будет вынужден пойти в противоположный угол, чтобы на следующем ходу не проиграть. Дальнейшие ходы делаются так, чтобы блокировать построение тройки противником. — Ничья.

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

За нолики.

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

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

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

Рис. 1.2. Дерево игровых ситуаций Частичное дерево игровых ситуаций, изображено на Рис. 1.2 для игры крестики-нолики. Дерево игровых ситуаций для игры крестики-нолики, где игрок за «крестики» ходит первым и поступает по приведенному выше алгоритму, а игрок за «нолики» может поступать как угодно (причем приведено по одной вершине для рационального и для нерационального поступка, то есть любого другого), состоит из 50-ти узлов.

1.4 Выбор инструментальных средств разработки

Для реализации поставленных нами задачи необходима интегрированная среда разработки приложений. Поэтому разработка проекта проводилась в среде программирования Microsoft Visual Studio 2008.

Microsoft Visual Studio — линейка продуктов компании Microsoft, включающих интегрированную среду разработки программного обеспечения и ряд других инструментальных средств. Данные продукты позволяют разрабатывать как консольные приложения, так и приложения с графическим интерфейсом, в том числе с поддержкой технологии Windows Forms, а также веб-сайты, веб-службы как в родном, так и вуправляемом кодах для всех платформ, поддерживаемых Windows, Windows Mobile, Windows CE, .NET Framework, Xbox, Windows Phone .NET Compact Framework и Silverlight.

2. ПРОЕКТНАЯ ЧАСТЬ РАЗРАБОТКИ

2.1 Разработка пользовательского интерфейса

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

1) Главное меню программы Рис. 2.1 — Главное меню программы Главное меню предназначено для того, чтобы пользователь смог влиться в игровую атмосферу, поэтому интерфейс исполнен в красочных, игровых тонах. Через меню можно перейти на игровое поле, посмотреть правила игры или же выйти из игры.

2) Игровое поле Рис 2.2 — Игровое поле Игровое поле содержит в себе непосредственную область для игры, куда игрок и компьютер ставят свои значки. Перед началом игры пользователь должен выбрать тип игры, такой как «X против 0», «1 уровень с компьютером» или «2 уровень с компьютером», иначе программа выдаст сообщение о том, что нужно сделать. Кнопка, которая поможет игроку вернуться в главное меню. В конце будут всплывать дополнительные окна, которые будут информировать участника о результатах поединка.

Рис. 2.3 — дополнительные окна исхода игры

2.2 Разработка структур данных (во внешней и оперативной памяти)

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

Для её работы требуется 803 Кб свободной памяти.

2.3 Разработка и анализ алгоритмов

Для реализации алгоритма мышления игры необходимо задать статический массив gcnew array (9); в котором будут храниться состояния игрового поля, где каждая ячейка массива соответствует клетке. «0» — соответствует пустой клетке, если в клетку сходил игрок, то есть «X», записывается значение «1» и если ход сделал компьютер, то есть «О», значение «2». Изначально все элементы массива равны «0». Необходимо задать статическую переменную lvl, которая хранит данные об уровне. Всего в этой игре 3 уровня: lvl принимает значение «1», если пользователь выбрал тип игры «X против О», значение «2», если «1 уровень с компьютером», и значение «3», если «2 уровень с компьютером». Переменная player — хранит очередность хода («true» — ход игрока, «false" — ход компьютера). Так как право первого хода предоставляется пользователю, то в начале игры player = true. Статическая переменная flag хранит информацию о том, есть ли пустые клетки на игровом поле или нет: если flag = true — то есть, false — пустых клеток нет. Алгоритм проверки должен содержать в себе перебор параметров массива х и выдвигать свое решение, которое будет оптимальным для дальнейшей игры. В данной программе представлено 2 уровня игры с компьютером. В 1 уровень задача компьютера не состоит в том, чтобы обыграть соперника. Поэтому данная функция возвращает рандомное значение клетки, куда будет ходить компьютер. В [Приложении 1] представлен код данного алгоритма. На Рис. 2.4 представлена блок схема реализации кода.

Более оптимальный алгоритм для игры представлен в функции dif_level () ([Приложение 3]). В данной функции вызывается функция check (int n). В [Приложении 2] представлен код данного алгоритма. На Рис. 2.4 представлена блок-схема реализации кода. Введем дополнительную переменную k = -1, для проверки комбинаций на игровом поле. Если такая комбинация есть, то сохраняем клетку закрытия комбинации и функция возвращает true. Иначе значение k не изменяется, а функция возвращает false.

Самый выйгрышный ход в начале игры, это ход в центр поле. В функции dif_level () в начале проверяется условие: если игрок не сходил в центральное поле, то туда ходит компьютер. Иначе, если игрок сходил в центр, то вызывается функия check (2) для проверки комбинации компьютера и, если есть возможность выиграть, то возврат номера клетки. Если же компьютер следующим ходом выиграть не может, то вызывается функция check (1): проверка комбинации игрока. Возвращается номер клетки, поставив бы в которую игрок выиграл. Если и такой комбинации нет, то вызывается функция low_level ().

Рис. 2.4. — Блок-схема

Рис. 2.5. — Блок-схема

3. РЕАЛИЗАЦИЯ ПРОГРАММЫ НА ЯЗЫКЕ С++

3.1 Архитектура программы

В данной программе реализованы 3 формы: главное меню (рис. 2.1.), игровое поле (рис. 2.2) и поле помощи (правила игры); 12 панелей, 9 из которых основные. Также по окончанию игры появляется pictureBox с результатом, всего их 5 (рис 2.3).

За основу можно взять обработчики нажатий панелей, которых ровно 9 на игровом поле. Каждый обработчик вызывает несколько функций. В начале идет условие, если пользователь выбирает тип игры «X против 0», просто клетки заполняются значениями 1 или 2 (крестик или нолик). Далее идут функции: индикация хода (CrossZero ()), которая меняет крестик на нолик и наоборот, блокировка занятых клеток checkingArray (), нахождение победителя winner (). В функции winner () рассмотрены все возможные варианты выигрыша, поэтому, если кто-то из игроков выстроит в ряд 3 свои фигуры (крестик или нолик) по вертикали, горизонтали или диагонали, тот и победит. В противном случае, если поле заполнено, но никто из игроков не выстроил ряд, то вызывается функция (_friend ())-проверка на ничью, которая проверяет, остались ли на поле свободные клетки или нет. Если fr = true, то на поле нет свободных клеток. Если значение изменилось, значит на поле нашлась свободная клетка.

Второе условие работает, если выбран второй или третий тип игры. Тогда вызывается функция, в которой осуществлен ход компьютера move (int n). В нее передается номер клетки, на которую нажал игрок. Далее идут функции: индикация хода (CrossZero ()), блокировка занятых клеток checkingArray (). Затем вызывается функция winner (), которая проверяет, победил ли игрок этим ходом или нет. Если нет, то проверяется наличие свободных клеток. Если свободные клетки есть, то ходит компьютер. Далее, в зависимости от того, какой уровень выбрал игрок «1» или «2» вызываются функции соответственно: low_level (), dif_level (). Функция low_level () выбирает куда ставить нолик рандомно, а в функции dif_level () представлен специальный алгоритм победы компьютера. Далее идут функции: индикация хода (CrossZero ()), блокировка занятых клеток checkingArray (). Затем вызывается функция winner (), которая проверяет, победил ли компьютер этим ходом или нет. Если нет, то проверяется наличие свободных клеток. Если свободные клетки есть, то ходит игрок.

3.2 Выбор стандартных визуальных и не визуальных компонентов

Для реализации данной работы были выбраны следующие компоненты:

1) Form1, с заданными параметрами Text=Крестики-нолики, ControlBox=False

2) f2, с заданными параметрами BackColor, Text=Игра

3) comboBox1 с заданными параметрами Items:

— X против 0

— 1 уровень с компьютером

— 2 уровень с компьютером

4) panel, c заданными параметрами BackColor, и различными значениями параметра Visible и Enabled. Для некоторых panel были написаны такие события как Click.

5) button, c заданными параметрами Font, Fore Color, BackColor, Text, для всех button были написаны такие события как Click.

6) label, c заданными параметрами BackColor, Font, Fore Color, Text.

7) pictureBox, c заданными параметрами Image, SizeMode= StretchImage.

8) textBox, c заданными параметрами BackColor, Font, Fore Color, Text=" «.

4. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ

Проведем тестирование программы, пройдя 3 типа игры.

Пробуем действия кнопок главного меню. Кнопки работают исправно. Попытаемся начать игру, не выбрав типа игры. Программа выдает сообщение об ошибке и просит выбрать тип игры.(Рис. 4.1)

Рис. 4.1.

Выберем 1 тип игры — «X против 0», т. е. пользователь против пользователя. На данном этапе игры пользователь так же может играть сам с собой. (Рис. 4.2)

Рис. 4.2.

В процессе игры «1 уровень с компьютером» компьютер не ставит себе цель выиграть участника. Он просто ставит нолики в свободные места поля. На данном этапе пользователь может легко обыграть компьютер. Хотя на этом уровне возможны и остальные варианты развития событий.

Рис. 4.3.

Тип игры «2 уровень с компьютером». На данном этапе игра анализирует все ходы и старается выбрать наиболее оптимальный ход. Здесь также возможны все три варианта развития событий, т.к. первый свой ход компьютер делает в любую свободную клетку. Чаще всего игра сводится к ничьей.

Рис. 4.4.

Программа на все вариантах тестов работает успешно, без ошибок.

ЗАКЛЮЧЕНИЕ

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

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

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

Особенностями данной программы является:

— Четко построенный алгоритм;

— Интуитивно понятный интерфейс;

— Простота в использовании;

— Вполне понятное руководство пользователя;

— Отсутствие лишних дополнений.

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

1. http://www.pravilaigr.ru/xo.php

2. http://2igroka.com/stuff/sportivnye/krestiki_noliki_3d/15−1-0−14

3. https://www.draw.io/

4. http://pol-video.ru/QPW9QHEO2GU/uroki_s_krestiki-noliki_ch1.html

ПРИЛОЖЕНИЕ 1

private: int low_level (){// процедура для легкого противника

int r;

System:Random^ rand = gcnew System: Random ();

do {

r = rand->Next (0,8);

} while (x[r] ≠ 0);

return r;

}

ПРИЛОЖЕНИЕ 2

private: bool check (int n){k = -1;// проверяет все комбинации, и возвращает правильный ход

if (x[0] == n) {

if ((x[1] == n)&&(x[2] == 0)) k =2;

if ((x[2] == n)&&(x[1] == 0)) k =1;

if ((x[3] == n)&&(x[6] == 0)) k =6;

if ((x[6] == n)&&(x[3] == 0)) k =3;

if ((x[4] == n)&&(x[8] == 0)) k =8;

if ((x[8] == n)&&(x[4] == 0)) k =4;

}

if (x[1] == n) {

if ((x[2] == n)&&(x[0] == 0)) k =0;

if ((x[4] == n)&&(x[7] == 0)) k =7;

if ((x[7] == n)&&(x[4] == 0)) k =4;

}

if (x[2] == n) {

if ((x[6] == n)&&(x[4] == 0)) k =4;

if ((x[4] == n)&&(x[6] == 0)) k =6;

if ((x[5] == n)&&(x[8] == 0)) k =8;

if ((x[8] == n)&&(x[5] == 0)) k =5;

}

if (x[3] == n) {

if ((x[6] == n)&&(x[0] == 0)) k =0;

if ((x[4] == n)&&(x[5] == 0)) k =5;

if ((x[5] == n)&&(x[4] == 0)) k =4;

}

if (x[4] == n) {

if ((x[8] == n)&&(x[0] == 0)) k =0;

if ((x[5] == n)&&(x[3] == 0)) k =3;

if ((x[7] == n)&&(x[1] == 0)) k =1;

if ((x[6] == n)&&(x[2] == 0)) k =2;

}

if (x[5] == n) {

if ((x[8] == n)&&(x[2] == 0)) k =2;

}

if (x[6] == n) {

if ((x[7] == n)&&(x[8] == 0)) k =8;

if ((x[8] == n)&&(x[7] == 0)) k =7;

}

if (x[7] == n) {

if ((x[8] == n)&&(x[6] == 0)) k =6;

}

if (k≠-1) return true;else return false;

}

ПРИЛОЖЕНИЕ 3

private: int dif_level (){//сложный противник

//return check (2);

if (x[4] == 0) return (4);

if (check (2)) return k; else

if (check (1)) return k; else

return low_level ();

}

ПРИЛОЖЕНИЕ 4

private: void CrossZero (){// меняет крестик на нолик (индикатор хода)

if (player) {

panel11->Visible = true;

panel10->Visible = false;

} else {

panel10->Visible = true;

panel11->Visible = false;

}

}

private: void checkingArray (){// функция проверки, есть ли в клетке что-то, если есть, то больше на эту клетку нажимать нельзя.

if (x[0] == 1) {panel1->BackgroundImage = panel11->BackgroundImage;panel1->Enabled = false;}

if (x[0] == 2) {panel1->BackgroundImage = panel10->BackgroundImage;panel1->Enabled = false;}

if (x[1] == 1) {panel2->BackgroundImage = panel11->BackgroundImage;panel2->Enabled = false;}

if (x[1] == 2) {panel2->BackgroundImage = panel10->BackgroundImage;panel2->Enabled = false;}

if (x[2] == 1) {panel3->BackgroundImage = panel11->BackgroundImage;panel3->Enabled = false;}

if (x[2] == 2) {panel3->BackgroundImage = panel10->BackgroundImage;panel3->Enabled = false;}

if (x[3] == 1) {panel4->BackgroundImage = panel11->BackgroundImage;panel4->Enabled = false;}

if (x[3] == 2) {panel4->BackgroundImage = panel10->BackgroundImage;panel4->Enabled = false;}

if (x[4] == 1) {panel5->BackgroundImage = panel11->BackgroundImage;panel5->Enabled = false;}

if (x[4] == 2) {panel5->BackgroundImage = panel10->BackgroundImage;panel5->Enabled = false;}

if (x[5] == 1) {panel6->BackgroundImage = panel11->BackgroundImage;panel6->Enabled = false;}

if (x[5] == 2) {panel6->BackgroundImage = panel10->BackgroundImage;panel6->Enabled = false;}

if (x[6] == 1) {panel7->BackgroundImage = panel11->BackgroundImage;panel7->Enabled = false;}

if (x[6] == 2) {panel7->BackgroundImage = panel10->BackgroundImage;panel7->Enabled = false;}

if (x[7] == 1) {panel8->BackgroundImage = panel11->BackgroundImage;panel8->Enabled = false;}

if (x[7] == 2) {panel8->BackgroundImage = panel10->BackgroundImage;panel8->Enabled = false;}

if (x[8] == 1) {panel9->BackgroundImage = panel11->BackgroundImage;panel9->Enabled = false;}

if (x[8] == 2) {panel9->BackgroundImage = panel10->BackgroundImage;panel9->Enabled = false;}

}

private: bool winner (){// проверка победителя и блокировка всех оставшихся клеток.

//bool flag = false;

if (((x[0] == x[4])&&(x[4] == x[8])&&(x[0] == 2)) || ((x[2] == x[4])&&(x[4] == x[6])&&(x[2] == 2)) || ((x[0] == x[1])&&(x[1] == x[2])&&(x[0] == 2)) || ((x[3] == x[4])&&(x[4] == x[5])&&(x[3] == 2)) || ((x[6] == x[7])&&(x[7] == x[8])&&(x[6] == 2)) || ((x[0] == x[3])&&(x[3] == x[6])&&(x[0] == 2)) || ((x[1] == x[4])&&(x[4] == x[7])&&(x[1] == 2)) || ((x[2] == x[5])&&(x[5] == x[8])&&(x[2] == 2))){

if (lvl==1) { picturePo->Visible = true;}

else {picturePr->Visible = true;}

panel1->Enabled = false;

panel2->Enabled = false;

panel3->Enabled = false;

panel4->Enabled = false;

panel5->Enabled = false;

panel6->Enabled = false;

panel7->Enabled = false;

panel8->Enabled = false;

panel9->Enabled = false;

return true;

}

if (((x[0] == x[4])&&(x[4] == x[8])&&(x[0] == 1)) || ((x[2] == x[4])&&(x[4] == x[6])&&(x[2] == 1)) || ((x[0] == x[1])&&(x[1] == x[2])&&(x[0] == 1)) || ((x[3] == x[4])&&(x[4] == x[5])&&(x[3] == 1)) || ((x[6] == x[7])&&(x[7] == x[8])&&(x[6] == 1)) || ((x[0] == x[3])&&(x[3] == x[6])&&(x[0] == 1)) || ((x[1] == x[4])&&(x[4] == x[7])&&(x[1] == 1)) || ((x[2] == x[5])&&(x[5] == x[8])&&(x[2] == 1))){

if (lvl==1) { picturePx->Visible = true;}

else {picturePobeda->Visible = true;}

panel1->Enabled = false;

panel2->Enabled = false;

panel3->Enabled = false;

panel4->Enabled = false;

panel5->Enabled = false;

panel6->Enabled = false;

panel7->Enabled = false;

panel8->Enabled = false;

panel9->Enabled = false;

return true;

}_friend ();

}

private: void _friend (){

bool fr = true;

for (int i = 0; i < 9; i++) if (x[i] == 0) {fr = false; break;}

if (fr) { pictureN->Visible = true;}

}

private: void move (int n){// функция хода компьютера

flag = false;

x[n] = 1;

player = !player;

CrossZero ();

checkingArray ();

if (winner ()) {}

else {

for (int i = 0; i < 9; i++) if (x[i] == 0) flag = true;

if (flag){

if (lvl == 2)

x[low_level ()] = 2;

else

x[dif_level ()] = 2;

player = !player;

CrossZero ();

checkingArray ();

winner ();

}

}

}

private: System: Void button1_Click (System:Object^ sender, System: EventArgs^ e) {// новая игра

picturePx->Visible = false;

picturePo->Visible = false;

picturePobeda->Visible = false;

picturePr->Visible = false;

pictureN->Visible = false;

typeGame = comboBox1->Text;

if (typeGame == «»){

MessageBox:Show («Сначало выбери тип игры!»);

} else {

if (typeGame == «X против 0») lvl = 1;

if (typeGame == «1 уровень с компьютером») lvl = 2;

if (typeGame == «2 уровень с компьютером») lvl = 3;

CrossZero ();

player = true;

for (int i = 0; i < 9; i++) x[i] = 0;

panel1->BackgroundImage = panel12->BackgroundImage;

panel2->BackgroundImage = panel12->BackgroundImage;

panel3->BackgroundImage = panel12->BackgroundImage;

panel4->BackgroundImage = panel12->BackgroundImage;

panel5->BackgroundImage = panel12->BackgroundImage;

panel6->BackgroundImage = panel12->BackgroundImage;

panel7->BackgroundImage = panel12->BackgroundImage;

panel8->BackgroundImage = panel12->BackgroundImage;

panel9->BackgroundImage = panel12->BackgroundImage;

panel1->Enabled = true;

panel2->Enabled = true;

panel3->Enabled = true;

panel4->Enabled = true;

panel5->Enabled = true;

panel6->Enabled = true;

panel7->Enabled = true;

panel8->Enabled = true;

panel9->Enabled = true;

}

}

private: System: Void panel1_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

int n = 0;

if (lvl == 1){

if (player){

x[0] = 1;

} else {

x[0] = 2;

}

player = !player;

CrossZero ();

checkingArray ();

winner ();

} else if ((lvl == 2)||(lvl == 3)){

move (n);

}

}

private: System: Void panel2_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

int n = 1;

if (lvl == 1){

if (player){

x[1] = 1;

} else {

x[1] = 2;

}

player = !player;

CrossZero ();

checkingArray ();

winner ();

} else if ((lvl == 2)||(lvl == 3)){

move (n);

}

}

private: System: Void panel3_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

int n = 2;

if (lvl == 1){

if (player){

x[2] = 1;

} else {

x[2] = 2;

}

player = !player;

CrossZero ();

checkingArray ();

winner ();

} else if ((lvl == 2)||(lvl == 3)){

move (n);

}

}

private: System: Void panel4_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

int n = 3;

if (lvl == 1){

if (player){

x[3] = 1;

} else {

x[3] = 2;

}

player = !player;

CrossZero ();

checkingArray ();

winner ();

} else if ((lvl == 2)||(lvl == 3)){

move (n);

}

}

private: System: Void panel5_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

int n = 4;

if (lvl == 1){

if (player){

x[4] = 1;

} else {

x[4] = 2;

}

player = !player;

CrossZero ();

checkingArray ();

winner ();

} else if ((lvl == 2)||(lvl == 3)){

move (n);

}

}

private: System: Void panel6_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

int n = 5;

if (lvl == 1) {

if (player){

x[5] = 1;

} else {

x[5] = 2;

}

player = !player;

CrossZero ();

checkingArray ();

winner ();

} else if ((lvl == 2)||(lvl == 3)){

move (n);

}

}

private: System: Void panel7_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

int n = 6;

if (lvl == 1) {

if (player){

x[6] = 1;

} else {

x[6] = 2;

}

player = !player;

CrossZero ();

checkingArray ();

winner ();

} else if ((lvl == 2)||(lvl == 3)){

move (n);

}

}

private: System: Void panel8_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

int n = 7;

if (lvl == 1) {

if (player){

x[7] = 1;

} else {

x[7] = 2;

}

player = !player;

CrossZero ();

checkingArray ();

winner ();

} else if ((lvl == 2)||(lvl == 3)){

move (n);

}

}

private: System: Void panel9_MouseClick (System:Object^ sender, System: Windows:Forms:MouseEventArgs^ e) {

int n = 8;

if (lvl == 1) {

if (player){

x[8] = 1;

} else {

x[8] = 2;

}

player = !player;

CrossZero ();

checkingArray ();

winner ();

} else if ((lvl == 2)||(lvl == 3)){

move (n);

}

}

private: System: Void button2_Click (System:Object^ sender, System: EventArgs^ e) {

Close ();

}

private: System: Void picturePx_Click (System:Object^ sender, System: EventArgs^ e) {

picturePx->Visible = false;

}

private: System: Void picturePo_Click (System:Object^ sender, System: EventArgs^ e) {

picturePo->Visible = false;

}

private: System: Void picturePobeda_Click (System:Object^ sender, System: EventArgs^ e) {

picturePobeda->Visible = false;

}

private: System: Void picturePr_Click (System:Object^ sender, System: EventArgs^ e) {

picturePr->Visible = false;

}

private: System: Void pictureN_Click (System:Object^ sender, System: EventArgs^ e) {

pictureN->Visible = false;

}

};

}

Показать весь текст
Заполнить форму текущей работой