这篇文章给大家分享的是有关如何基于C#的winform实现数字华容道游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

数字华容道游戏类似于拼图游戏,只需将数字1~15按顺序排好即可。该游戏逻辑比较简单,易于编程实现。

游戏界面如图:

编程准备:

所需控件:label 用于显示时间, 一个重新开始的button,一个panel容器来存放数字块(按钮),再加一个timer来计时及判断游戏是否结束。

主要代码:

variables类:

classvariables{publicstaticint[]a=newint[16]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};publicstaticButton[,]buttons=newButton[4,4];}

数组a用于存放数字,随机打乱顺序并分配给buttons。buttons即游戏中的方块。

Methods类:

classMethod{//数组打乱顺序publicint[]NewSorting(int[]a){Randomr=newRandom();for(inti=0;i<a.Length;i++){inttemp=a[i];intrandomindex=r.Next(0,a.Length);a[i]=a[randomindex];a[randomindex]=temp;}returna;}//向容器中添加16个按钮publicvoidAddButtons(Panelpanel,Button[,]buttons){//数组随机打乱顺序int[]s=NewSorting(a);//每个按钮的宽度及高度intwidth=32;intheight=32;intx0=panel.Location.X;inty0=panel.Location.Y;for(inti=0;i<buttons.GetLength(0);i++)for(intj=0;j<buttons.GetLength(1);j++){Buttonbutt=newButton();//设置按钮相关属性butt.Size=newSystem.Drawing.Size(width,height);butt.Location=newSystem.Drawing.Point(x0+(j+1)*width,y0+(i+1)*height);butt.Visible=true;//打乱顺序的数组分配给每个buttonbutt.Text=s[i*buttons.GetLength(0)+j].ToString();if(butt.Text=="16"){butt.Hide();}variables.buttons[i,j]=butt;//手动添加点击事件butt.Click+=newEventHandler(butt_Click);//按钮添加到容器panel.Controls.Add(butt);}}//自定义点击事件publicvoidbutt_Click(Objectsender,EventArgse){Buttonbutt=senderasButton;Buttonbutt_16=Find_Button16();//判断是否相邻,如果相邻则交换if(Neighboor(butt,butt_16)){swap(butt,butt_16);butt_16.Focus();}}//找出隐藏的按钮即16所在的按钮publicButtonFind_Button16(){for(inti=0;i<buttons.GetLength(0);i++)for(intj=0;j<buttons.GetLength(1);j++){if(buttons[i,j].Visible==false)returnbuttons[i,j];}returnnull;}//判断两个按钮是否相邻即两个按钮的坐标位置是否差一个宽度或者高度publicboolNeighboor(Buttonbutt1,Buttonbutt2){intx1=butt1.Location.X;inty1=butt1.Location.Y;intx2=butt2.Location.X;inty2=butt2.Location.Y;if(((x1==x2)&&(Math.Abs(y1-y2)==butt1.Height))||((y1==y2)&&(Math.Abs(x1-x2)==butt1.Width))){returntrue;}returnfalse;}//交换两个按钮交换text与visiblepublicvoidswap(Buttonbutt1,Buttonbutt2){strings=butt1.Text;butt1.Text=butt2.Text;butt2.Text=s;boola=butt1.Visible;butt1.Visible=butt2.Visible;butt2.Visible=a;}//判断游戏是否完成publicboolGameoverOrNot(){for(inti=0;i<buttons.GetLength(1);i++)for(intj=0;j<buttons.GetLength(0);j++){if(int.Parse(variables.buttons[i,j].Text)!=(i*buttons.GetLength(0)+j+1))returnfalse;}returntrue;}}

游戏中的数字方块为Methods类中的AddButtons方法自动生成的,数字方块总共有16个,其中15个的visible属性为true,1个为false。

窗体界面代码:

publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}Methodmethod=newMethod();intcount;privatevoidForm1_Load(objectsender,EventArgse){method.AddButtons(panel1,buttons);label2.Text="0"+"S";//初始时间timer1.Start();//启动计时器}privatevoidtimer1_Tick(objectsender,EventArgse){//默认100毫秒刷新一次count+=1;label2.Text=(count/10).ToString()+"S";if(method.GameoverOrNot()){timer1.Stop();MessageBox.Show("挑战成功!");}}privatevoidButtonR_Click(objectsender,EventArgse){timer1.Stop();for(inti=0;i<buttons.GetLength(0);i++)for(intj=0;j<buttons.GetLength(1);j++){buttons[i,j].Hide();}method.AddButtons(panel1,buttons);count=0;timer1.Start();}}

感谢各位的阅读!关于“如何基于C#的winform实现数字华容道游戏”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!