Как сделать крестики нолики в паскале

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Крестики-нолики онлайн.

Пакет бесплатных игр с игрой Крестики-нолики Силвермэна.

Пакет мобильных игр с игрой Крестики-нолики.

Крестики-нолики — весьма известная игра как у нас, так и в англоязычном мире, где она называется tic-tac-toe.

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

Bel&Chen Co — Программульки

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

Как выиграть в крестики-нолики? Вот первый интересный факт: крестики могут выиграть только, если первый ход сделают не на главную диагональ (которая проходит сверху-слева вправо-вниз), ходы на главную диагональ проигрывают. Для разбора позиций воспользуемся шахматной нотацией обозначения координат полей и ходов.
На рис. 1 ноликами обозначены все поля, ход на которые выигрывает после хода
1. a4
крестиками.


Рис. 1. Предположим, нолики ответили ходом
1. b4
Рассмотрим примерную партию после этого хода. Пусть крестики пошли
2. d1 (см. рис. 2.)
Рис. 2. Второй игрок в этой позиции может выиграть единственным ходом
2.

Напоследок — несколько позиций для самостоятельного решения. Игрок, чья очередь ходить, выигрывает единственным ходом.

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

Что еще можно сделать в программе?
Программа не воспроизводится оптимально обеими сторонами, потому что ходы выбираются случайным образом. Программу можно легко модифицировать, чтобы оба игрока играли оптимально (что подпадает под категорию искусственного интеллекта). Также программа может быть изменена так, что пользователь сам вводит данные (используя scanf () или cin).
Вышеуказанные изменения оставлены в качестве упражнения для читателей.

// Программа на C ++ для игры в крестики-нолики

using namespace std;


// Функция для отображения текущего статуса доски

void showBoard( char board[][SIDE])

