Search  
Always will be ready notify the world about expectations as easy as possible: job change page
17 апреля

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

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

Рассмотрим интересную задачу по разработке игры «Крестики Нолики» на языке 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;
    }
}
Similar
Aug 22, 2021
The following are a set of best practices for using the HttpClient object in .NET Core when communicating with web APIs. Note that probably not all practices would be recommended in all situations. There can always be good reasons to...
Nov 19, 2020
We will demonstrate how to setup Elasticsearch and learn how to write basics statements. You will learn about the structure, commands, tools in Elasticsearch API and get it up and running using standard settings. Introduction We will be talking about...
May 31, 2023
Author: Yohan Malshika
Understanding uow to use And and Or operators with Expression Trees As a C# developer, you may have come across scenarios where you need to build complex logical expressions dynamically based on user input or other dynamic factors. In such...
Jul 29
Author: C# Programming Obinna “Anderson” Asiegbulam
Introduction Open Data Protocol (OData) is a standard protocol for building and consuming RESTful APIs. It extends traditional REST-based data access techniques by providing a uniform way to expose, structure, and manipulate data. Originally developed by Microsoft, OData is widely...
Send message
Type
Email
Your name
*Message