Создание игры «Крестики-нолики» на C++

Sozdanie Igry Krestiki Noliki Na C



Крестики-нолики — интересная, старая и классическая игра, развлекавшая поколения. В игре «крестики-нолики» два игрока соревнуются на сетке из 9 клеток, отмеченной решёткой. Каждый игрок делает свой ход и помещает символ (O или X) в один из пустых квадратов. В этой статье мы рассмотрим, как создать игру «крестики-нолики» на языке программирования C++. Следующий пример поможет вам создать простую, но увлекательную игру «Крестики-нолики», охватывая основные концепции, структуру кода и соображения по созданию интерактивного игрового процесса.

Создайте игру «Крестики-нолики» на C++

В следующем примере представлены основы создания этой интерактивной игры «крестики-нолики» для двух игроков. Он демонстрирует простой и легкий подход к программированию на C++ и предоставляет хорошо документированный исходный код, позволяющий пережить детские трудности с друзьями в новом цифровом формате. Давайте посмотрим следующий код.

Пример: базовая консольная игра «Крестики-нолики» без использования 2D-массива

В этом примере мы будем использовать 2D-массив, функции и условия if-else, чтобы создать игру «крестики-нолики» на C++. В этой игре двум игрокам разрешено по очереди вводить свои ходы, и состояние игры определяется путем проверки победителя или ничьей. См. следующий код:







#include

использование пространства имен std ;

пустота доска для рисования ( голец доска [ 3 ] [ 3 ] ) ;

bool isMoveValid ( голец доска [ 3 ] [ 3 ] , интервал ряд , интервал столбец ) ;

bool isBoardFull ( голец доска [ 3 ] [ 3 ] ) ;

голец checkWinner ( голец доска [ 3 ] [ 3 ] ) ;

интервал основной ( ) {

голец доска [ 3 ] [ 3 ] '=' { { '' , '' , '' } , { '' , '' , '' } , { '' , '' , '' } } ;

интервал ряд , столбец ;

голец текущий игрок '=' 'ИКС' ;

пока ( истинный ) {

доска для рисования ( доска ) ;

расчет << «Игрок» << текущий игрок << '. Введите строку (1–3) и столбец (1–3): ' ;

принимать пищу >> ряд >> столбец ;

ряд --;

столбец --;

если ( isMoveValid ( доска , ряд , столбец ) ) {

доска [ ряд ] [ столбец ] '=' текущий игрок ;

голец победитель '=' checkWinner ( доска ) ;

если ( победитель '=' '' ) {

доска для рисования ( доска ) ;

расчет << «Игрок» << победитель << '-победитель! \п ' ;

перерыв ;

}

если ( isBoardFull ( доска ) ) {

доска для рисования ( доска ) ;

расчет << 'Это галстук! \п ' ;

перерыв ;

}

текущий игрок '=' ( текущий игрок == 'ИКС' ) ? 'О' : 'ИКС' ;

} еще {

расчет << «Неверный ход. Выберите другую ячейку. \п ' ;

} }

возвращаться 0 ;

}

пустота доска для рисования ( голец доска [ 3 ] [ 3 ] ) {

расчет << 'б | \ т 1 \ т | \ т 2 \ т | \ т 3 \ т | \п ' ;

расчет << ' ______________________ \п ' ;

для ( интервал м '=' 0 ; м < 3 ; м ++ ) {

расчет << м + 1 << '| ' ;

для ( интервал т '=' 0 ; т < 3 ; т ++ ) {

расчет << '' << доска [ м ] [ т ] ;

если ( т < 2 ) расчет << ' \ т | \ т ' ;

}

расчет << ' \ т | \п ' ;

если ( м < 2 ) расчет << ' ______________________ \п ' ;

}

расчет << ' \п ' ; }

bool isMoveValid ( голец доска [ 3 ] [ 3 ] , интервал ряд , интервал столбец ) {

возвращаться ( ряд >= 0 && ряд < 3 && столбец >= 0 && столбец < 3 && доска [ ряд ] [ столбец ] == '' ) ;

}

bool isBoardFull ( голец доска [ 3 ] [ 3 ] ) {

для ( интервал м '=' 0 ; м < 3 ; м ++ ) {

для ( интервал т '=' 0 ; т < 3 ; т ++ ) {

если ( доска [ м ] [ т ] == '' ) {

возвращаться ЛОЖЬ ;

} } }

возвращаться истинный ; }

голец checkWinner ( голец доска [ 3 ] [ 3 ] ) {

для ( интервал м '=' 0 ; м < 3 ; м ++ ) {

если ( доска [ м ] [ 0 ] == доска [ м ] [ 1 ] && доска [ м ] [ 1 ] == доска [ м ] [ 2 ] && доска [ м ] [ 0 ] '=' '' ) {

возвращаться доска [ м ] [ 0 ] ;

}

если ( доска [ 0 ] [ м ] == доска [ 1 ] [ м ] && доска [ 1 ] [ м ] == доска [ 2 ] [ м ] && доска [ 0 ] [ м ] '=' '' ) {

возвращаться доска [ 0 ] [ м ] ;

} }

если ( доска [ 0 ] [ 0 ] == доска [ 1 ] [ 1 ] && доска [ 1 ] [ 1 ] == доска [ 2 ] [ 2 ] && доска [ 0 ] [ 0 ] '=' '' ) {

возвращаться доска [ 0 ] [ 0 ] ;

}

если ( доска [ 0 ] [ 2 ] == доска [ 1 ] [ 1 ] && доска [ 1 ] [ 1 ] == доска [ 2 ] [ 0 ] && доска [ 0 ] [ 2 ] '=' '' ) {

возвращаться доска [ 0 ] [ 2 ] ;

}

возвращаться '' ;

}

