排块游戏(陈景润“十五子游戏”编程实现)

Posted chenlong991223

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排块游戏(陈景润“十五子游戏”编程实现)相关的知识,希望对你有一定的参考价值。

const int N = 4; //按钮的行、列数

Button[,] buttons = new Button[N, N]; //按钮的数组

 

private void Form1_Load(object sender, EventArgs e)

//产生所有按钮

GenerateAllButtons();

 

private void button1_Click(object sender, EventArgs e)

//打乱顺序

Shuffle();

 

 

//打乱顺序

void Shuffle()

//多次随机交换两个按钮

Random rnd = new Random();

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

int a = rnd.Next(N);

int b = rnd.Next(N);

int c = rnd.Next(N);

int d = rnd.Next(N);

Swap(buttons[a, b], buttons[c, d]);

 

//生成所有的按钮

void GenerateAllButtons()

int x0 = 100, y0 = 10, w = 45, d = 50;

for (int r = 0; r < N; r++)

for (int c = 0; c < N; c++)

int num = r * N + c;

Button btn = new Button();

btn.Text = (num + 1).ToString();

btn.Top = y0 + r * d;

btn.Left = x0 + c * d;

btn.Width = w;

btn.Height = w;

btn.Visible = true;

btn.Tag = r * N + c; //这个数据用来表示它所在行列位置

 

//注册事件

btn.Click += new EventHandler(btn_Click);

 

buttons[r, c] = btn; //放到数组中

this.Controls.Add(btn); //加到界面上

buttons[N - 1, N - 1].Visible = false; //最后一个不可见

 

//交换两个按钮

void Swap(Button btna, Button btnb)

string t = btna.Text;

btna.Text = btnb.Text;

btnb.Text = t;

 

bool v = btna.Visible;

btna.Visible = btnb.Visible;

btnb.Visible = v;

 

//按钮点击事件处理

void btn_Click(object sender, EventArgs e)

Button btn = sender as Button; //当前点中的按钮

Button blank = FindHiddenButton(); //空白按钮

 

//判断是否与空白块相邻,如果是,则交换

if (IsNeighbor(btn, blank))

Swap(btn, blank);

blank.Focus();

 

//判断是否完成了

if (ResultIsOk())

MessageBox.Show("ok");

 

//查找要隐藏的按钮

Button FindHiddenButton()

for (int r = 0; r < N; r++)

for (int c = 0; c < N; c++)

if (!buttons[r, c].Visible)

return buttons[r, c];

return null;

 

//判断是否相邻

bool IsNeighbor(Button btnA, Button btnB)

int a = (int)btnA.Tag; //Tag中记录是行列位置

int b = (int)btnB.Tag;

int r1 = a / N, c1 = a % N;

int r2 = b / N, c2 = b % N;

 

if (r1 == r2 && (c1 == c2 - 1 || c1 == c2 + 1) //左右相邻

|| c1 == c2 && (r1 == r2 - 1 || r1 == r2 + 1))

return true;

return false;

 

//检查是否完成

bool ResultIsOk()

for (int r = 0; r < N; r++)

for (int c = 0; c < N; c++)

if (buttons[r, c].Text != (r * N + c + 1).ToString())

return false;

return true;

以上是关于排块游戏(陈景润“十五子游戏”编程实现)的主要内容,如果未能解决你的问题,请参考以下文章

无代码iVX编程实现简单跳跃超级玛丽游戏

益智 | 用VB编程开发的围棋游戏!

Linux脚本shell编程通过数组实现石头剪刀布小游戏

Linux脚本shell编程通过数组实现石头剪刀布小游戏

初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程

Unity学习之路:《游戏编程模式》-命令模式