c# Windows窗體應用程序設計綜合實例(一)匹配遊戲設計
上次的計時器運行效果圖如下:
= ------------------------------------------------------------------------------
今天來分享一個綜合實例,設計一個匹配小遊戲。
本次實例步驟較多,切勿搞混。
步驟一 新建項目
1.目的:創建項目並設計佈局表。該表有助於將圖標對齊到有序的 4x4 網格。需設置若干屬性,以改善遊戲板的外觀。
2. 將項目名稱和窗體text屬性改爲“匹配遊戲”(其他名字也行),在size屬性中將窗體大小設置爲550*550。
3. 添加一個TableLayoutPanel 控件,將BackColor屬性設置爲CornflowerBlue。(其他顏色也行,有些屬性的更改可以直接粘貼文本進去設置。);將Dock屬性設置爲Fill(即覆蓋整個窗體),將CellBorderStyle屬性設置爲Inset。
4. 選擇 TableLayoutPanel 右上角的三角形按鈕,以顯示任務菜單。
在任務菜單上,選擇“添加行”兩次以再添加兩行,然後選擇“添加列”兩次以再添加兩列 。
圖一 三角形按鈕
圖二 菜單欄
打開菜單,選擇“編輯行和列”,打開“列和行樣式”窗口 。將列和行的值都設置爲25%(注意設置時,都要保證右側的設置內容爲百分比,現實前面的下拉框可以切換行和列。)
圖三 屬性設置
設置好了以後,點擊確定,效果應該爲是一個 4x4 網格,包含十六個大小相等的方塊單元格。
5.再向左上角單元格添加一個Label 控件,將BackColor屬性設置爲CornflowerBlue ,將AutoSize屬性設置爲False。,將Dock屬性設置爲Fill ;TextAlign屬性設置爲MiddleCenter” 。圖標顯示在單元格中間;選中Font屬性, 此時應顯示一個省略號 (… ) 按鈕。選擇省略號按鈕,並將“Font”值設置爲“Webdings”,將“Font Style”設置爲“Bold”,並將“Size”設置爲“48” ;text屬性設置爲“c”
6.選擇 Label 控件並將其複製到 TableLayoutPanel 中的下一單元格,保證每個單元格都被複制粘貼完成。注意每個單元格要先選中再粘貼(用快捷鍵ctrl+c、ctrl+v即可)
效果圖:
步驟二 添加代碼
1.添加圖標列表
在本步驟中,要爲遊戲創建一組匹配的符號。 每個符號將添加到窗體上 TableLayoutPanel 中的兩個隨機單元格。
查看代碼的方法:在“解決方案資源管理器” 中,選擇“Form1.cs” ,然後在菜單欄上選擇“查看” ,選擇 “代碼” 。
本次需要添加的代碼如下(給Form窗口添加代碼):
public partial class Form1 : Form
{
Random random = new Random();
List<string> icons = new List<string>()
{
"!", "!", "N", "N", ",", ",", "k", "k",
"b", "b", "v", "v", "w", "w", "z", "z"
};
}
2.分配隨機圖標
以下代碼添加給label控件:
private void AssignIconsToSquares()
{
foreach (Control control in tableLayoutPanel1.Controls)
{
Label iconLabel = control as Label;
if (iconLabel != null)
{
int randomNumber = random.Next(icons.Count);
iconLabel.Text = icons[randomNumber];
iconLabel.ForeColor = iconLabel.BackColor;
icons.RemoveAt(randomNumber);
}
}
}
若要用圖標填充遊戲板,你需要在程序啓動時調用 AssignIconsToSquares() 方法。在 Form1 構造函數中 直接添加一條語句。
public Form1()
{
InitializeComponent();
AssignIconsToSquares();
}
效果:保存並運行程序。它應該顯示一個窗體,其中每個標籤都分配了隨機圖標。
3.添加事件處理程序
匹配遊戲的運行原理:當玩家選擇一個帶有隱藏圖標的方塊時,程序會通過將圖標顏色更改爲黑色來向玩家顯示該圖標。然後玩家選擇另一個隱藏的圖標。如果圖標互相匹配,則它們保持可見。如果不匹配,則兩個圖標都會再次隱藏。
1.在Windows 窗體設計器”中打開窗體。在“解決方案資源管理器” 中,選擇“Form1.cs” 在菜單欄上,依次選擇“視圖” > “設計器” 。選擇第一個標籤控件以選中它。然後,按住 Ctrl 鍵選擇其他每個標籤,將它們選中。確保選中每個標籤。
2.選擇“屬性” 窗口工具欄上的“事件” 按鈕,在“屬性” 窗口中查看“事件” 頁面。向下滾動到“Click” 事件,在框中輸入“label_Click” ,最後回車一下。
添加的代碼如下:
private void label_Click(object sender, EventArgs e)
{
Label clickedLabel = sender as Label;
if (clickedLabel != null)
{
if (clickedLabel.ForeColor == Color.Black)
return;
clickedLabel.ForeColor = Color.Black;
}
}
效果:最後運行程序看到一個背景爲藍色的空窗體。在窗體中選擇任意單元格,其中一個圖標應變爲可見。繼續在窗體中選擇不同位置。當選擇圖標時,可以顯示。
4.添加標籤引用
使用下面的代碼向窗體(Form1)中添加標籤引用:
private void label_Click(object sender, EventArgs e)
{
Label clickedLabel = sender as Label;
if (clickedLabel != null)
{
// If the clicked label is black, the player clicked
// an icon that's already been revealed --
// ignore the click
if (clickedLabel.ForeColor == Color.Black)
return;
// If firstClicked is null, this is the first icon
// in the pair that the player clicked,
// so set firstClicked to the label that the player
// clicked, change its color to black, and return
if (firstClicked == null)
{
firstClicked = clickedLabel;
firstClicked.ForeColor = Color.Black;
return;
}
}
}
效果 :保存並運行程序,選擇其中一個標籤控件,它的圖標將顯示。
5.添加計時器
關於計時器,在上次寫的《c# Windows窗體應用程序(四)》有一個關於Timer控件的用法。
在插入Timer控件以後,將計時器的Interval 屬性設置爲 750。雙擊該計時器添加如下代碼:
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
firstClicked.ForeColor = firstClicked.BackColor;
secondClicked.ForeColor = secondClicked.BackColor;
firstClicked = null;
secondClicked = null;
}
若要查看正在使用的新計時器,請轉至代碼編輯器,將以下代碼添加到 label_Click() 事件處理程序方法的頂部和底部。(將兩個 if 語句添加到頂部,將三個語句添加到底部;該方法的其餘部分保持相同。)
private void label_Click(object sender, EventArgs e)
{
if (timer1.Enabled == true)
return;
Label clickedLabel = sender as Label;
if (secondClicked != null)
return;
if (clickedLabel != null)
{
if (clickedLabel.ForeColor == Color.Black)
return;
if (firstClicked == null)
{
firstClicked = clickedLabel;
firstClicked.ForeColor = Color.Black;
return;
}
secondClicked = clickedLabel;
secondClicked.ForeColor = Color.Black;
timer1.Start();
}
}
效果:保存並運行程序。選擇一個圖標,它將顯示出來。選擇另一個圖標。 它會短暫顯示,然後兩個圖標都消失。
6.保持對可見
將下面的 if 語句添加到 label_Click() 事件處理程序方法中,緊靠啓動計時器的語句上方代碼的結尾處。
if (firstClicked.Text == secondClicked.Text)
{
firstClicked = null;
secondClicked = null;
return;
}
timer1.Start();
效果:保存並運行程序,然後開始選擇窗體上的圖標。如果選擇的是不匹配的對,則將觸發計時器的事件,兩個圖標都會消失。
7.添加驗證玩家是否獲勝的方法
1.在代碼底部,CheckForWinner() 事件處理程序下方添加一個 timer1_Tick() 方法,如以下代碼所示。
private void CheckForWinner()
{
foreach (Control control in tableLayoutPanel1.Controls)
{
Label iconLabel = control as Label;
if (iconLabel != null)
{
if (iconLabel.ForeColor == iconLabel.BackColor)
return;
}
}
MessageBox.Show("You matched all the icons!", "Congratulations");
Close();
}
2.讓標籤的 Click 事件處理程序調用新的 CheckForWinner() 方法。 請確保程序在顯示玩家選擇的第二個圖標後立即檢查是否有贏家。 查找設置第二個選中圖標顏色的行,將以下代碼複製到CheckForWinner() 方法中。
secondClicked = clickedLabel;
secondClicked.ForeColor = Color.Black;
CheckForWinner();
if (firstClicked.Text == secondClicked.Text)
{
firstClicked = null;
secondClicked = null;
return;
}
效果:保存並運行程序。 玩遊戲並匹配所有圖標。
3.運行結果
效果圖如下:
有什麼好的建議或者問題可以在下方留言。