在这四个部分的系列教程中,你将制作一个配对游戏,其中玩家需要匹配隐藏的图标对。
在匹配的游戏中,玩家选择一个正方形以查看图标,然后选择另一个正方形。 如果图标匹配,它们将保持可见。 否则,游戏会隐藏这两个图标。 在本教程中,将图标随机分配给标签。 将它们设置为隐藏,然后在选中时显示。
在本第二个教程中,你将了解如何:
- 添加 Random 对象和图标列表。
- 为每个标签分配一个随机图标。
- 向标签添加显示图标的事件处理程序。
先决条件
本教程基于上一教程,创建匹配的游戏应用程序。 如果尚未完成该教程,请先完成该教程。
添加一个 Random 对象和一个图标列表
在本部分中,你将为游戏创建一组匹配的符号。 每个符号将添加到窗体上 TableLayoutPanel 中的两个随机单元格。
使用 new
语句创建两个对象。
第一个是一个 Random 对象,该对象随机选择 TableLayoutPanel 中的单元格。
第二个对象是 List<T> 对象。
它存储随机选择的符号。
打开 Visual Studio。 MatchingGame 项目显示在“打开最近使用的文件”下。
如果使用的是 C#,请选择 Form1.cs;如果使用的是 Visual Basic,请选择 Form1.vb。 然后选择“查看”>“代码”。 或者,选择 F7 键或双击 Form1。 Visual Studio IDE 显示 Form1 的代码模块。
在现有代码中,添加以下代码。
public partial class Form1 : Form { // Use this Random object to choose random icons for the squares Random random = new Random(); // Each of these letters is an interesting icon // in the Webdings font, // and each icon appears twice in this list List<string> icons = new List<string>() { "!", "!", "N", "N", ",", ",", "k", "k", "b", "b", "v", "v", "w", "w", "z", "z" };
如果使用 C#,请确保将代码放在左大括号和类声明(public partial class Form1 : Form
)之后。 如果使用 Visual Basic,请将代码放在类声明(Public Class Form1
)之后。
可以使用列表对象跟踪不同类型的项。 列表可以保存数字、true/false 值、文本或其他对象。 在匹配的游戏中,列表对象有 16 个字符串,每个字符串对应 TableLayoutPanel 面板中的每一个单元格。 每个字符串都是对应于标签中的图标的单个字母。 这些字符以公共汽车、自行车等的形式出现在 Webdings 字体中。
说明
列表可以根据需要收缩和增长,这对于此程序很重要。
若要了解有关列表的详细信息,请参阅 List<T>。 若要查看 C# 中的示例,请参阅 基本列表示例。 若要查看 Visual Basic 中的示例,请参阅 使用简单集合。
为每个标签分配一个随机图标
每次运行该程序时,它都会使用 AssignIconsToSquares()
方法将图标随机分配给 Label 控件。
此代码使用 C# 中的关键字 foreach
或在 Visual Basic 中使用 For Each
。
将
AssignIconsToSquares()
方法添加到Form1.cs
或Form1.vb
。/// <summary> /// Assign each icon from the list of icons to a random square /// </summary> private void AssignIconsToSquares() { // The TableLayoutPanel has 16 labels, // and the icon list has 16 icons, // so an icon is pulled at random from the list // and added to each label 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()
方法循环访问 TableLayoutPanel 中的每个标签控件。
它对每个控件运行相同的语句。
这些语句从列表中拉取随机图标。
- 第一行将 控件 变量转换为名为 iconLabel的标签。
- 第二行是一个
if
语句,用于检查以确保转换正常工作。 如果转换正常工作,if
语句中的语句将运行。 if
语句中的第一行创建一个名为 randomNumber 的变量,该变量包含与图标列表中的某个项相对应的随机数。 它使用 Random 对象的 Next() 方法。Next
方法返回随机数。 此行还使用 图标 列表的 Count 属性来确定从中选择随机数的范围。- 下一行将 图标之一 列表项分配给标签的 Text 属性。
- 下一行隐藏图标。 此处注释掉了该行,以便你可以在继续之前验证其余代码。
if
语句中的最后一行将已添加到表单中的图标从列表中删除。
在
Form1.cs
中的 Form1 构造函数中添加对AssignIconsToSquares()
方法的调用。 此方法使用图标填充游戏板。 创建对象时会调用构造函数。public Form1() { InitializeComponent(); AssignIconsToSquares(); }
对于 Visual Basic,在
Form1.vb
中将AssignIconsToSquares()
方法调用添加到Form1_Load
方法中。Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load AssignIconsToSquares() End Sub
有关详细信息,请参阅 构造函数(C# 编程指南) 或 使用构造函数和析构函数。
保存程序并运行它。 它应显示一个窗体,其中包含分配给每个标签的随机图标。
提示
如果窗体上的 Webdings 图标不能正确显示,请将窗体上标签的 UseCompatibleTextRendering 属性设置为 True。
关闭程序,然后再次运行它。 将不同的图标分配给每个标签。
图标现在可见,因为你尚未隐藏它们。 若要将其从播放器中隐藏,可以将每个标签的 ForeColor 属性设置为与其 BackColor 属性相同的颜色。
停止程序。 删除
AssignIconsToSquares()
方法中循环内已注释代码行的注释标记。
如果再次运行程序,图标似乎已消失。 仅显示蓝色背景。 图标是随机分配的,仍然存在。
向标签添加事件处理程序
在此匹配游戏中,玩家显示隐藏的图标,然后显示第二个图标。 如果图标匹配,它们将保持可见。 否则,这两个图标将再次隐藏。
若要让游戏以这种方式工作,请添加一个 Click 事件处理程序,以更改所选标签的颜色以匹配背景。
在 Windows 窗体设计器中打开表单。 选择“Form1.cs”或“Form1.vb”,然后选择“查看”>“设计器”。
选择第一个标签控件以将其选中,然后双击它,向代码添加名为 label1 _Click() 的
Click
事件处理程序。然后,按住 Ctrl 键,同时选择其他标签。 确保选中每个标签。
在 属性 窗口中,选择带有闪电符号的 事件 按钮。 对于“Click”事件,请在框中选择“label1_Click”。
按下 Enter 键。 IDE 将名为 label1 _Click() 的
Click
事件处理程序添加到 Form1.cs 或 Form1.vb中的代码中。 由于选择了所有标签,因此处理程序将连接到每个标签。填写代码的其余部分。
/// <summary> /// Every label's Click event is handled by this event handler /// </summary> /// <param name="sender">The label that was clicked</param> /// <param name="e"></param> private void label1_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; clickedLabel.ForeColor = Color.Black; } }
说明
如果复制并粘贴 label1_Click()
代码块,而不是手动输入代码,请确保替换现有的 label1_Click()
代码。
否则,你将得到重复的代码块。
选择 调试>启动调试 以运行程序。 您应该看到一个背景为蓝色的空窗体。 选择窗体中的任何单元格。 其中一个图标应可见。 继续选择表单中的不同位置。 选择图标时,它们应显示。
后续步骤
转到下一教程,了解如何使用计时器更改标签。
在匹配游戏 中使用计时器