教程:将图标添加到匹配的游戏 WinForms 应用

在这四个部分的系列教程中,你将制作一个配对游戏,其中玩家需要匹配隐藏的图标对。

在匹配的游戏中,玩家选择一个正方形以查看图标,然后选择另一个正方形。 如果图标匹配,它们将保持可见。 否则,游戏会隐藏这两个图标。 在本教程中,将图标随机分配给标签。 将它们设置为隐藏,然后在选中时显示。

在本第二个教程中,你将了解如何:

  • 添加 Random 对象和图标列表。
  • 为每个标签分配一个随机图标。
  • 向标签添加显示图标的事件处理程序。

先决条件

本教程基于上一教程,创建匹配的游戏应用程序。 如果尚未完成该教程,请先完成该教程。

添加一个 Random 对象和一个图标列表

在本部分中,你将为游戏创建一组匹配的符号。 每个符号将添加到窗体上 TableLayoutPanel 中的两个随机单元格。

使用 new 语句创建两个对象。 第一个是一个 Random 对象,该对象随机选择 TableLayoutPanel 中的单元格。 第二个对象是 List<T> 对象。 它存储随机选择的符号。

  1. 打开 Visual Studio。 MatchingGame 项目显示在“打开最近使用的文件”下

  2. 如果使用的是 C#,请选择 Form1.cs;如果使用的是 Visual Basic,请选择 Form1.vb。 然后选择“查看”>“代码”。 或者,选择 F7 键或双击 Form1。 Visual Studio IDE 显示 Form1 的代码模块。

  3. 在现有代码中,添加以下代码。

    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

  1. AssignIconsToSquares() 方法添加到 Form1.csForm1.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 语句中的最后一行将已添加到表单中的图标从列表中删除。
  1. 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# 编程指南)使用构造函数和析构函数

  2. 保存程序并运行它。 它应显示一个窗体,其中包含分配给每个标签的随机图标。

    提示

    如果窗体上的 Webdings 图标不能正确显示,请将窗体上标签的 UseCompatibleTextRendering 属性设置为 True。

  3. 关闭程序,然后再次运行它。 将不同的图标分配给每个标签。

    屏幕截图显示其中显示了随机图标的匹配游戏。

    图标现在可见,因为你尚未隐藏它们。 若要将其从播放器中隐藏,可以将每个标签的 ForeColor 属性设置为与其 BackColor 属性相同的颜色。

  4. 停止程序。 删除 AssignIconsToSquares() 方法中循环内已注释代码行的注释标记。

    iconLabel.ForeColor = iconLabel.BackColor;
    

如果再次运行程序,图标似乎已消失。 仅显示蓝色背景。 图标是随机分配的,仍然存在。

向标签添加事件处理程序

在此匹配游戏中,玩家显示隐藏的图标,然后显示第二个图标。 如果图标匹配,它们将保持可见。 否则,这两个图标将再次隐藏。

若要让游戏以这种方式工作,请添加一个 Click 事件处理程序,以更改所选标签的颜色以匹配背景。

  1. Windows 窗体设计器中打开表单。 选择“Form1.cs”或“Form1.vb”,然后选择“查看”>“设计器”。

  2. 选择第一个标签控件以将其选中,然后双击它,向代码添加名为 label1 _Click()Click 事件处理程序。

  3. 然后,按住 Ctrl 键,同时选择其他标签。 确保选中每个标签。

  4. 属性 窗口中,选择带有闪电符号的 事件 按钮。 对于“Click”事件,请在框中选择“label1_Click”

    屏幕截图显示“属性”窗口,其中显示了“单击”事件。

  5. 按下 Enter 键。 IDE 将名为 label1 _Click() 的 Click 事件处理程序添加到 Form1.csForm1.vb中的代码中。 由于选择了所有标签,因此处理程序将连接到每个标签。

  6. 填写代码的其余部分。

    /// <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() 代码。 否则,你将得到重复的代码块。

选择 调试>启动调试 以运行程序。 您应该看到一个背景为蓝色的空窗体。 选择窗体中的任何单元格。 其中一个图标应可见。 继续选择表单中的不同位置。 选择图标时,它们应显示。

屏幕截图显示具有一个可见图标的匹配游戏。

后续步骤

转到下一教程,了解如何使用计时器更改标签。

在匹配游戏 中使用计时器