Найти в Дзене
KNL Games

Статья и исходный код Игра в 15 на C# в Windows Forms

Введение «Игра в 15», также известная как «Пятнашки», является классической головоломкой, в которой игроку нужно упорядочить перемешанные фишки с числами от 1 до 15 на поле размером 4x4. В этой статье мы рассмотрим, как создать такую игру с использованием языка программирования C# и среды разработки Windows Forms. Шаг 1: создание проекта Шаг 2: разработка интерфейса Код: using System; using System.Windows.Forms; using System.Drawing; partial class FormGame { private MenuStrip menuStrip; private ToolStripMenuItem ToolStripMenuItem; private TableLayoutPanel tableLayoutPanel; private Button[] btn = new Button[16]; private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormGame)); menuStrip = n

Введение

«Игра в 15», также известная как «Пятнашки», является классической головоломкой, в которой игроку нужно упорядочить перемешанные фишки с числами от 1 до 15 на поле размером 4x4. В этой статье мы рассмотрим, как создать такую игру с использованием языка программирования C# и среды разработки Windows Forms.

Шаг 1: создание проекта

  1. Откройте Visual Studio и создайте новый проект Windows Forms.
  2. Выберите шаблон «Windows Forms App» и укажите имя проекта.
  3. Добавьте на форму необходимые элементы управления, такие как кнопки или метки, которые будут представлять фишки игры.

Шаг 2: разработка интерфейса

  1. Разместите элементы управления на форме так, чтобы они образовали сетку 4x4.
  2. Задайте размеры и расположение элементов управления, чтобы они были одинаковыми и равномерно распределёнными по форме.
  3. Добавьте обработчики событий для элементов управления, чтобы реагировать на действия пользователя.

Код:

using System;

using System.Windows.Forms;

using System.Drawing;

partial class FormGame

{

private MenuStrip menuStrip;

private ToolStripMenuItem ToolStripMenuItem;

private TableLayoutPanel tableLayoutPanel;

private Button[] btn = new Button[16];

private System.ComponentModel.IContainer components = null;

protected override void Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

private void InitializeComponent()

{

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormGame));

menuStrip = new MenuStrip();

ToolStripMenuItem = new ToolStripMenuItem();

tableLayoutPanel = new TableLayoutPanel();

menuStrip.Items.AddRange(new ToolStripItem[] {

ToolStripMenuItem});

menuStrip.Location = new Point(0, 0);

menuStrip.Name = "menuStrip1";

menuStrip.Size = new Size(384, 24);

menuStrip.TabIndex = 0;

menuStrip.Text = "menuStrip1";

ToolStripMenuItem.Name = "ToolStripMenuItem";

ToolStripMenuItem.Size = new Size(86, 20);

ToolStripMenuItem.Text = "Начать игру";

ToolStripMenuItem.Click += new EventHandler(ToolStripMenuItemClick);

tableLayoutPanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;

tableLayoutPanel.ColumnCount = 4;

tableLayoutPanel.RowCount = 4;

tableLayoutPanel.Dock = DockStyle.Fill;

tableLayoutPanel.Location = new Point(0, 24);

tableLayoutPanel.Name = "tableLayoutPanel";

int a = 0;

while (a < 4)

{

tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));

tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));

a++;

}

InitializingButtons(btn);

tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));

tableLayoutPanel.Size = new Size(384, 337);

tableLayoutPanel.TabIndex = 1;

AutoScaleDimensions = new SizeF(6F, 13F);

FormBorderStyle = FormBorderStyle.Fixed3D;

MaximizeBox = false;

AutoScaleMode = AutoScaleMode.Font;

ClientSize = new Size(384, 361);

Controls.Add(this.tableLayoutPanel);

Controls.Add(this.menuStrip);

MainMenuStrip = this.menuStrip;

Name = "Игра пятнашки";

StartPosition = FormStartPosition.CenterScreen;

Text = "Игра пятнашки";

Load += new EventHandler(this.GameLoad);

menuStrip.ResumeLayout(false);

menuStrip.PerformLayout();

tableLayoutPanel.ResumeLayout(false);

ResumeLayout(false);

PerformLayout();

}

private void InitializingButtons(Button[] button)

{

for(int i = button.Length - 1; i >= 0; i--)

{

button[i] = new Button();

button[i].Dock = DockStyle.Fill;

button[i].Font = new Font("Tahoma", 27.75F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(204)));

button[i].ForeColor = Color.Blue;

button[i].Name = "button" + i;

button[i].Size = new Size(88, 77);

button[i].TabIndex = i;

button[i].Tag = "" + i;

button[i].Text = "-";

button[i].UseVisualStyleBackColor = true;

button[i].Click += new EventHandler(ButtonClick);

}

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

{

int buttonIndex = (3 - i) * 4 + j;

tableLayoutPanel.Controls.Add(button[buttonIndex], j, 3 - i);

}

}

}

}

