高级打地鼠游戏的设计与实现
2019-09-12商利华
商利华
摘 要:本文基于C#开发环境,开发了一款有趣味、有挑战、画面清新生动的高级打地鼠游戏。本游戏是通过地鼠的不断闪现和敲击,根据玩家的击中数,从而计算分数。其中,最大的特色就是通过动态增加控件使得“田地”数目不断变化,使得游戏等级逐步提高,从而实现闯关、游戏计时计分等功能。基本此,本文详尽提出动态增加控件的设计与实现,同时对该游戏中的主界面设计和随机显示地鼠也进行了探讨与分析。
关键词:打地鼠;C#;随机数
文章编号:2095-2163(2019)04-0212-04 中图分类号:TP317 文献标志码:A
0 引 言
高级打地鼠是一款将休闲、趣味、益智精华完美融于其中的经典动作游戏。目前,各平台上均已推出多种打地鼠游戏,但游戏的质量参差不齐,游戏模式单一,而且也不具备各自的设计特色。基于此,本文即使用C#语言和GDI+技术共同研发一款高级打地鼠游戏。在此研发过程中,将动态增加控件引入该款游戏中,使得本款游戏不仅有着精美的画面、新颖的特效、而且还有着十足引人入胜的挑战性和趣味性。本文拟对此展开研究论述如下。
1 设计思路
打地鼠游戏规则可表述为:在游戏页面点击开始后,即可直接进入游戏。游戏中,地鼠会从一个个地洞中不经意地探出一个个脑袋,企图躲过玩家的视线,此时玩家出手要快、落锤要准,力求击中地鼠次数能达到最多。本项目中,研究使用多个按钮来模拟多个地鼠可能出现的位置,通过按钮上显示图片的改变来反映地鼠的位置,地鼠的位置按某个频率在一定的范围内随机出现。游戏可由1~2个玩家合作使用技能消灭地洞里的地鼠,除此之外游戏还可以计分,达到一定的分数可以升级进入下一关,每轮游戏都是要求在限定的时间内,敲打的地鼠越多,分数越高,最后计算得到的总分。总分越高,位列排行榜单的排名也会越高。游戏部分效果如图1所示。
2 游戏实现
2.1 制作打地鼠游戏闪屏LOGO和主页面静态界面
制作闪屏,将图片文件拷贝到Debug目录下,在程序中将此画面作为启动屏幕背景,如图2所示。设置2个Boolean型全局变量,分别作为不允许降低不透明度和允许增加不透明度。在窗体中拖放一个Timer控件,并将其Enabled设置为True,在timer1_Tick事件处理程序的相关代码如下。
private void timer1_Tick(object sender, EventArgs e)
{
if (bAddAlpha)
if (this.Opacity < 1.0)
{
this.Opacity += 0.1;
}
else
{
bAddAlpha =false;
bSubAlpha =true;
}
if (bSubAlpha)
if (this.Opacity > 0.1)
{
this.Opacity -= 0.1;
}
else
{
bSubAlpha =false;
this.timer1.Enabled = false;
new FormMain().Show();
}}
该段程序运行后,就实现了设计中的闪屏效果。
其次,在窗体上添加3个Panel控件,自上而下分别命名为:pnlTop、pnlBody 和pnlBottom ,其Dock属性值依次为:Top、Fill和Bottom。在pnlTop上添加3个Label控件,Name属性依次为:lblLeftTime(显示游戏剩余时间)、lblClickNum(显示鼠标点击数)、lblHitNum(显示击中地鼠数)和lblLevel(显示当前关数)。在pnlBottom上添加一个Button控件,Name属性设置为btnStart。运行程序,即可得到如图1所示的设计效果。
2.2 类的继承的设计实现
本次项目是用按钮控件来模拟“田地”,程序中需要记录某一时刻田地是否有地鼠出现的状态,为此可利用Button控件的Tag属性来进行控制:当Tag=0时无地鼠,Tag=1时有地鼠。本次任务中,则将继承Button类,通过在派生类里增加新的属性的方式来记录某个时刻田地是否有地鼠的状态。研发中,会用到如下程序代码。
class ClsButtonX:Button
{
bool isMouse;
public bool IsMouse
{
get{ return isMouse; }
set{ isMouse = value; }
}
}
2.3 动态增加控件
随着游戏等级的提高,游戲中的“田地”数也要逐渐增多,这样就涉及到在游戏过程中,升级后所派生出的按钮控件,就要按一定数量动态地添加到窗体中。程序界面布局如图3所示。由图3可知,文本框中输入每行显示的Button数,点击“按要求重新添加控件”按钮将添加指定数量的Button控件至窗体上。给按钮控件添加的与此功能相关的Click事件,其程序代码详见如下。
private void btnStart_Click(object sender, EventArgs e)
{
guanNum=Int32.Parse(tbNum.Text.ToString());
cellSize = pnlBody.Width / (guanNum);
//地鼠的尺寸
pnlBody.Controls.Clear();
//先清除pnlBody上原有的控件
for (int i = 0; i < guanNum; i++)
for (int j = 0; j { Button btnMouse = new Button(); //初始化Button的对象 pnlBody.Controls.Add(btnMouse); //添加控件到pnlBody容器上 btnMouse.Width = btnMouse.Height = cellSize; btnMouse.Top = j * cellSize; btnMouse.Left = i * cellSize; //指定btnMouse的大小及显示位置 } } //生成新的游戏界面(动态增加控件) private void GenMouseCell() { pnlBody.Controls.Clear();//先清除pnlBody上原有的控件 for (int i = 0; i <= guanNum; i++) for (int j = 0; j <= guanNum; j++) { ClsButtonX btnMouse = new ClsButtonX(); //初始化ClsButtonX的对象 pnlBody.Controls.Add(btnMouse); //添加控件到pnlBody容器上 btnMouse.Width = btnMouse.Height = cellSize; btnMouse.Top = j * cellSize; btnMouse.Left = i * cellSize; //指定btnMouse的大小及显示位置 btnMouse.IsMouse =false; //默认为非地鼠状态 btnMouse.Click +=new EventHandler(button X_Click); //添加自定义事件 } } 2.4 随机显示地鼠 打地鼠游戏难点之一就是地鼠将会在指定的范围之内随机出现,本项目将在按钮控件上显示地鼠图片的方式来标识地鼠的位置。首先,要产生地鼠随机位置,则要初始化一个随机类的实例,再在指定的范围内产生随机数。本项目引入了游戏等级的要求,而随着游戏等级的变化,即使得“田地”数目也将随之变化,故随机数的产生范围也并非固定不变。接下来,就要研究地鼠出现的时间间隔。采用Timer控件tmrHamster,初始将该控件属性设置为300。最后用图片的方式显示地鼠。研究中,可以利用Button控件的image属性来显示图片,本项目中动态添加的控件是从Button类中派生出来,因而该控件也具有image属性。添加tmrHamster控件Tick事件的代码具体如下。 private void tmrHamster_Tick(object sender, EventArgs e) { ((ClsButtonX)pnlBody.Controls[rdNum]).Image= null; ((ClsButtonX)pnlBody.Controls[rdNum]).IsMouse = false; //清除原来地鼠标记 rdNum = rnd.Next((guanNum + 1) * (guanNum + 1)); //产生新的地鼠的位置 ((ClsButtonX)pnlBody.Controls[rdNum]).Image = imageList1.Images[0]; ((ClsButtonX)pnlBody.Controls[rdNum]).IsMouse = true; //新位置设置地鼠标记 } 2.5 增加游戏计时与积分 本项目在游戏计时的基础上增加游戏积分的功能,达到一定积分可以进入下一关继续游戏,达不到则继续本关游戏。首先添加一个Timer控件,命名为tmrTimeLeft,设置其Interval属性值为1 000。其次,添加Tick事件,设计代码见如下。 //游戏计时 private void tmrLeftTime_Tick(object sender, EventArgs e) { time--; lblLeftTime.Text ="剩余時间: " + time.ToString(); progressBar1.Value = time; //初始滚动条的Value属性 if (time == 0) { if (hitMouse * 10 > ClickNum) //若击中地鼠数大于鼠标总点击数的1/10则进入下一关 { btnStart.Text ="继续下一关(&N)"; guanNum++; lblMarks.Text ="关数: " + guanNum.ToString(); cellSize = pnlBody.Width /( guanNum+1); //更改“田地”的尺寸 } else btnStart.Text ="继续本关(&N)"; tmrLeftTime.Enabled =false; tmrHamster.Enabled =false; btnStart.Enabled =true; pnlBody.Visible =false; } } 為增加可视性,本次任务同时引入了ProgressBar控件计时。ProgressBar控件是较长操作的状态的可视化表示,由其指示用户正在进行某个操作,用户应等待。ProgressBar控件工作时要设置Minimum和Maximum属性。这些属性对应于进度指示器的最左端(Minimum)和最右端(Maximum)。设置Step属性,以确定每次调用PerformStep方法时数值的增量。Value属性返回ProgressBar的当前值。 游戏结束弹出保存玩家姓名和分数的窗口,玩家输入姓名后点击确定,保存到数据库中,玩家可以通过排行榜分数查看从高到低排名的榜单。运行程序,效果如图4所示。 3 结束语 本文开发的高级打地鼠游戏特色是地鼠多,关卡多,是一款可玩性颇高的电脑单机游戏。除实现基本功能外,还设置了不同的背景音乐和游戏音效,让玩家在轻松愉快的环境中体验打地鼠的快乐。 参考文献 [1]夏普,周靖. Visual C# 2005从入门到精通[M]. 北京:清华大学出版社,2008. [2] 蔡继文. 21天学通ASP.NET[M]. 北京:电子工业出版社,2009. [3] 王兴晶. Visual Basic.NET 数据库开发典型实例[M]. 北京:电子工业出版社,2002. [4] 胡木林. 基于遗传算法的在线考试系统组卷设计[J]. 中国教育技术装备,2018(12):23-27.