商利華
摘 要:本文基于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.