上次的计时器运行效果图如下:
= ------------------------------------------------------------------------------
今天来分享一个综合实例,设计一个匹配小游戏。
本次实例步骤较多,切勿搞混。
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即可)
在本步骤中,要为游戏创建一组匹配的符号。 每个符号将添加到窗体上 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"
};
}
以下代码添加给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();
}
效果:保存并运行程序。它应该显示一个窗体,其中每个标签都分配了随机图标。
匹配游戏的运行原理:当玩家选择一个带有隐藏图标的方块时,程序会通过将图标颜色更改为黑色来向玩家显示该图标。然后玩家选择另一个隐藏的图标。如果图标互相匹配,则它们保持可见。如果不匹配,则两个图标都会再次隐藏。
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;
}
}
效果:最后运行程序看到一个背景为蓝色的空窗体。在窗体中选择任意单元格,其中一个图标应变为可见。继续在窗体中选择不同位置。当选择图标时,可以显示。
使用下面的代码向窗体(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;
}
}
}
效果 :保存并运行程序,选择其中一个标签控件,它的图标将显示。
关于计时器,在上次写的《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();
}
}
效果:保存并运行程序。选择一个图标,它将显示出来。选择另一个图标。 它会短暂显示,然后两个图标都消失。
将下面的 if 语句添加到 label_Click() 事件处理程序方法中,紧靠启动计时器的语句上方代码的结尾处。
if (firstClicked.Text == secondClicked.Text)
{
firstClicked = null;
secondClicked = null;
return;
}
timer1.Start();
效果:保存并运行程序,然后开始选择窗体上的图标。如果选择的是不匹配的对,则将触发计时器的事件,两个图标都会消失。
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;
}
效果:保存并运行程序。 玩游戏并匹配所有图标。