using System;

using System.Windows.Forms;

public partial class FormGame : Form

{

Game game;

public FormGame()

{

InitializeComponent();

game = new Game(4);

}

private void GameLoad(object sender, EventArgs e)

{

StartGame();

}

private void StartGame()

{

game.Start();

game.MixTails();

RefreshTiles();

}

private void ButtonClick(object sender, EventArgs e)

{

int temp = Convert.ToInt16(((Button)sender).Tag);

game.SwapTails(temp);

ButtonPos(temp).Focus();

RefreshTiles();

ButtonPos(temp).Focus();

if (game.CheckToEndGame())

MessageBox.Show("Поздравляем! Вы выиграли!", "Пятнашки");

}

private Button ButtonPos(int pos)

{

switch (pos)

{

case 0: return btn[0];

case 1: return btn[1];

case 2: return btn[2];

case 3: return btn[3];

case 4: return btn[4];

case 5: return btn[5];

case 6: return btn[6];

case 7: return btn[7];

case 8: return btn[8];

case 9: return btn[9];

case 10: return btn[10];

case 11: return btn[11];

case 12: return btn[12];

case 13: return btn[13];

case 14: return btn[14];

case 15: return btn[15];

default: return null;

}

}

private void ToolStripMenuItemClick(object sender, EventArgs e)

{

StartGame();

}

private void RefreshTiles()

{

for (int p = 0; p < 16; p++)

{

int nmb = game.GetNumber(p);

ButtonPos(p).Text = nmb.ToString();

ButtonPos(p).Visible = (nmb > 0);

}

}

}

Шаг 3: реализация логики игры

  1. Создайте двумерный массив для представления поля игры.
  2. Инициализируйте массив случайными числами от 1 до 15 и одной пустой ячейкой.
  3. Реализуйте алгоритм перемешивания фишек, чтобы создать начальную конфигурацию игры.
  4. Напишите код для обработки перемещений фишек при кликах пользователя.
  5. Проверьте, достигнута ли победа, когда фишки упорядочены правильно.

using System;

using System.Linq;

class Game

{

int _size;

int[,] field;

int spaceX, spaceY;

public int[] numbInMass = new int[16];

public int[] rightNumb = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0 };

static Random rand = new Random();

public Game(int size)

{

if (size < 2)

size = 2;

if (size > 5)

size = 5;

_size = size;

field = new int[size, size];

}

public void Start()

{

int z = 0;

for (int x = 0; x < _size; x++)

{

for (int y = 0; y < _size; y++)

{

field[x, y] = CoordsToPosition(x, y) + 1;

rightNumb[z] = field[x, y];

z++;

}

}

spaceX = _size - 1;

spaceY = _size - 1;

field[spaceX, spaceY] = 0;

rightNumb[15] = 0;

}

public int GetNumber(int pos)

{

int x, y;

PositionToCoords(pos, out x, out y);

if (x < 0 || x >= _size)

return 0;

if (y < 0 || y >= _size)

return 0;

return field[x, y];

}

public void InsertTail(int index)

{

int x, y;

PositionToCoords(index, out x, out y);

field[x, y] = 0;

}

public void MixTails()

{

for (int i = 0; i < 1000000; i++)

SwapTails(rand.Next(0, 16));

}

public void SwapTails(int index)

{

int x, y, xNew, yNew, tempCurrent;

PositionToCoords(index, out x, out y);

tempCurrent = field[x, y];

xNew = spaceX;

yNew = spaceY;

if (spaceX == x & (spaceY + 1 == y || spaceY - 1 == y))

{

spaceX = x;

spaceY = y;

field[spaceX, spaceY] = 0;

field[xNew, yNew] = tempCurrent;

}

else if (spaceY == y & (spaceX + 1 == x || spaceX - 1 == x))

{

spaceX = x;

spaceY = y;

field[spaceX, spaceY] = 0;

field[xNew, yNew] = tempCurrent;

}

}

public bool CheckToEndGame()

{

int z = 0;

for (int x = 0; x < _size; x++)

{

for (int y = 0; y < _size; y++)

{

numbInMass[z] = field[x, y];

z++;

}

}

return rightNumb.SequenceEqual(numbInMass);

}

private int CoordsToPosition(int x, int y)

{

return y * _size + x;

}

private void PositionToCoords(int pos, out int x, out int y)

{

x = pos % _size;

y = pos / _size;

}

}

using System;

using System.Windows.Forms;

class Program

{

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new FormGame());

}

}

Шаг 4: оптимизация производительности

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

Шаг 5: тестирование и отладка

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

Заключение

Создание игры «Игра в 15» на C# в Windows Forms — это отличный способ научиться работать с элементами управления, реализовывать логику игры и оптимизировать производительность. Следуя шагам, описанным в этой статье, вы сможете создать свою собственную версию этой классической головоломки и получить удовольствие от процесса разработки.