Вот разбивка его функциональности:



«#include » — это директива препроцессора, которая включает библиотеку потоков ввода-вывода для операций ввода-вывода. Использование «пространства имен std» позволяет напрямую использовать функции cout, cin и т. д. в программе C++, не требуя префикса «std::».



В этой программе есть четыре прототипа функций: drawBoard(), isMoveValid(), isBoardFull() и checkWinner(). Объявление функции называется прототипом функции. Хотя в программе он идет после основной функции, он будет использоваться. Основная функция содержит игровой цикл и логику для управления ходами и движениями игроков. В основной функции игровое поле инициализируется пробелами.





голец доска [ 3 ] [ 3 ] '=' { { '' , '' , '' } , { '' , '' , '' } , { '' , '' , '' } } ;

После этого определяются две переменные row и col для хранения входных данных о движении игрока. «char currentPlayer = ‘X’;» определяет, что игрок «X» ходит первым.

Теперь запускается игровой цикл while (true), который выполняется до тех пор, пока не будет выявлен победитель или ничья. Этот цикл «пока» вызывает «drawBoard();» для отображения доски. После отображения доски на консоли пользователю предлагается выбрать ячейку для пометки в следующем операторе кода:



расчет << «Игрок» << текущий игрок << ' очередь. Введите строку и столбец (1-3): ' ;

Игрок вводит свой ход в поле «cin >> row >> col;».

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

доска [ ряд ] [ столбец ] '=' текущий игрок ;

Этот оператор помещает отметку игрока на доску.

голец победитель '=' checkWinner ( доска ) ;

если ( победитель '=' '' ) {

доска для рисования ( доска ) ;

расчет << «Игрок» << победитель << «победит! \п ' ;

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

если ( isBoardFull ( доска ) ) {

Этот оператор проверяет наличие связи. Условие ничьи возникает в случае, когда доска заполнена и победителя нет. В данном случае: «Ничья!» печатается на экране.

текущий игрок '=' ( текущий игрок == 'ИКС' ) ? 'О' : 'ИКС' ;

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

расчет << «Неверный ход. Выберите другую ячейку. \п ' ;

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

После «основной» функции начнутся определения функций для ранее объявленных прототипов функций. Первая функция, определенная здесь, — это drawBoard(), которая используется для рисования доски «крестики-нолики» на консоли. Функция drawBoard() распечатывает текущее состояние доски, включая линии сетки.

Следующая функция, определенная здесь, — isMoveValid(). Эта функция используется для определения, разрешен ли ход как внутри доски, так и на пустой клетке. Функция isBoardFull() используется для проверки того, заполнена ли доска. Это условие ничьей, когда победителя нет. isBoardFull() проверяет, заполнены ли все позиции на доске, что указывает на ничью, если победителя нет. Если есть победитель, его можно определить с помощью функции checkWinner(). Функция checkWinner() проверяет все потенциальные выигрышные линии на предмет одной и той же отметки игрока («X» или «O») и возвращает отметку победившего игрока, если она найдена, или символ пробела «», если победителя еще нет. Ниже приводится вывод программы. Он показывает каждый ход каждого игрока.

Во-первых, доска ясна; игроку «X» предлагается выбрать ячейку, которую нужно пометить. Здесь игрок «X» вводит 2 и 2. Клетки строки 2 и столбца 2 отмечены. Обратитесь к отмеченной доске ниже:

Теперь очередь игрока О. Игроку предлагается выбрать ячейку для пометки. Игрок «О» выбирает 1 для строки и 1 для столбца. Выбранная ячейка помечена для игрока «O», как показано в следующем фрагменте вывода:

Все ходы каждого игрока будут проходить по одной и той же схеме. Наступает очередь игрока X, и он выбирает 1 для строки и 2 для столбца. Обратитесь к следующим снимкам выходных данных:

Теперь очередь за игроком «О». Игрок выбирает 1 для строки и 3 для столбца.

Следующий ход снова за игроком «X». Игрок выбирает 3 для строки и 1 для столбца.

Игрок «О» выбирает 3 для строки и 2 для столбца.

Игрок «X» выбирает вторую строку и третий столбец.

Игрок «О» теперь выбирает вторую строку и первый столбец.

На этот раз игрок «X» выбирает третью строку и третий столбец.

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

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

Заключение

Разработка игры «крестики-нолики» с использованием C++ — отличное практическое упражнение для закрепления ваших навыков программирования. В статье подробно объясняется, как создать крестики-нолики на C++. Пошаговое руководство, представленное в этой статье, включает в себя двумерный массив, функции и условия if-else, позволяющие читателям понять игровую механику, взаимодействие с пользователем и эффективное структурирование кода. Подробное описание кода и объяснение функций, имеющих решающее значение для основного игрового процесса, дают читателям бесценную информацию как о методах программирования на C++, так и о тонкостях разработки простых игр.