it Новости Разработка игры на C# WPF. Создаем игру без игрового движка
Разработка игры на C# WPF. Создаем игру без игрового движка

Разработка игры на C# WPF. Создаем игру без игрового движка

13 593
01 марта 2024 в 14:25

Разработка игр – увлекательный и познавательный процесс. Мы с вами создадим простую игру на базе языка C# с использованием технологии WPF для создания пользовательского интерфейса и дизайна.

Подготовка к разработке

Перед тем как начать, убедитесь, что у вас установлен Visual Studio, предпочтительно последней версии. Visual Studio Community обеспечит удобную среду разработки и все необходимые инструменты для создания проекта.

Курс изучения C#

Можете пройти наш бесплатный курс по изучению C#

Создание проекта

  1. Откройте Visual Studio и выберите "Create a new project" (Создать новый проект).
  2. В открывшемся окне выберите шаблон "WPF App (.NET Core)".
  3. Введите имя проекта и выберите место для его сохранения.
  4. Нажмите "Create" (Создать), чтобы создать новый проект.


Дизайн интерфейса

Теперь, когда проект создан, мы можем приступить к разработке дизайна игры. Откройте файл MainWindow.xaml, который представляет собой разметку пользовательского интерфейса.


Пример разметки XAML:

<Window x:Class="MyGame.MainWindow"
		xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		Title="My Game" Height="450" Width="800">
	<Grid>
		<!-- Ваш дизайн игры будет здесь -->
	</Grid>
</Window>

Это базовый шаблон окна WPF. Вы можете изменить его по своему усмотрению, добавив различные элементы управления, изображения, текст и т. д. Например, вы можете добавить кнопку для начала игры, изображение для фона игрового поля и другие элементы.


Создание игровой логики

После того как вы разработали дизайн интерфейса, пора приступить к созданию игровой логики. Для этого откройте файл «MainWindow.xaml.cs», который содержит код на C#, отвечающий за логику окна.


Пример кода C#:

using System.Windows;

namespace MyGame
{
	public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();
			InitializeGame();
		}

		private void InitializeGame()
		{
			// Инициализация игры
		}

		// Здесь вы можете добавить методы для обработки событий и другой игровой логики
	}
}

В методе InitializeGame() вы можете добавить код для инициализации игры, создания игровых объектов и другой начальной логики.


Запуск игры

Теперь, когда дизайн и игровая логика созданы, вы можете запустить проект, нажав кнопку "Start" (Запуск) в Visual Studio. После запуска вы увидите окно вашей игры и сможете начать тестировать её.


Игра Ктестики-Нолики

Безусловно, сейчас ваш проект будет выглядеть как некое пустое окно без дизайна и функций. Давайте допишем код в CS файл для создания игры на подобии Крестики-Нолики.


Пример простой реализации игры "крестики-нолики" на C# с использованием WPF:

using System.Windows;

namespace TicTacToe
{
	public partial class MainWindow : Window
	{
		private char[,] board; // Массив для представления игрового поля
		private char currentPlayer; // Текущий игрок (X или O)
		private bool gameEnded; // Переменная для отслеживания завершения игры

		public MainWindow()
		{
			InitializeComponent();
			StartGame();
		}

		private void StartGame()
		{
			board = new char[3, 3];
			currentPlayer = 'X';
			gameEnded = false;

			// Инициализация игрового поля и очистка отображения
			for (int row = 0; row < 3; row++)
			{
				for (int col = 0; col < 3; col++)
				{
					board[row, col] = '-';
					Button button = (Button)FindName("Button_" + row + col);
					button.Content = "";
					button.IsEnabled = true;
				}
			}
		}

		private void Button_Click(object sender, RoutedEventArgs e)
		{
			if (gameEnded)
				return;

			Button button = (Button)sender;
			string[] position = button.Name.Split('_');
			int row = int.Parse(position[1]);
			int col = int.Parse(position[2]);

			if (board[row, col] == '-')
			{
				board[row, col] = currentPlayer;
				button.Content = currentPlayer.ToString();

				if (CheckForWin())
				{
					MessageBox.Show(currentPlayer + " победил!");
					gameEnded = true;
				}
				else if (IsBoardFull())
				{
					MessageBox.Show("Ничья!");
					gameEnded = true;
				}
				else
					currentPlayer = (currentPlayer == 'X') ? 'O' : 'X';
			}
		}

		private bool CheckForWin()
		{
			// Проверка строк, столбцов и диагоналей на наличие трех одинаковых символов
			for (int i = 0; i < 3; i++)
			{
				if (board[i, 0] != '-' && board[i, 0] == board[i, 1] && board[i, 1] == board[i, 2])
					return true;
				if (board[0, i] != '-' && board[0, i] == board[1, i] && board[1, i] == board[2, i])
					return true;
			}

			if (board[0, 0] != '-' && board[0, 0] == board[1, 1] && board[1, 1] == board[2, 2])
				return true;
			if (board[0, 2] != '-' && board[0, 2] == board[1, 1] && board[1, 1] == board[2, 0])
				return true;

			return false;
		}

