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());
}
}