GrandSlam - 一款纸牌游戏(类似 Windows Hearts)






4.71/5 (12投票s)
一篇关于使用 GDI+ 进行 Windows Forms 游戏开发的,基于 if 语句的智能游戏的文章。

引言
本文是关于使用 GDI+ 的功能来构建一个基于 if 语句的智能游戏。 我试图让它的 GUI 看起来像 Windows Hearts 游戏,并让它的逻辑尽可能地智能,使用基于 if 语句的逻辑。 我试图通过最小化窗体重绘来使 GUI 无闪烁,并且我还试图以自然的方式模拟游戏中的所有内容。 也就是说,洗牌,找到要打出的最佳牌,预先配置(在 GrandSlam
中的一个特殊步骤),等等。 这个项目的另一个有用的特性是它包含两个项目。 首先,一个名为 Card
的库项目 (DLL),可以在您单独开发的任何纸牌游戏中被使用。 其次,名为 GrandSlam
的 Windows Forms 项目,它处理应用程序的 GUI 和基于 if 语句的智能逻辑(一个好主意是将这个区域分成两个单独的类)。
背景
GrandSlam
(在波斯语中称为 Shelem) 是一款 纸牌 游戏,有四个玩家,分为两队,就像你在上面的屏幕截图中看到的那样,类似于 Windows Hearts。 请参考 维基百科 获取游戏的详细描述。
Using the Code
如果您想开发一个新的纸牌游戏,只需添加对 Card.dll 的引用并使用其 Mehran.Card
类;这个类具有足够的松散耦合,可以做你想做的事情。 您可以使用以下构造函数创建一个新实例(完整的参数构造函数)
public Card(CardValues value, CardType type, Point topLeft)
如您所见,这个类同时处理逻辑和 GUI。 它还有一个用于在提供的 Graphics
对象中绘制牌的方法
public void Draw(Graphics grp)
牌程序集包含绘制每张牌所需的资源 (包括牌图)。 确切地说,程序集不包含每张牌的 52 张图片,但它仅包含所需的部分,如 4 种牌型符号。
但是,GrandSlam
类的基于 if 语句的智能逻辑超出了本文的范围,所以我将在另一篇文章中描述它(请耐心等待)。 关于它的 GUI,我使用一个名为 PrefigureControl
的单独的 UserControl
来处理预先配置步骤。 它不包含任何复杂的东西。 构造函数将其添加到窗体的控件列表中,并且在完成其工作后,它将隐藏自己。
#region prefigure Control
prefigureControl = new PrefigureControl();
prefigureControl.Location = new Point(200,200);
prefigureControl.OK += new EventHandler(Prefigure_OK);
Controls.Add(prefigureControl);
....
它还扮演一个额外的角色,它捕获玩家的姓名。 在 Prefigure_OK
方法中,姓名将显示在游戏开始的位置,从这里开始,应用程序应该尊重在窗体的 OnMouseDown
事件上的用户交互。
if(userCardsRect.Contains(e.X,e.Y) && deckNum != -1 && !startButtonVisible)
{
...
在这里,调用 Play(int ind)
方法来更改数据和视图 (MVC 中的模型),您可以看到每个 GUI 操作都是在不调用 Invalidate()
方法的情况下完成的,因为它如果经常使用会闪烁。
另一个技巧是,当四个玩家打出他们的牌时,我将线程休眠 2 秒钟,然后从窗体中收集牌以模拟现实
System.Threading.Thread.Sleep(2000);
CollectCenter();
请注意“视图常量”区域,其中包含显示配置常量。
如果您能对这篇文章提出您的意见和反馈,我将不胜感激。
历史
- 2007 年 5 月 6 日:初始发布