Загрузка данных
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();
}
}
}