RU EN

Задача по языку C#: Игра «Крестики Нолики» в консоли

Задача по языку C#: Игра «Крестики Нолики» в консоли
Источник:
Просмотров:
2879
Задача по языку C#: Игра «Крестики Нолики» в консоли favorites 0

Рассмотрим интересную задачу по разработке игры «Крестики Нолики» на языке C#. Наш проект будет запускаться в консоли и потребует креативное мышление для решения задачи. 

Ваша задача — реализовать консольную игру "крестики-нолики" с использованием языка программирования C#. Вам нужно создать игровое поле, где два игрока могут поочередно делать ходы и ставить свои знаки ("X" или "O") в свободные ячейки поля. Игра должна продолжаться до тех пор, пока один из игроков не выиграет, заполнив вертикали, горизонтали или диагонали тремя своими знаками подряд, или пока не наступит ничья.

Требования:

  1. Используйте язык программирования C# для реализации игры.
  2. Создайте игровое поле 3x3, где каждая ячейка обозначена числом от 1 до 9.
  3. Реализуйте механизм поочередного хода двух игроков. Первый игрок ставит "X", второй — "O".
  4. Проверьте каждый ход на наличие выигрышной комбинации или наступление ничьи.
  5. Выводите на консоль текущее состояние игрового поля после каждого хода.

Пример реализации проекта:

Пример реализации проекта 

Подсказки:

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

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

Решение задачи

Для решения этой задачи вам потребуется задействовать следующий код:

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;
    }
}
Похожее
10 апреля 2024 г.
Vite.js - это один из инструментов для настройки сред разработки. Чаще всего используется в связке с фреймворками React и Vue. Однако функционал не ограничен только их поддержкой - инструмент способен работать даже с ванильным JavaScript, следовательно, и различными библиотеками, написанным...
Nov 12, 2020
Author: Joydip Kanjilal
Lazy initialization is a technique that defers the creation of an object until the first time it is needed. In other words, initialization of the object happens only on demand. Note that the terms lazy initialization and lazy instantiation mean...
Mar 13
Author: Sergey Drozdov
During development, sometimes you need to know the state of an object and what data it contains. Debug is not always suitable approach, sometimes it is more convenient to view the state of an object on a web page or...
24 марта 2024 г.
Автор: Олег Борисенков
Рассказываем какие существуют стили именования переменных и зачем они нужны. Чтобы обеспечить легкую читаемость кода программисты используют разные стили именования для разных типов объектов, функций и переменных. Именно поэтому нет какого-то одного «идеального» формата. Выбор уместного стиля поможет быстро понять...
Написать сообщение
Тип
Почта
Имя
*Сообщение