使用Windows Forms的游戏开发入门
玩视频游戏总是很有趣,但制作一个游戏呢?在本教程中,我们将通过使用windows窗体制作一个名为Mastermind的小型益智游戏的步骤。Mastermind是一个益智游戏,测试玩家的记忆力和在所有可能性中确定准确输出的能力。
前提条件
在我们开始之前,作为读者的你应该具备以下条件。
-
对C#编程语言有基本了解。
-
对Windows窗体的基本了解。
-
在你的系统上安装Visual Studio。
如果你的电脑上没有安装Visual Studio,你可以查看这篇文章,了解如何在Visual Studio中设置C#环境,如果你是Windows Forms的新手,你可以查看这个教程,它将帮助你了解它的基础知识。
如何游戏
Mastermind的系统会在6种颜色中随机产生4种颜色(允许重复的颜色)。这些颜色对玩家来说是不可见的,直到他在游戏中获胜或失败。
- 玩家必须猜出系统所产生的4种颜色。
- 在输掉游戏之前,玩家有10次机会来猜测颜色,每一轮都会给你一个提示。
- 如果玩家选择了系统产生的数字中的一种颜色,但不是在正确的位置,它就会发红光。
- 如果该颜色包含在其中一个数字中,并且在正确的位置,它就会发黑光。
- 要想获胜,玩家必须将所有的颜色都放在正确的位置。
构建游戏
我们将使用工具箱来选择我们在这个游戏中需要的控件。首先,我们将为每轮游戏添加10个标签,为每个标签添加4个颜色按钮,一个检查按钮和4个提示按钮。最后,1个按钮用于开始(GO),4个按钮用于系统产生的隐藏颜色,1个按钮用于赢或输的声明。
这就是建立表格后的样子,记住,你可以随时改变字体和颜色,以符合你的口味!这是文本表格。

