用 C#.NET 编写的一个完整字谜游戏

这篇博客介绍了如何使用C#.NET编写一个完整的字谜游戏,包括载入类别和单词、游戏逻辑以及作弊码功能。代码示例展示了读取和加密单词文件、在网格上放置单词、计分机制以及处理用户输入的过程。此外,还涵盖了检查用户输入的有效性和游戏画布的更新。

介绍

字谜游戏,可能你在许多益智书中都曾看到过。试着在电脑上用不同类别的内容写字谜游戏,并且有自定义字词去玩也是很有意思的。

背景

我很早以前使用Turbo C编码游戏,但我丢失了代码。我觉得用C#.NET让它复活将是一件很伟大的事情。该语言在内存、GC、图形方面提供了很多灵活性,而这些是我在使用C语言的时候必须小心处理的。但是在C语言中的明确关注,会让我们学到很多(这就是为什么C语言被称为“上帝的编程语言”的原因)。另一方面,因为C#.NET照顾到了这些,所以我可以专注于其他地方的增强,例如字的方向,重叠,作弊码,计分,加密等。所以在欣赏两种语言的时候需要有一个平衡。
在题目中我之所以说它是“完整的”,原因如下:
1)它有一些类别的预设词。
2)它在加密文件中保存单词和分数,这样就没有人可以篡改文件。如果要篡改,那么它将恢复到预设并从头开始计分。
3)它有作弊码,但作弊会不利于得分,且显然作弊一旦应用会使分数归零。
4)它有一个计分机制。

使用代码

游戏提供以下功能,具体我将在随后的章节中讨论:
1)载入类别和单词:从程序中硬编码的预设中加载单词。然而,如果玩家提供自定义的单词,那么游戏将自动把所有这些(连同预设)存储在文件中并从那里读取。
2)放在网格上:游戏将所有的单词随机地放在18×18的矩阵中。方向可以是水平,垂直,左下和右下,如上图中所示。
3)计分:对于不同类别,分数单独存储。分数的计算方式是单词的长度乘以乘法因子(这里为10)。与此同时,在找到所有的单词之后,剩余时间(乘以乘法因子)也会加到分数中。
4)显示隐藏的单词:如果时间用完之后,玩家依然找不到所有的单词,那么游戏会用不同的颜色显示没找到的单词。
5)作弊码:游戏在游戏板上提作弊码(mambazamba)。作弊码只简单地设置了一整天的时间(86,400秒)。但是,应用作弊码也会应用让此次运行的计分为零的惩罚。

1)载入类别和单词:

载入预设
我们有一个简单的用于持有类别和单词的类:

class WordEntity{    public string Category { getset; }    public string Word { getset; }}

我们有一些预设的类别和单词如下。预设都是管道分隔的,其中每第15个单词是类别名称,后面的单词是该类别中的单词。

private string PRESET_WORDS ="COUNTRIES|BANGLADESH|GAMBIA|AUSTRALIA|ENGLAND|NEPAL|INDIA|PAKISTAN|TANZANIA|SRILANKA|CHINA|CANADA|JAPAN|BRAZIL|ARGENTINA|" +"MUSIC|PINKFLOYD|METALLICA|IRONMAIDEN|NOVA|ARTCELL|FEEDBACK|ORTHOHIN|DEFLEPPARD|BEATLES|ADAMS|JACKSON|PARTON|HOUSTON|SHAKIRA|" +...

我们使用加密在文件中写这些单词。所以没有人可以篡改文件。对于加密我使用了一个从这里借鉴的类。使用简单——你需要传递字符串和用于加密的加密密码。对于解密,你需要传递加密的字符串和密码。
如果文件存在,那么我们从那里读取类别和单词,否则我们保存预设(以及玩家自定义的单词)并从预设那里读取。这在下面的代码中完成:

if (File.Exists(FILE_NAME_FOR_STORING_WORDS))   // If words file exists, then read it.    ReadFromFile();else{   // Otherwise create the file and populate from there.    string EncryptedWords = StringCipher.Encrypt(PRESET_WORDS, ENCRYPTION_PASSWORD);    using (StreamWriter OutputFile = new StreamWriter(FILE_NAME_FOR_STORING_WORDS))        OutputFile.Write(EncryptedWords);    ReadFromFile();}

ReadFromFile()方法简单地从存储单词的文件中读取。它首先尝试解密从文件读取的字符串。如果失败(由返回的空白字符串确定),它将显示关于问题的一条消息,然后从内置预设重新加载。否则它从字符串读取并将它们分成类别和单词,并把它们放在单词列表中。每第15个词是类别,后续词是该类别下的单词。

string Str = File.ReadAllText(FILE_NAME_FOR_STORING_WORDS);string[] DecryptedWords = StringCipher.Decrypt(Str, ENCRYPTION_PASSWORD).Split('|');if (DecryptedWords[0].Equals(""))  // This means the file was tampered.{    MessageBox.Show("The words file was tampered. Any Categories/Words saved by the player will be lost.");    File.Delete(FILE_NAME_FOR_STORING_WORDS);    PopulateCategoriesAndWords();   // Circular reference.    return;}string Category = "";for (int i = 0; i <= DecryptedWords.GetUpperBound(0); i++){    if (i % (MAX_WORDS + 1) == 0)   // Every 15th word is the category name.    {        Category = DecryptedWords;        Categories.Add(Category);    }    else    {        WordEntity Word = new WordEntity();        Word.Category = Category;        Word.Word = DecryptedWords;        WordsList.Add(Word);    }}

保存玩家的自定义词
游戏可供应由玩家提供的自定义词。设备位于相同的加载窗口。单词应该最少3个字符长,最多10个字符长,并且需要14个单词——不多也不能不少。指示在标签中。另外单词不能是任何其他词的子部分。例如:不能有如’JAPAN’和’JAPANESE’这样两个词,因为前者包含在后者中。
 
我将简要介绍一下有效性检查。有3个关于最大长度、最小长度和SPACE输入(不允许空格)的即时检查。这通过将我们自定义的处理程序Control_KeyPress添加到单词条目网格的EditingControlShowingevent中来完成。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值