		private bool IsBoardFull()
		{
			// Проверка заполненности игрового поля
			for (int row = 0; row < 3; row++)
			{
				for (int col = 0; col < 3; col++)
				{
					if (board[row, col] == '-')
						return false;
				}
			}
			return true;
		}

		private void NewGame_Click(object sender, RoutedEventArgs e)
		{
			StartGame();
		}
	}
}

Помимо действий нужно также описать дизайн. Это мы уже сделаем в файле XAML:

<Window x:Class="TicTacToe.MainWindow"
		xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		Title="Tic Tac Toe" Height="300" Width="300">
	<Grid>
		<Grid.RowDefinitions>
			<RowDefinition Height="*" />
			<RowDefinition Height="*" />
			<RowDefinition Height="*" />
		</Grid.RowDefinitions>
		<Grid.ColumnDefinitions>
			<ColumnDefinition Width="*" />
			<ColumnDefinition Width="*" />
			<ColumnDefinition Width="*" />
		</Grid.ColumnDefinitions>

		<Button x:Name="Button_00" Grid.Row="0" Grid.Column="0" Click="Button_Click" FontSize="40"/>
		<Button x:Name="Button_01" Grid.Row="0" Grid.Column="1" Click="Button_Click" FontSize="40"/>
		<Button x:Name="Button_02" Grid.Row="0" Grid.Column="2" Click="Button_Click" FontSize="40"/>
		<Button x:Name="Button_10" Grid.Row="1" Grid.Column="0" Click="Button_Click" FontSize="40"/>
		<Button x:Name="Button_11" Grid.Row="1" Grid.Column="1" Click="Button_Click" FontSize="40"/>
		<Button x:Name="Button_12" Grid.Row="1" Grid.Column="2" Click="Button_Click" FontSize="40"/>
		<Button x:Name="Button_20" Grid.Row="2" Grid.Column="0" Click="Button_Click" FontSize="40"/>
		<Button x:Name="Button_21" Grid.Row="2" Grid.Column="1" Click="Button_Click" FontSize="40"/>
		<Button x:Name="Button_22" Grid.Row="2" Grid.Column="2" Click="Button_Click" FontSize="40"/>

		<Button Grid.Row="3" Grid.ColumnSpan="3" Click="NewGame_Click" Content="New Game" FontSize="20"/>
	</Grid>
</Window>

Курс изучения C#

Можете пройти наш бесплатный курс по изучению C#

Заключение

В этой статье мы создали простую, но полностью функциональную версию игры "крестики-нолики", используя язык программирования C# и технологию WPF для создания пользовательского интерфейса. Мы рассмотрели как разработать дизайн интерфейса, а также написали логику игры.


Хотя это только начало, и эту игру можно доработать и расширить. Например, вы можете добавить анимации для аттрактивного визуального эффекта, реализовать многопользовательский режим игры по сети, улучшить и оптимизировать код или добавить сложные алгоритмы искусственного интеллекта для игры против компьютера.


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

Больше интересных новостей

Комментарии (2)
Добавить комментарий

Антон 04 августа 2025 в 14:26

В таком виде не будет работать нормально. Нужно названия "кнопок" поменять, если разделитель "_" и добавить 4ю строку для кнопки "New Game". Но отслеживание нажатий, возможно, поправить. Но это не точно.
За подробностями - гугл в помощь)
Ответить

soleh 08 мая 2024 в 19:29

<Window x:Class="TicTacToe.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Tic Tac Toe" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<Button x:Name="Button_00" Grid.Row="0" Grid.Column="0" Click="Button_Click" FontSize="40"/>
<Button x:Name="Button_01" Grid.Row="0" Grid.Column="1" Click="Button_Click" FontSize="40"/>
<Button x:Name="Button_02" Grid.Row="0" Grid.Column="2" Click="Button_Click" FontSize="40"/>
<Button x:Name="Button_10" Grid.Row="1" Grid.Column="0" Click="Button_Click" FontSize="40"/>
<Button x:Name="Button_11" Grid.Row="1" Grid.Column="1" Click="Button_Click" FontSize="40"/>
<Button x:Name="Button_12" Grid.Row="1" Grid.Column="2" Click="Button_Click" FontSize="40"/>
<Button x:Name="Button_20" Grid.Row="2" Grid.Column="0" Click="Button_Click" FontSize="40"/>
<Button x:Name="Button_21" Grid.Row="2" Grid.Column="1" Click="Button_Click" FontSize="40"/>
<Button x:Name="Button_22" Grid.Row="2" Grid.Column="2" Click="Button_Click" FontSize="40"/>

<Button Grid.Row="3" Grid.ColumnSpan="3" Click="NewGame_Click" Content="New Game" FontSize="20"/>
</Grid>
</Window
Ответить