这是表格中使用的所有控件的文本和名称表。
| 文本 | 名称 |
|---|---|
| 1 | 标签1 |
| 2 | 标签2 |
| 3 | 标签3 |
| ... | |
| 10 | 标签10 |
| 空 | Col1 |
| 空 | Col2 |
| 空 | Col3 |
| ... | |
| 空 | Col40 |
| 检查 | ch1 |
| 检验 | ch2 |
| 检验 | ch3 |
| ... | |
| 检查 | ch10 |
| 空 | 显示1 |
| 空的 | 显示2 |
| 空 | 显示3 |
| ... | |
| 空 | 显示40 |
| 去 | 去 |
| 空 | 酷1 |
| 空的 | 凉2 |
| 空 | cool3 |
| 空 | 凉4 |
| 空的 | VIC |
让我们开始编写代码
首先,我们需要定义一个方法来改变所有按钮的颜色(Col1, Col2, Col3,...)。
为此,我们需要在玩家每次点击时改变按钮的颜色,在完成所有颜色后,它将重置计数器(i)并在每次点击时再次显示颜色。
int i = 0;
void Changecolor(Button x)
{
i++;
if (i == 1)
x.BackColor = Color.Blue;
if (i == 2)
x.BackColor = Color.Red;
if (i == 3)
x.BackColor = Color.Green;
if (i == 4)
x.BackColor = Color.Yellow;
if (i == 5)
x.BackColor = Color.Pink;
if (i == 6)
x.BackColor = Color.Purple;
if (i == 7)
i = 0;
}
在每个(Col1, Col2, Col3,...)按钮上,我们双击它,在它的按钮上使用这个方法而不是x。
private void Col1_Click(object sender, EventArgs e)
{
Changecolor(Col1);
}
private void Col2_Click(object sender, EventArgs e)
{
Changecolor(Col2);
}
// Repeat for all the buttons ...
private void Col40_Click(object sender, EventArgs e)
{
Changecolor(Col40);
}
现在我们需要定义GO方法,它将启动游戏并产生4种随机颜色。首先,我们从随机类中定义一个随机对象,然后用它来产生4个从1到6的随机数,每种颜色都会有一个值。
private void GO_Click(object sender, EventArgs e)
{
Random rnd = new Random();
int a = rnd.Next(1, 7);
int b = rnd.Next(1, 7);
int c = rnd.Next(1, 7);
int d = rnd.Next(1, 7);
int blue = 1, red = 2, green = 3, yellow = 4, pink = 5, purple = 6;
之后,我们需要检查随机方法为每个数字产生了什么,因此我们需要为每种颜色检查6次a 。
if (a == blue)
cool1.BackColor = Color.Blue;
if (a == red)
cool1.BackColor = Color.Red;
if (a == green)
cool1.BackColor = Color.Green;
if (a == yellow)
cool1.BackColor = Color.Yellow;
if (a == pink)
cool1.BackColor = Color.Pink;
if (a == purple)
cool1.BackColor = Color.Purple;
if (b == blue)
cool2.BackColor = Color.Blue;
if (b == red)
cool2.BackColor = Color.Red;
if (b == green)
cool2.BackColor = Color.Green;
if (b == yellow)
cool2.BackColor = Color.Yellow;
if (b == pink)
cool2.BackColor = Color.Pink;
if (b == purple)
cool2.BackColor = Color.Purple;
//Repeat this with the rest of the digits c & d.
ch1.Visible = true;
//The previous line will turn the first Check button to Visible to start the first round.
}
注意:在关闭该方法之前,你需要用c 和d 重复前面的代码。
现在我们需要定义检查方法,该方法将检查玩家选择的颜色,并将其与系统产生的颜色进行比较。
该方法将把玩家选择的四种颜色、系统生成的四种颜色和四个提示数字作为参数。
第一个条件将检查这四个颜色的数字是否被用户完全点击。如果按钮被点击了,它将打开第二个检查按钮,如果没有,它将让玩家知道他还没有选择四种颜色来完成这一轮。
void Check_button(Button Col1, Button Col2, Button Col3, Button Col4,
Button cool1, Button cool2, Button cool3, Button cool4,
Button Show1, Button Show2, Button Show3, Button Show4)
{
int q = 0;
int w = 0;
VIC.Text = "";
if (Col1.BackColor != Color.Gainsboro && Col2.BackColor != Color.Gainsboro && Col3.BackColor != Color.Gainsboro && Col4.BackColor != Color.Gainsboro)
ch2.Visible = true;
else
VIC.Text = "ENTER SOME COLORS DUMMY";
下一个片段将在每次发现玩家选择的颜色之一在系统产生的数字中(但不是在正确的位置)时,将(q)计数器增加1。
if (Col1.BackColor == cool1.BackColor || Col1.BackColor == cool2.BackColor || Col1.BackColor == cool3.BackColor || Col1.BackColor == cool4.BackColor)
q++;
if (Col2.BackColor == cool1.BackColor || Col2.BackColor == cool2.BackColor || Col2.BackColor == cool3.BackColor || Col2.BackColor == cool4.BackColor)
q++;
if (Col3.BackColor == cool1.BackColor || Col3.BackColor == cool2.BackColor || Col3.BackColor == cool3.BackColor || Col3.BackColor == cool4.BackColor)
q++;
if (Col4.BackColor == cool1.BackColor || Col4.BackColor == cool2.BackColor || Col4.BackColor == cool3.BackColor || Col4.BackColor == cool4.BackColor)
q++;
这个计数器将决定4个提示按钮中会有多少个红色按钮发光。
if (q == 1)
Show1.BackColor = Color.Red;
else if (q == 2)
{
Show1.BackColor = Color.Red;
Show2.BackColor = Color.Red;
}
else if (q == 3)
{
Show1.BackColor = Color.Red;
Show2.BackColor = Color.Red;
Show3.BackColor = Color.Red;
}
else if (q == 4)
{
Show1.BackColor = Color.Red;
Show2.BackColor = Color.Red;
Show3.BackColor = Color.Red;
Show4.BackColor = Color.Red;
}
下一段代码将检查有多少个由玩家选择的按钮具有相同的颜色和由系统产生的数字。第一行代码将给w计数器一个数字3,如果玩家选择的3个按钮有相同的颜色和系统产生的数字,以此类推。
if (Col1.BackColor == cool1.BackColor && Col2.BackColor == cool2.BackColor && Col3.BackColor == cool3.BackColor && Col4.BackColor != cool4.BackColor)
w = 3;
if (Col1.BackColor == cool1.BackColor && Col2.BackColor == cool2.BackColor && Col3.BackColor != cool3.BackColor && Col4.BackColor == cool4.BackColor)
w = 3;
if (Col1.BackColor == cool1.BackColor && Col2.BackColor != cool2.BackColor && Col3.BackColor == cool3.BackColor && Col4.BackColor == cool4.BackColor)
w = 3;
if (Col1.BackColor != cool1.BackColor && Col2.BackColor == cool2.BackColor && Col3.BackColor == cool3.BackColor && Col4.BackColor == cool4.BackColor)
w = 3;
if (Col1.BackColor == cool1.BackColor && Col2.BackColor == cool2.BackColor && Col3.BackColor != cool3.BackColor && Col4.BackColor != cool4.BackColor)
w = 2;
if (Col1.BackColor != cool1.BackColor && Col2.BackColor != cool2.BackColor && Col3.BackColor == cool3.BackColor && Col4.BackColor == cool4.BackColor)
w = 2;
if (Col1.BackColor != cool1.BackColor && Col2.BackColor == cool2.BackColor && Col3.BackColor == cool3.BackColor && Col4.BackColor != cool4.BackColor)
w = 2;
if (Col1.BackColor == cool1.BackColor && Col2.BackColor != cool2.BackColor && Col3.BackColor != cool3.BackColor && Col4.BackColor == cool4.BackColor)
w = 2;
if (Col1.BackColor != cool1.BackColor && Col2.BackColor == cool2.BackColor && Col3.BackColor != cool3.BackColor && Col4.BackColor == cool4.BackColor)
w = 2;
if (Col1.BackColor == cool1.BackColor && Col2.BackColor != cool2.BackColor && Col3.BackColor == cool3.BackColor && Col4.BackColor != cool4.BackColor)
w = 2;
if (Col1.BackColor == cool1.BackColor && Col2.BackColor != cool2.BackColor && Col3.BackColor != cool3.BackColor && Col4.BackColor != cool4.BackColor)
w = 1;
if (Col1.BackColor != cool1.BackColor && Col2.BackColor == cool2.BackColor && Col3.BackColor != cool3.BackColor && Col4.BackColor != cool4.BackColor)
w = 1;
if (Col1.BackColor != cool1.BackColor && Col2.BackColor != cool2.BackColor && Col3.BackColor == cool3.BackColor && Col4.BackColor != cool4.BackColor)
w = 1;
if (Col1.BackColor != cool1.BackColor && Col2.BackColor != cool2.BackColor && Col3.BackColor != cool3.BackColor && Col4.BackColor == cool4.BackColor)
w = 1;
if (Col1.BackColor == cool1.BackColor && Col2.BackColor == cool2.BackColor && Col3.BackColor == cool3.BackColor && Col4.BackColor == cool4.BackColor)
w = 4;
之后,我们将使用w计数器来确定有多少个黑色提示按钮会发光,如果是4个,那么你就赢得了游戏!
if (w == 1)
Show1.BackColor = Color.Black;
else if (w == 2)
{
Show1.BackColor = Color.Black;
Show2.BackColor = Color.Black;
}
else if (w == 3)
{
Show1.BackColor = Color.Black;
Show2.BackColor = Color.Black;
Show3.BackColor = Color.Black;
}
else if (w == 4)
{
Show1.BackColor = Color.Black;
Show2.BackColor = Color.Black;
Show3.BackColor = Color.Black;
Show4.BackColor = Color.Black;
VIC.Text = "VICTORY !";
cool1.Visible = true;
cool2.Visible = true;
cool3.Visible = true;
cool4.Visible = true;
}
}
最后,我们将对所有10个检查按钮使用这种方法。
private void ch1_Click(object sender, EventArgs e)
{
Check_button(Col1,Col2,Col3,Col4,cool1,cool2,cool3,cool4,Show1,Show2,Show3,Show4);
GO.Visible=false;
}
private void ch2_Click(object sender, EventArgs e)
{
Check_button(Col5,Col6,Col7,Col8,cool1,cool2,cool3,cool4,Show5,Show6,Show7,Show8);
ch3.Visible = true;
}
private void ch3_Click(object sender, EventArgs e)
{
Check_button(Col9, Col10, Col11, Col12, cool1, cool2, cool3, cool4, Show9, Show10, Show11, Show12);
ch4.Visible = true;
}
//Repeat for all the Check buttons...
最后一个检查按钮将有一个额外的代码,因为到达最后一轮而没有获胜意味着你已经失去了游戏。
private void ch10_Click(object sender, EventArgs e)
{
Check_button(Col37, Col38, Col39, Col40, cool1, cool2, cool3, cool4, Show37, Show38, Show39, Show40);
if(VIC.Text!= "VICTORY !")
VIC.Text = "YOU HAVE LOST DUMMY !";
ch1.Visible = false;
ch2.Visible = false;
ch3.Visible = false;
ch4.Visible = false;
ch5.Visible = false;
ch6.Visible = false;
ch7.Visible = false;
ch8.Visible = false;
ch9.Visible = false;
ch10.Visible = false;
cool1.Visible = true;
cool2.Visible = true;
cool3.Visible = true;
cool4.Visible = true;
}
总结
在本教程中,我们使用windows窗体创建了一个名为Mastermind的拼图游戏。我们使用了控件和属性窗口来创建表单,然后我们将这些控件与表单中的方法连接起来。为了增加乐趣,请尝试用Mastermind挑战你的朋友吧不要忘了测试一下代码,以充分了解它的工作原理。