📄 form1.cs
字号:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace _sm
{
public partial class Form1 : System.Windows.Forms.Form
{
private int[,] pos ={ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };
private int row = 2, col = 2;//空白label的位置
private int Hits = 0;//记录移动次数
public Form1()
{
InitializeComponent();
label10.Text = "已走" + Hits.ToString()+"步";
}
private void Fix()
{
int r = 30, c = 10, i = 0;
row = 0; col = 0;
int val;
int[] v ={ 8, 3, 6, 2, 5, 7, 1, 4 };//游戏初始化
while (i < 8)
{
val = v[i];
pos[row, col] = val;
//根据val的值来对label们定位
switch (val)
{
case 1:
label1.Text = "1";
label1.Location = new Point(c, r);
break;
case 2:
label2.Text = "2";
label2.Location = new Point(c, r);
break;
case 3:
label3.Text = "3";
label3.Location = new Point(c, r);
break;
case 4:
label4.Text = "4";
label4.Location = new Point(c, r);
break;
case 5:
label5.Text = "5";
label5.Location = new Point(c, r);
break;
case 6:
label6.Text = "6";
label6.Location = new Point(c, r);
break;
case 7:
label7.Text = "7";
label7.Location = new Point(c, r);
break;
case 8:
label8.Text = "8";
label8.Location = new Point(c, r);
break;
default: break;
}
c += 100; //横向坐标加100
col++;
//换行
if (col > 2)
{
col = 0;
row++;
}
if (c > 300)
{
c = 10;
r += 100;
}
i++;
}
//定位空白label9
label9.Location = new Point(c, r);
pos[2, 2] = 9;
}
private void RandomPlace()
{
//r、c是象素
int r = 30, c = 10, i = 0;
row = 0; col = 0;
Random rand = new Random();
int val;
while (i < 8)
{
val = (int)rand.Next(9);
if (numExists(val) == true && val > 0)
{
pos[row, col] = val;
//根据val的值来对label们定位
switch (val)
{
case 1:
label1.Text = "1";
label1.Location = new Point(c, r);
break;
case 2:
label2.Text = "2";
label2.Location = new Point(c, r);
break;
case 3:
label3.Text = "3";
label3.Location = new Point(c, r);
break;
case 4:
label4.Text = "4";
label4.Location = new Point(c, r);
break;
case 5:
label5.Text = "5";
label5.Location = new Point(c, r);
break;
case 6:
label6.Text = "6";
label6.Location = new Point(c, r);
break;
case 7:
label7.Text = "7";
label7.Location = new Point(c, r);
break;
case 8:
label8.Text = "8";
label8.Location = new Point(c, r);
break;
default: break;
}
c += 100; //横向坐标加100
col++;
//换行
if (col > 2)
{
col = 0;
row++;
}
if (c > 300)
{
c = 10;
r += 100;
}
i++;
}
else
continue;
}
//定位空白label9
label9.Location = new Point(c, r);
pos[2, 2] = 9;
}
private Boolean numExists(int num)
{
for(int i=0;i<3;i++)
for (int j = 0; j < 3; j++)
{
if (pos[i, j] == num)
return false; //
}
return true;
}
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs s)
{
int turn;
if (guding.Checked==true || suiji.Checked==true)
{
switch ((int)s.KeyCode)
{
case 38: //按动上键
if (row < 2)
{
turn = pos[row, col];
pos[row, col] = pos[row + 1, col];
pos[row + 1, col] = turn;
Swap(pos[row, col], turn);
row++;
Hits++;
}
break;
case 37: //按动左键
if (col < 2)
{
turn = pos[row, col];
pos[row, col] = pos[row, col + 1];
pos[row, col + 1] = turn;
Swap(pos[row, col], turn);
col++;
Hits++;
}
break;
case 39: //按动右键
if (col > 0)
{
turn = pos[row, col];
pos[row, col] = pos[row, col - 1];
pos[row, col - 1] = turn;
Swap(pos[row, col], turn);
col--;
Hits++;
}
break;
case 40: //按动下键
if (row > 0)
{
turn = pos[row, col];
pos[row, col] = pos[row - 1, col];
pos[row - 1, col] = turn;
Swap(pos[row, col], turn);
row--;
Hits++;
}
break;
}
}
else
MessageBox.Show("请先进行游戏再按方向键!", "提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
label10.Text = "已走" + Hits.ToString() + "步";
//判断8个数字的排列是否满足胜利要求
Boolean same = true;
string arr = "";
for(int ctr=1,i=0;i<3;i++)
{
for(int j=0;j<3;j++,ctr++)
{
if (pos[i, j] != ctr)
{
same = false;
break;
}
arr = arr + "\t" + pos[i, j];
}
arr = arr + "\n";
}
if (same == true)
{
if (MessageBox.Show("共移动了" + Hits.ToString() + "步,游戏结束!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
{
this.Close();
}
}
}
private void Swap(int vNum, int blank)
{
Point turn;
switch (vNum)
{
case 1:
turn = label1.Location;
label1.Location = label9.Location;
label9.Location = turn;
break;
case 2:
turn = label2.Location;
label2.Location = label9.Location;
label9.Location = turn;
break;
case 3:
turn = label3.Location;
label3.Location = label9.Location;
label9.Location = turn;
break;
case 4:
turn = label4.Location;
label4.Location = label9.Location;
label9.Location = turn;
break;
case 5:
turn = label5.Location;
label5.Location = label9.Location;
label9.Location = turn;
break;
case 6:
turn = label6.Location;
label6.Location = label9.Location;
label9.Location = turn;
break;
case 7:
turn = label7.Location;
label7.Location = label9.Location;
label9.Location = turn;
break;
case 8:
turn = label8.Location;
label8.Location = label9.Location;
label9.Location = turn;
break;
}
}
private void Clear()
{
int i, j;
for(i=0;i<3;i++)
for (j=0; j < 3; j++)
{
pos[i, j] = 0;
}
Hits = 0;
label10.Text = "已走" + Hits.ToString() + "步";
}
private void guding_Click(object sender, EventArgs e)
{
Clear();
suiji.Checked = false;
guding.Checked = true;
Fix();
}
private void suiji_Click(object sender, EventArgs e)
{
Clear();
guding.Checked = false;
suiji.Checked = true;
RandomPlace();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -