Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
软件频道>开发者网络>微软开发专栏>ASP.NETC#VB.NETVC.NET技术专题XML|软件频道产品中心群乐下载群乐:大家耍QQ
您现在的位置: 天极网 > 开发频道 > 微软开发专栏 > 使用WPF和WWF开发猜单词游戏
全文

使用WPF和WWF开发猜单词游戏

2006-09-13 08:00 作者: 出处: 天极开发 责任编辑:方舟
  摘要 本文介绍使用新的Windows Presentation Foundation提供的3D图形和可用于Workflow Foundation(经由DmRules)中的函数库来开发一个简单的猜单词游戏。本文意在向读者展示.Net 3.0开发交互式3D应用程序的简易性。注:图1显示了本游戏的一个运行快照。


图1.猜字游戏运行过程中

  一、 简介

  .Net 3.0为程序员提供了大量的新工具。其实,其最终目的是使得所有程序员都能够轻松地开发3D应用程序。Vista把图形处理功能交给了视频卡来完成(大多数情况下,我们很可能已经购买了这样的视频卡)。这使得我们不必自己处理以前非常昂贵的计算问题而且不必担心因此减弱性能。

  首先确定我必须确定我开发的DmRules库能否应用于程序中。游戏的原始界面很简单,是以Windows表单实现的,这足以满足游戏的需要了。而且,这个界面还可以向你展示DmRules库的工作原理。我决定使用WPF来实现一些3D内容;为运行本游戏,你需要安装.Net 3.0。

  二、 游戏规则

  这个游戏很简单。在Yahoo Games中有一个我很喜欢玩的称作"Text Twist"的游戏,这里描述的游戏使用的规则与之很类似。基本上是首先提供给你一个由6个字母组成的单词。最终,你必须猜测这个单词。你还可以通过查找其它多于两个字母长度的单词得分,只要它们使用的字母出现在原始单词中就行。

  你可以使用很多种方法来编写这个游戏的规则。在这个游戏中,每个人都有一组规则。例如,一个人可以决定,如果你设法找到不是原始单词的10个单词,那么你仍应该赢得这一回合。其他玩家在猜测中提供多少字母方面可能更看重得分。得分,游戏规则,单词列表,时间限制……所有这些都可以使用规则来进行控制。这也正是为什么我选择这个游戏作为使用DmRules的一个例子。

  DmRules库允许你在App.config文件中编写规则。这些规则是针对每一种类型设计的。这影响到我在该游戏中设计这些类的方式。规则被应用于两个方面:用户作的猜测类(SingleGuess)和当前游戏类(Game)。

  (一) SingleGuess类

  一个猜测是用户选择的一个字母序列。在一次猜测中,我需要决定两个方面:猜测正确吗?如果猜测是正确的,它值多少点(得多少分)?

  为了确定猜测的正确性,我编写了一组规则。每一条规则都是使用App.config文件(如下代码所示)实现的。你已经看出,你可以把这些表达式编写成实际的XML。如此我们可以在以后很容易地改变这些规则而不需要重新进行编译。

  1. 如果猜测有不到3个字母,那么它是不正确的。

<DmRule cond="this._GuessText.Length < 3" name="More than 2 letters"
haltAfterThen="true" priority="1000">
<ThenStmts>
<DmCdStmt xsi:type="Assignment" left="this._IsCorrect" right="false" />
<DmCdStmt xsi:type="Assignment" left="this._ErrorText"
right=""Word must have at least 3 letters"" />
</ThenStmts>
</DmRule>

  2. 如果猜测使用不是在系统提供字母列表中的字母,那么它是不正确的。

<DmRule cond="!this._Game.HasLetters(this._GuessText)"
name="Has correct letters" haltAfterThen="true" priority="990">
<ThenStmts>
<DmCdStmt xsi:type="Assignment" left="this._IsCorrect" right="false" />
<DmCdStmt xsi:type="Assignment" left="this._ErrorText"
right=""Letters not in scrambled word"" />
</ThenStmts>
</DmRule>

  3. 如果猜测已经完成,那么它是不正确的。

<DmRule cond="this._Game.GuessesMade.Contains(this._GuessText)"
name="Already guessed" haltAfterThen="true" priority="980">
<ThenStmts>
<DmCdStmt xsi:type="Assignment" left="this._IsCorrect" right="false" />
<DmCdStmt xsi:type="Assignment" left="this._ErrorText"
right=""You've already guessed that word"" />
</ThenStmts>
</DmRule>

  4. 如果猜测的单词在字典中,那么它是正确的。否则,不正确。

<DmRule cond="DictUtil.IsWordInList(this._GuessText)" name="Is in dictionary"
haltAfterElse="true" priority="970">
<ThenStmts>
<DmCdStmt xsi:type="Assignment" left="this._IsCorrect" right="true" />
</ThenStmts>
<ElseStmts>
<DmCdStmt xsi:type="Assignment" left="this._IsCorrect" right="false" />
<DmCdStmt xsi:type="Assignment" left="this._ErrorText"
right=""Word is not in dictionary"" />
</ElseStmts>
</DmRule>

  你可能已经注意到,上面规则中的优先权(priority)属性。必须把它添加到DmRules上,因为Workflow Foundation的规则系统并不能保证规则被以任何特定顺序执行,除非明确地指定一种优先权。相应的数字越高,将越早执行该规则。优先权也可以是负数。

  另外,还有haltAfterThen和haltAfterElse属性。有时,根据一种特定规则的计算方式,或者因为运行任何其它的规则可能效率不高或者因为其它规则能够以一种你不想使用的方式修改状态,你可能想停止运行规则。在给定上面说明的规则优先权的情况下,一旦猜测被确定是不正确的,那么应该立即停止运行相应的规则。Workflow Foundation实际上提供了一种规则语句,其中有一条能够被插入到一个规则列表的任何位置的暂停(halt)命令。但是,把一条halt语句插入到上面配置文件中间对系统不无副影响,因为在一条规则中不允许存在循环或条件。因此,我决定仅使用属性并且把halt语句添加到规则列表的最后。

  SingleGuess类中还有更多的规则。这些规则必须处理一个正确猜测的得分方式。得分是基于在该单词中有多少个字母以及是否猜测匹配原始单词。为了进行下一个回合的游戏,我决定如果你正确猜测了一个6个字母的单词,那么你已经过了这一关。如你所见,这是容易改变的:

<DmRule cond="this._GuessText == this._Game.OriginalWord" name="Guessed original word">
<ThenStmts>
<DmCdStmt xsi:type="ExprStmt" expr="this._Game.Complete()"/>
<DmCdStmt xsi:type="Assignment" left="this._Score" right="40"/>
</ThenStmts>
<ElseStmts/>
</DmRule>
<DmRule
cond="this._GuessText != this._Game.OriginalWord && this._GuessText.Length == 6"
name="Guessed six-letter word">
<ThenStmts>
<DmCdStmt xsi:type="ExprStmt" expr="this._Game.Complete()"/>
<DmCdStmt xsi:type="Assignment" left="this._Score" right="25"/>
</ThenStmts>
<ElseStmts/>
</DmRule>
<DmRule cond="this._GuessText.Length == 3" name="Score 3-letter">
<ThenStmts>
<DmCdStmt xsi:type="Assignment" left="this._Score" right="10"/>
</ThenStmts>
<ElseStmts/>
</DmRule>
<DmRule cond="this._GuessText.Length == 4" name="Score 4-letter">
<ThenStmts>
<DmCdStmt xsi:type="Assignment" left="this._Score" right="15"/>
</ThenStmts>
<ElseStmts/>
</DmRule>
<DmRule cond="this._GuessText.Length == 5" name="Score 5-letter">
<ThenStmts>
<DmCdStmt xsi:type="Assignment" left="this._Score" right="20"/>
</ThenStmts>
<ElseStmts/>
</DmRule>

共5页。 1 2 3 4 5 8 :
网友关注
最新上市
编辑推荐
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml