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

Улучшенный исходный код «Игра в 15» на C# в Windows Forms

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 MixTails()

{

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

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

}

private void PosTailes(int x,int y,int xNew,int yNew,int tempCurrent)

{

spaceX = x;

spaceY = y;

field[spaceX, spaceY] = 0;

field[xNew, yNew] = tempCurrent;

}

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))

{

PosTailes(x, y, xNew, yNew, tempCurrent);

}

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

{

PosTailes(x, y, 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;

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

{

private 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)

{

for (int i = 0; i < btn.Length; i++)

{

if(pos == i) return btn[i];

}

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;

}

}

}

using System;

using System.Windows.Forms;

class Program

{

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new FormGame());

}

}