printf ( "\t\t\t %c | %c | %c \n" , board[0][0],

printf ( "\t\t\t %c | %c | %c \n" , board[1][0],

printf ( "\t\t\t %c | %c | %c \n\n" , board[2][0],


// Функция для отображения инструкций

printf ( "\t\t\t Tic-Tac-Toe\n\n" );

printf ( "Choose a cell numbered from 1 to 9 as below"

printf ( "\t\t\t 1 | 2 | 3 \n" );

printf ( "\t\t\t 4 | 5 | 6 \n" );

printf ( "\t\t\t 7 | 8 | 9 \n\n" );


// Функция для инициализации игры

void initialise( char board[][SIDE], int moves[])

// Инициируем генератор случайных чисел так, чтобы

// та же конфигурация не возникает

srand ( time (NULL));

// изначально доска пуста

// Заполняем ходы числами

random_shuffle(moves, moves + SIDE*SIDE);


// Функция для объявления победителя игры

void declareWinner( int whoseTurn)

if (whoseTurn == COMPUTER)

printf ( "COMPUTER has won\n" );

printf ( "HUMAN has won\n" );


// Функция, которая возвращает true, если какая-либо строка
// пересекается с тем же ходом игрока

bool rowCrossed( char board[][SIDE])

if (board[i][0] == board[i][1] &&


// Функция, которая возвращает true, если какой-либо из столбцов
// пересекается с тем же ходом игрока

bool columnCrossed( char board[][SIDE])

if (board[0][i] == board[1][i] &&


// Функция, которая возвращает true, если любая из диагоналей
// пересекается с тем же ходом игрока

bool diagonalCrossed( char board[][SIDE])

if (board[0][0] == board[1][1] &&

if (board[0][2] == board[1][1] &&


// Функция, которая возвращает true, если игра окончена
// иначе он возвращает ложь

bool gameOver( char board[][SIDE])

return (rowCrossed(board) || columnCrossed(board)


// Функция для игры в крестики-нолики

void playTicTacToe( int whoseTurn)

// 3 * 3 Tic-Tac-Toe доска для игры

// Показать инструкции перед игрой

int moveIndex = 0, x, y;

// Продолжайте играть до конца игры

while (gameOver(board) == false &&

if (whoseTurn == COMPUTER)

x = moves[moveIndex] / SIDE;

y = moves[moveIndex] % SIDE;

printf ( "COMPUTER has put a %c in cell %d\n" ,

else if (whoseTurn == HUMAN)

x = moves[moveIndex] / SIDE;

y = moves[moveIndex] % SIDE;

printf ( "HUMAN has put a %c in cell %d\n" ,

// Если игра нарисована

if (gameOver(board) == false &&

moveIndex == SIDE * SIDE)

printf ( "It's a draw\n" );

// Переключение пользователя для объявления фактического

if (whoseTurn == COMPUTER)

else if (whoseTurn == HUMAN)

// Давайте поиграем в игру с компьютером, начинающимся первым

Интересный вариант этой игры
Как сказано выше, если два опытных игрока играют в крестики-нолики, игра всегда будет вничью.
Существует еще один вирусный вариант этой игры — Ultimate Tic-Tac-Toe, цель которого — сделать обычный Tic-Tac-Toe более интересным и менее предсказуемым.
Посмотрите на игру здесь — Link1 Link2

В вышеприведенной статье реализованы простые крестики-нолики, в которых движения выполняются случайным образом. Пожалуйста, обратитесь к статье ниже, чтобы увидеть, как сделать оптимальные шаги.
Минимаксный алгоритм в теории игр | Набор 3 (Tic-Tac-Toe AI — Поиск оптимального хода)

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

Репутация: 0

Пришло время курсовика. Необходимо написать игру крестики-нолики на поле размером 19X19 (возможность игры с ПК и с соперником ).Хотел проконсультироваться со знающими людьми, могет кто посоветует какой лучше алгоритм взять за основу, могет имеется какая-нить оценочная функция или что-то вроде того.

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

Function getStep(pos:array[0..18] of array[0..18] of byte):integer; //возвращает ячейку, куда нужно походить, резултат хода при лучшем ходе игрока или другую информацию.

Если комп проиграл, то вернуть "Проиграно"
Если комп выиграл, то вернуть "Победа"
Если ничья, то вернуть "Ничья"

Для каждой пустой ячейки делать
поставить крестик в ячейку;
Для каждой пустой ячейки делать
поставить нолик в ячейку;
вызвать GetStep для полученной позиции и запомнить результат;
end;
Если все запомненные значения означают "проигрыш или ничью", то перейти к след. такту;
Ессли все запомненные значения означают "выигрыш", то ход найден.
end;

Дож, ты представляешь глубину рекурсии (даже при условии отсечения заведомо ненужных вариантов) и заторможенность программы?

Ты никогда не пробовал, например, работать с шахматными фигурами НЕ на доске 8*8, а, скажем, на доске 12*12? А тут все-же 19*19.

Репутация: 0

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


нач.
ЕСЛИ не опасно то
нач.
Найти самую длинную комбинацию(ДЛ_комб);
если комбинация существует то
нач.
Найти в ДЛ_комб подходящее поле; //Рассматриваем строку ДЛ_комб
Поставить фигуру;
Передать ход;
кон.
иначе
нач.
Найти подходящее поле. //Рассматриваем всё поле
Поставить фигуру;
Передать ход;
кон.
кон.
ИНАЧЕ
нач.
Вычленить опасную строку;
Найти в ней пустую клетку;
Поставить туда фигуру;
Передать ход;
кон.

Репутация: 0

ОК, Дальше - больше.
Интересно как найти подходящее поле?
Вот как я решил этот вопрос.
Введем новые, мои любимые , понятия:
Рейтинг - Количество твоих фигур в комбинациях, пересекающихся в этой клетке.
Выход - Строка содержащая рассматриваемую клетку, но не содержащая фигур противника.

1. Наиболее подходящей будет центральная клетка. В ней пересекаются 4 строки.
2. Угловая клетка на втором месте. Там - 3 строки.
3. В остальных клетках пересекаются по 2 строки.

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

Джаноян Елена Владимировна

Искусственный интеллект (ИИ, англ. Artificialintelligence, AI) — наука и технология создания интеллектуальных машин, особенно интеллектуальных компьютерных программ. ИИ связан со сходной задачей использования компьютеров для понимания человеческого интеллекта, но не обязательно ограничивается биологически правдоподобными методами.

В работе описан интерфейс игры, алгоритм программы.

ВложениеРазмер
krestiki-noliki.docx 121.42 КБ

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

Тема: «Как научить компьютер играть в «Крестики-

Джиджоев Владислав Муратович

Джаноян Елена Владимировна,

Описание интерфейса игры……………………………………………… 5

Описание алгоритма игры ………………………………………………. 6

Обычно по завершении партии выигравшая сторона зачёркивает чертой свои три знака (нолика или крестика), составляющих сплошной ряд.

Вот некоторые стратегии игры:

Искусственный интеллект (ИИ, англ. Artificialintelligence, AI) — наука и технология создания интеллектуальных машин, особенно интеллектуальных компьютерных программ. ИИ связан со сходной задачей использования компьютеров для понимания человеческого интеллекта, но не обязательно ограничивается биологически правдоподобными методами.[2]

FreePascalCompiler (FPC) - это свободно распространяемый компилятор языка Паскаль с открытыми исходными кодами. Он совместим с BorlandPascal 7 и ObjectPascal – Delphi, но при этом обладает рядом дополнительных возможностей, например, поддерживает перегрузку операторов. [3]

Описание интерфейса игры

Если было выбрано 2 игрока, то в игре участвуют два человека.

Если был выбран 1 игрок, то человек играет с компьютером.

Причем, при игре с компьютером есть возможность выбора сложности игры.

Для хода игрока необходимо указать номер столбика и номер строки. Отсчет производится с верхнего левого угла.

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

Описание алгоритма игры

В простом режиме компьютер сделает ходы на первую попавшуюся пустую клетку.

Читайте также: