Рассмотрим интересную задачу по разработке игры «Крестики Нолики» на языке C#. Наш проект будет запускаться в консоли и потребует креативное мышление для решения задачи.
Ваша задача — реализовать консольную игру "крестики-нолики" с использованием языка программирования C#. Вам нужно создать игровое поле, где два игрока могут поочередно делать ходы и ставить свои знаки ("X" или "O") в свободные ячейки поля. Игра должна продолжаться до тех пор, пока один из игроков не выиграет, заполнив вертикали, горизонтали или диагонали тремя своими знаками подряд, или пока не наступит ничья.
Требования:
- Используйте язык программирования C# для реализации игры.
- Создайте игровое поле 3x3, где каждая ячейка обозначена числом от 1 до 9.
- Реализуйте механизм поочередного хода двух игроков. Первый игрок ставит "X", второй — "O".
- Проверьте каждый ход на наличие выигрышной комбинации или наступление ничьи.
- Выводите на консоль текущее состояние игрового поля после каждого хода.
Пример реализации проекта:
Подсказки:
- Используйте массив для представления игрового поля.
- Реализуйте функции для отображения текущего состояния поля, проверки на выигрыш и проверки на ничью.
- Используйте цикл для поочередного хода каждого игрока.
- Обеспечьте проверку корректности ввода номера ячейки и наличия свободного места перед каждым ходом.
Это задание позволит вам применить навыки работы с массивами, условиями, циклами и функциями на практике, а также создать простую, но функциональную консольную игру.
Решение задачи
Для решения этой задачи вам потребуется задействовать следующий код:
using System;
class TicTacToe
{
static char[] board = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
static int currentPlayer = 1; // 1 - крестики, 2 - нолики
static void Main()
{
int choice;
bool validInput;
do
{
Console.Clear();
DrawBoard();
Console.WriteLine($"Игрок {currentPlayer}, введите номер ячейки:");
// Проверяем корректность ввода: число от 1 до 9, и ячейка не должна быть занята
validInput = int.TryParse(Console.ReadLine(), out choice) && choice >= 1 && choice <= 9 && board[choice - 1] != 'X' && board[choice - 1] != 'O';
if (validInput)
{
// Заполняем ячейку текущим символом (X или O)
board[choice - 1] = (currentPlayer == 1) ? 'X' : 'O';
// Проверяем на наличие выигрышной комбинации
if (CheckForWin())
{
Console.Clear();
DrawBoard();
Console.WriteLine($"Победил игрок {currentPlayer}!");
break;
}
// Проверяем на наступление ничьей
if (CheckForDraw())
{
Console.Clear();
DrawBoard();
Console.WriteLine("Ничья!");
break;
}
// Меняем текущего игрока
currentPlayer = (currentPlayer == 1) ? 2 : 1;
}
else
Console.WriteLine("Некорректный ввод. Попробуйте снова.");
} while (true);
}
// Выводим текущее состояние игрового поля
static void DrawBoard()
{
Console.WriteLine($" {board[0]} | {board[1]} | {board[2]} ");
Console.WriteLine("-----------");
Console.WriteLine($" {board[3]} | {board[4]} | {board[5]} ");
Console.WriteLine("-----------");
Console.WriteLine($" {board[6]} | {board[7]} | {board[8]} ");
}
// Проверяем на выигрыш
static bool CheckForWin()
{
return (board[0] == board[1] && board[1] == board[2]) ||
(board[3] == board[4] && board[4] == board[5]) ||
(board[6] == board[7] && board[7] == board[8]) ||
(board[0] == board[3] && board[3] == board[6]) ||
(board[1] == board[4] && board[4] == board[7]) ||
(board[2] == board[5] && board[5] == board[8]) ||
(board[0] == board[4] && board[4] == board[8]) ||
(board[2] == board[4] && board[4] == board[6]);
}
// Проверяем на ничью
static bool CheckForDraw()
{
// Проверяем, остались ли свободные ячейки
foreach (char cell in board)
{
if (cell != 'X' && cell != 'O')
return false;
}
return true;
}
}