商利華
摘 要:本文基于C#開(kāi)發(fā)環(huán)境,開(kāi)發(fā)了一款有趣味、有挑戰(zhàn)、畫(huà)面清新生動(dòng)的高級(jí)打地鼠游戲。本游戲是通過(guò)地鼠的不斷閃現(xiàn)和敲擊,根據(jù)玩家的擊中數(shù),從而計(jì)算分?jǐn)?shù)。其中,最大的特色就是通過(guò)動(dòng)態(tài)增加控件使得“田地”數(shù)目不斷變化,使得游戲等級(jí)逐步提高,從而實(shí)現(xiàn)闖關(guān)、游戲計(jì)時(shí)計(jì)分等功能?;敬耍疚脑敱M提出動(dòng)態(tài)增加控件的設(shè)計(jì)與實(shí)現(xiàn),同時(shí)對(duì)該游戲中的主界面設(shè)計(jì)和隨機(jī)顯示地鼠也進(jìn)行了探討與分析。
關(guān)鍵詞:打地鼠;C#;隨機(jī)數(shù)
文章編號(hào):2095-2163(2019)04-0212-04 中圖分類(lèi)號(hào):TP317 文獻(xiàn)標(biāo)志碼:A
0 引 言
高級(jí)打地鼠是一款將休閑、趣味、益智精華完美融于其中的經(jīng)典動(dòng)作游戲。目前,各平臺(tái)上均已推出多種打地鼠游戲,但游戲的質(zhì)量參差不齊,游戲模式單一,而且也不具備各自的設(shè)計(jì)特色。基于此,本文即使用C#語(yǔ)言和GDI+技術(shù)共同研發(fā)一款高級(jí)打地鼠游戲。在此研發(fā)過(guò)程中,將動(dòng)態(tài)增加控件引入該款游戲中,使得本款游戲不僅有著精美的畫(huà)面、新穎的特效、而且還有著十足引人入勝的挑戰(zhàn)性和趣味性。本文擬對(duì)此展開(kāi)研究論述如下。
1 設(shè)計(jì)思路
打地鼠游戲規(guī)則可表述為:在游戲頁(yè)面點(diǎn)擊開(kāi)始后,即可直接進(jìn)入游戲。游戲中,地鼠會(huì)從一個(gè)個(gè)地洞中不經(jīng)意地探出一個(gè)個(gè)腦袋,企圖躲過(guò)玩家的視線(xiàn),此時(shí)玩家出手要快、落錘要準(zhǔn),力求擊中地鼠次數(shù)能達(dá)到最多。本項(xiàng)目中,研究使用多個(gè)按鈕來(lái)模擬多個(gè)地鼠可能出現(xiàn)的位置,通過(guò)按鈕上顯示圖片的改變來(lái)反映地鼠的位置,地鼠的位置按某個(gè)頻率在一定的范圍內(nèi)隨機(jī)出現(xiàn)。游戲可由1~2個(gè)玩家合作使用技能消滅地洞里的地鼠,除此之外游戲還可以計(jì)分,達(dá)到一定的分?jǐn)?shù)可以升級(jí)進(jìn)入下一關(guān),每輪游戲都是要求在限定的時(shí)間內(nèi),敲打的地鼠越多,分?jǐn)?shù)越高,最后計(jì)算得到的總分??偡衷礁撸涣信判邪駟蔚呐琶矔?huì)越高。游戲部分效果如圖1所示。
2 游戲?qū)崿F(xiàn)
2.1 制作打地鼠游戲閃屏LOGO和主頁(yè)面靜態(tài)界面
制作閃屏,將圖片文件拷貝到Debug目錄下,在程序中將此畫(huà)面作為啟動(dòng)屏幕背景,如圖2所示。設(shè)置2個(gè)Boolean型全局變量,分別作為不允許降低不透明度和允許增加不透明度。在窗體中拖放一個(gè)Timer控件,并將其Enabled設(shè)置為T(mén)rue,在timer1_Tick事件處理程序的相關(guān)代碼如下。
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();
}}
該段程序運(yùn)行后,就實(shí)現(xiàn)了設(shè)計(jì)中的閃屏效果。
其次,在窗體上添加3個(gè)Panel控件,自上而下分別命名為:pnlTop、pnlBody 和pnlBottom ,其Dock屬性值依次為:Top、Fill和Bottom。在pnlTop上添加3個(gè)Label控件,Name屬性依次為:lblLeftTime(顯示游戲剩余時(shí)間)、lblClickNum(顯示鼠標(biāo)點(diǎn)擊數(shù))、lblHitNum(顯示擊中地鼠數(shù))和lblLevel(顯示當(dāng)前關(guān)數(shù))。在pnlBottom上添加一個(gè)Button控件,Name屬性設(shè)置為btnStart。運(yùn)行程序,即可得到如圖1所示的設(shè)計(jì)效果。
2.2 類(lèi)的繼承的設(shè)計(jì)實(shí)現(xiàn)
本次項(xiàng)目是用按鈕控件來(lái)模擬“田地”,程序中需要記錄某一時(shí)刻田地是否有地鼠出現(xiàn)的狀態(tài),為此可利用Button控件的Tag屬性來(lái)進(jìn)行控制:當(dāng)Tag=0時(shí)無(wú)地鼠,Tag=1時(shí)有地鼠。本次任務(wù)中,則將繼承Button類(lèi),通過(guò)在派生類(lèi)里增加新的屬性的方式來(lái)記錄某個(gè)時(shí)刻田地是否有地鼠的狀態(tài)。研發(fā)中,會(huì)用到如下程序代碼。
class ClsButtonX:Button
{
bool isMouse;
public bool IsMouse
{
get{ return isMouse; }
set{ isMouse = value; }
}
}
2.3 動(dòng)態(tài)增加控件
隨著游戲等級(jí)的提高,游戲中的“田地”數(shù)也要逐漸增多,這樣就涉及到在游戲過(guò)程中,升級(jí)后所派生出的按鈕控件,就要按一定數(shù)量動(dòng)態(tài)地添加到窗體中。程序界面布局如圖3所示。由圖3可知,文本框中輸入每行顯示的Button數(shù),點(diǎn)擊“按要求重新添加控件”按鈕將添加指定數(shù)量的Button控件至窗體上。給按鈕控件添加的與此功能相關(guān)的Click事件,其程序代碼詳見(jiàn)如下。
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的對(duì)象
pnlBody.Controls.Add(btnMouse);
//添加控件到pnlBody容器上
btnMouse.Width = btnMouse.Height =
cellSize;
btnMouse.Top = j * cellSize;
btnMouse.Left = i * cellSize;
//指定btnMouse的大小及顯示位置
}
}
//生成新的游戲界面(動(dòng)態(tài)增加控件)
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的對(duì)象
pnlBody.Controls.Add(btnMouse);
//添加控件到pnlBody容器上
btnMouse.Width = btnMouse.Height =
cellSize;
btnMouse.Top = j * cellSize;
btnMouse.Left = i * cellSize;
//指定btnMouse的大小及顯示位置
btnMouse.IsMouse =false;
//默認(rèn)為非地鼠狀態(tài)
btnMouse.Click +=new EventHandler(button X_Click);
//添加自定義事件
}
}
2.4 隨機(jī)顯示地鼠
打地鼠游戲難點(diǎn)之一就是地鼠將會(huì)在指定的范圍之內(nèi)隨機(jī)出現(xiàn),本項(xiàng)目將在按鈕控件上顯示地鼠圖片的方式來(lái)標(biāo)識(shí)地鼠的位置。首先,要產(chǎn)生地鼠隨機(jī)位置,則要初始化一個(gè)隨機(jī)類(lèi)的實(shí)例,再在指定的范圍內(nèi)產(chǎn)生隨機(jī)數(shù)。本項(xiàng)目引入了游戲等級(jí)的要求,而隨著游戲等級(jí)的變化,即使得“田地”數(shù)目也將隨之變化,故隨機(jī)數(shù)的產(chǎn)生范圍也并非固定不變。接下來(lái),就要研究地鼠出現(xiàn)的時(shí)間間隔。采用Timer控件tmrHamster,初始將該控件屬性設(shè)置為300。最后用圖片的方式顯示地鼠。研究中,可以利用Button控件的image屬性來(lái)顯示圖片,本項(xiàng)目中動(dòng)態(tài)添加的控件是從Button類(lèi)中派生出來(lái),因而該控件也具有image屬性。添加tmrHamster控件Tick事件的代碼具體如下。
private void tmrHamster_Tick(object sender, EventArgs e)
{
((ClsButtonX)pnlBody.Controls[rdNum]).Image= null;
((ClsButtonX)pnlBody.Controls[rdNum]).IsMouse = false;
//清除原來(lái)地鼠標(biāo)記
rdNum = rnd.Next((guanNum + 1) * (guanNum + 1));
//產(chǎn)生新的地鼠的位置
((ClsButtonX)pnlBody.Controls[rdNum]).Image = imageList1.Images[0];
((ClsButtonX)pnlBody.Controls[rdNum]).IsMouse = true;
//新位置設(shè)置地鼠標(biāo)記
}
2.5 增加游戲計(jì)時(shí)與積分
本項(xiàng)目在游戲計(jì)時(shí)的基礎(chǔ)上增加游戲積分的功能,達(dá)到一定積分可以進(jìn)入下一關(guān)繼續(xù)游戲,達(dá)不到則繼續(xù)本關(guān)游戲。首先添加一個(gè)Timer控件,命名為tmrTimeLeft,設(shè)置其Interval屬性值為1 000。其次,添加Tick事件,設(shè)計(jì)代碼見(jiàn)如下。
//游戲計(jì)時(shí)
private void tmrLeftTime_Tick(object sender, EventArgs e)
{
time--;
lblLeftTime.Text ="剩余時(shí)間: " + time.ToString();
progressBar1.Value = time;
//初始滾動(dòng)條的Value屬性
if (time == 0)
{
if (hitMouse * 10 > ClickNum)
//若擊中地鼠數(shù)大于鼠標(biāo)總點(diǎn)擊數(shù)的1/10則進(jìn)入下一關(guān)
{
btnStart.Text ="繼續(xù)下一關(guān)(&N)";
guanNum++;
lblMarks.Text ="關(guān)數(shù): " + guanNum.ToString();
cellSize = pnlBody.Width /( guanNum+1);
//更改“田地”的尺寸
}
else
btnStart.Text ="繼續(xù)本關(guān)(&N)";
tmrLeftTime.Enabled =false;
tmrHamster.Enabled =false;
btnStart.Enabled =true;
pnlBody.Visible =false;
} }
為增加可視性,本次任務(wù)同時(shí)引入了ProgressBar控件計(jì)時(shí)。ProgressBar控件是較長(zhǎng)操作的狀態(tài)的可視化表示,由其指示用戶(hù)正在進(jìn)行某個(gè)操作,用戶(hù)應(yīng)等待。ProgressBar控件工作時(shí)要設(shè)置Minimum和Maximum屬性。這些屬性對(duì)應(yīng)于進(jìn)度指示器的最左端(Minimum)和最右端(Maximum)。設(shè)置Step屬性,以確定每次調(diào)用PerformStep方法時(shí)數(shù)值的增量。Value屬性返回ProgressBar的當(dāng)前值。
游戲結(jié)束彈出保存玩家姓名和分?jǐn)?shù)的窗口,玩家輸入姓名后點(diǎn)擊確定,保存到數(shù)據(jù)庫(kù)中,玩家可以通過(guò)排行榜分?jǐn)?shù)查看從高到低排名的榜單。運(yùn)行程序,效果如圖4所示。
3 結(jié)束語(yǔ)
本文開(kāi)發(fā)的高級(jí)打地鼠游戲特色是地鼠多,關(guān)卡多,是一款可玩性頗高的電腦單機(jī)游戲。除實(shí)現(xiàn)基本功能外,還設(shè)置了不同的背景音樂(lè)和游戲音效,讓玩家在輕松愉快的環(huán)境中體驗(yàn)打地鼠的快樂(lè)。
參考文獻(xiàn)
[1]夏普,周靖. Visual C# 2005從入門(mén)到精通[M]. 北京:清華大學(xué)出版社,2008.
[2] 蔡繼文. 21天學(xué)通ASP.NET[M]. 北京:電子工業(yè)出版社,2009.
[3] 王興晶. Visual Basic.NET 數(shù)據(jù)庫(kù)開(kāi)發(fā)典型實(shí)例[M]. 北京:電子工業(yè)出版社,2002.
[4] 胡木林. 基于遺傳算法的在線(xiàn)考試系統(tǒng)組卷設(shè)計(jì)[J]. 中國(guó)教育技術(shù)裝備,2018(12):23-27.