Загрузка данных


using System;
using System.Drawing;
using System.Windows.Forms;

namespace TicTacToe
{
    public partial class Form1 : Form
    {
        private readonly char[,] field = new char[3, 3];
        private bool isCrossTurn = true;
        private int moveCount = 0;

        private readonly Panel[,] panels = new Panel[3, 3];
        private Label labelStatus;
        private Button buttonNewGame;

        public Form1()
        {
            Text = "Крестики-нолики";
            ClientSize = new Size(450, 550);
            StartPosition = FormStartPosition.CenterScreen;
            MinimumSize = new Size(350, 450);

            // Главный контейнер: статус, поле, кнопка
            var main = new TableLayoutPanel
            {
                Dock = DockStyle.Fill,
                RowCount = 3,
                ColumnCount = 1
            };
            main.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
            main.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
            main.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
            Controls.Add(main);

            // Статус
            labelStatus = new Label
            {
                Dock = DockStyle.Fill,
                TextAlign = ContentAlignment.MiddleCenter,
                Font = new Font("Arial", 16F, FontStyle.Bold)
            };
            main.Controls.Add(labelStatus, 0, 0);

            // Игровое поле 3x3
            var board = new TableLayoutPanel
            {
                Dock = DockStyle.Fill,
                RowCount = 3,
                ColumnCount = 3
            };

            for (int i = 0; i < 3; i++)
            {
                board.RowStyles.Add(new RowStyle(SizeType.Percent, 33.33F));
                board.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.33F));
            }

            main.Controls.Add(board, 0, 1);

            // Кнопка новой игры
            buttonNewGame = new Button
            {
                Dock = DockStyle.Fill,
                Text = "Новая игра",
                Font = new Font("Arial", 12F, FontStyle.Regular)
            };
            buttonNewGame.Click += buttonNewGame_Click;
            main.Controls.Add(buttonNewGame, 0, 2);

            // Создание 9 панелей
            for (int row = 0; row < 3; row++)
            {
                for (int col = 0; col < 3; col++)
                {
                    var panel = new Panel
                    {
                        Name = $"panel_{row}_{col}",
                        Dock = DockStyle.Fill,
                        Margin = new Padding(5),
                        BackColor = Color.WhiteSmoke,
                        Cursor = Cursors.Hand
                    };

                    panel.Click += Panel_Click;
                    panels[row, col] = panel;
                    board.Controls.Add(panel, col, row);
                }
            }

            StartNewGame();
        }

        // Начало новой игры
        private void StartNewGame()
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    field[i, j] = ' ';
                }
            }

            isCrossTurn = true;
            moveCount = 0;
            labelStatus.Text = "Ход крестиков";
            UpdateUI();
        }

        // Очистка панелей
        private void UpdateUI()
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    panels[i, j].Controls.Clear();
                    panels[i, j].BackColor = Color.WhiteSmoke;
                }
            }
        }

        // Обработка клика по панели
        private void Panel_Click(object sender, EventArgs e)
        {
            if (!(sender is Panel clickedPanel))
                return;

            string[] coords = clickedPanel.Name.Split('_');

            if (coords.Length != 3)
                return;

            int row = int.Parse(coords[1]);
            int col = int.Parse(coords[2]);

            // Если клетка занята или игра уже закончена — ничего не делаем
            if (field[row, col] != ' ' || !labelStatus.Text.Contains("Ход"))
                return;

            field[row, col] = isCrossTurn ? 'X' : 'O';
            moveCount++;

            // Рисуем X или O
            clickedPanel.Controls.Clear();

            var symbol = new Label
            {
                Text = isCrossTurn ? "X" : "O",
                Dock = DockStyle.Fill,
                TextAlign = ContentAlignment.MiddleCenter,
                Font = new Font("Arial", 48F, FontStyle.Bold),
                ForeColor = isCrossTurn ? Color.RoyalBlue : Color.Crimson
            };

            clickedPanel.Controls.Add(symbol);

            // Проверка победы / ничьей
            if (CheckWin())
            {
                labelStatus.Text = $"Победили {(isCrossTurn ? "крестики" : "нолики")}!";
            }
            else if (moveCount == 9)
            {
                labelStatus.Text = "Ничья!";
            }
            else
            {
                isCrossTurn = !isCrossTurn;
                labelStatus.Text = $"Ход {(isCrossTurn ? "крестиков" : "ноликов")}";
            }
        }

        // Проверка 8 выигрышных линий
        private bool CheckWin()
        {
            // Строки и столбцы
            for (int i = 0; i < 3; i++)
            {
                if (field[i, 0] != ' ' &&
                    field[i, 0] == field[i, 1] &&
                    field[i, 1] == field[i, 2])
                    return true;

                if (field[0, i] != ' ' &&
                    field[0, i] == field[1, i] &&
                    field[1, i] == field[2, i])
                    return true;
            }

            // Главная диагональ
            if (field[0, 0] != ' ' &&
                field[0, 0] == field[1, 1] &&
                field[1, 1] == field[2, 2])
                return true;

            // Побочная диагональ
            if (field[0, 2] != ' ' &&
                field[0, 2] == field[1, 1] &&
                field[1, 1] == field[2, 0])
                return true;

            return false;
        }

        private void buttonNewGame_Click(object sender, EventArgs e)
        {
            StartNewGame();
        }
    }
}