版权声明:本文为博主原创文章,未经博主允许不得转载。                    https://blog.csdn.net/u011528448/article/details/24670471               </div><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><div class="htmledit_views" id="content_views">

场景

设计规则

a) 这是一个单人玩的游戏。

b) 可以分三个级别,分别是高级、中级、低级。不同级别对应的单词系列也不一样。要求一旦玩家选定了要玩的级别,应当先提示它关于此级别最高分是多少,是谁创下的记录,然后再开始游戏。

c) 游戏开始后,应显示如下信息:

i. 剩余可用竞猜次数(竞猜次数的初始值等于被猜的单词遗漏的字符数加5),

ii. 玩家所得分数:完全猜对一个单词得一分。

iii. 已用时间:要每10秒更新一次已用时间的显示。

iv. 竞猜的单词。只显示每个单词的部分字母,并且这些字母是随机显示出来的。刻意遗漏的字母应当使用*替代。应当有多少字母被显示出来,视单词的长度而定,如果单词本身较长,则多显示,反之亦然。

d) 游戏结束前,比较一家玩家的成绩与文件中存储的词汇通英雄的成绩,如果前者成绩更高,需要将如下信息保存在文件中。(成绩:猜对的单词数*100/一共花费的时间)

i. 玩家姓名

ii. 所用时间

iii. 分数。

另外,要注意的是,如果发现他们分数相同就比较使用的时间。

还有,不同级别的词汇通英雄信息应当分别放在不同的文件中。

e) 如果玩家在给定次数内(选取20次)没有猜出5个单词,则游戏结束。

实验方法

参照学生信息管理系统。

1.    创建一个线程专门负责时间提醒

2.    采用两种用户,管理员负责将游戏初始化,更新词汇表,之前自动更新和逐个输入

3.    玩家玩游戏

单词竞猜  
Program类 主函数
TextOperateClass类 文本操作类

玩家主函数:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Collections;
  7. using System.Timers;
  8. using System.Threading;
  9. namespace WordsPlay
  10. {
  11. class Program
  12. {
  13. static DateTime initTime;
  14. static void Main(string[] args)
  15. {
  16. Console.WriteLine("------------------------------------------------");
  17. Console.WriteLine("------------ ------------");
  18. Console.WriteLine("------------ 欢迎来到单词竞猜游戏 ------------");
  19. Console.WriteLine("------------ CopyRight:Sunsea ------------");
  20. Console.WriteLine("------------ ------------");
  21. Console.WriteLine("------------------------------------------------");
  22. Console.WriteLine("请输入你的姓名:");
  23. string username = string.Format(Console.ReadLine()); //玩家姓名
  24. Console.WriteLine("请选择游戏级别:\n\t1.高级 \n\t2.中级 \n\t3.低级");
  25. int grade = int.Parse(Console.ReadLine()); //玩家选择的等级
  26. while (grade < 1 || grade > 3)
  27. {
  28. Console.WriteLine("请输入1~3的正整数!");
  29. grade = int.Parse(Console.ReadLine());
  30. }
  31. //查询最高分
  32. string s = TextOperateClass.ReadMaxScore(grade);
  33. int maxScore = Convert.ToInt16(s.Substring(s.IndexOf("#") + 1, s.LastIndexOf("#") - s.IndexOf("#")-1));
  34. string maxScoreUsername = s.Substring(s.LastIndexOf("#") + 1, s.Length - s.LastIndexOf("#") - 1);
  35. //输出记录信息
  36. string maxScoreMessage = string.Format("当前最高分记录{0}分,记录保持者{1}",maxScore,maxScoreUsername);
  37. Console.WriteLine(maxScoreMessage);
  38. //初始化玩家分数,没猜对一个得一分
  39. int playerScore = 0;
  40. //猜词次数
  41. int guessRightNums = 0;
  42. //可以无限制猜词,最大循环次数1000
  43. int countWhile = 1000;
  44. //如果在20次内没能猜正5个,退出
  45. initTime = DateTime.Now; //记录猜词起始时间
  46. //单独线程用于定时
  47. Thread timeThread = new Thread(TimeRemind);
  48. timeThread.Start(); //在主线程调用TimeRemind方法
  49. while (countWhile>0)
  50. {
  51. string fullWord = TextOperateClass.ReadFullWords(grade); //获取一个完整单词
  52. string vagueWord = TextOperateClass.VagueWords(fullWord); //获取一个被*替换字母的单词
  53. Console.WriteLine("请猜{0}的完整拼写:",vagueWord);
  54. //一个单词有6次参测机会
  55. int SingleWordGuessNums = 6;
  56. while (SingleWordGuessNums>0)
  57. {
  58. string playerGuessWord = Console.ReadLine(); //获取玩家猜测
  59. if (playerGuessWord.Equals(fullWord))
  60. {
  61. guessRightNums++;
  62. break;
  63. }
  64. else
  65. {
  66. Console.WriteLine("你的猜测有误,是否放弃本单词猜测:放弃<y>,不放弃继续猜!");
  67. try
  68. {
  69. //如果输入字符超过一个,抛出异常
  70. if (char.Parse(Console.ReadLine()) == 'y')
  71. break;
  72. }
  73. catch (Exception)
  74. {
  75. Console.WriteLine("输入错误");
  76. }
  77. }
  78. SingleWordGuessNums--;
  79. }
  80. //判断是继续还是退出
  81. string isContinue;
  82. while (true)
  83. {
  84. Console.WriteLine("继续请输<y>,退出请输<n>?");
  85. isContinue = Console.ReadLine();
  86. if (isContinue != "y" && isContinue != "n" && isContinue != "Y" && isContinue != "N")
  87. Console.WriteLine("请按提示正确输入,是否继续!");
  88. else
  89. break;
  90. }
  91. if (isContinue == "n")
  92. break;
  93. //猜词次数自减
  94. countWhile--;
  95. //如果在20次中没猜正5个,游戏强退
  96. if (countWhile <= 1000 - 20 && guessRightNums < 5)
  97. {
  98. Console.WriteLine("Sorry,你在20个单词中猜正确的单词不达5个,游戏结束");
  99. break;
  100. }
  101. }
  102. //获取用时
  103. DateTime endTime = DateTime.Now;
  104. TimeSpan userTime = endTime - initTime;
  105. double userTimeSeconds = userTime.TotalSeconds;
  106. #region
  107. //更新最高分
  108. if (guessRightNums > maxScore)
  109. {
  110. TextOperateClass.UpdataMaxScore(grade, guessRightNums, username);
  111. Console.WriteLine("恭喜你打破了得分记录");
  112. }
  113. string messageMaxScore = string.Format("你<{0}>在{1}中的得分是{2}", username, TextOperateClass.GradeString(grade),guessRightNums);
  114. Console.WriteLine(messageMaxScore);
  115. #endregion
  116. //词汇通英雄操作区域
  117. #region
  118. //查询词汇通英雄成绩
  119. string wordsHero =TextOperateClass.ReadMaxPerformance(grade);
  120. int maxPerformance = Convert.ToInt16(wordsHero.Substring(wordsHero.IndexOf("#", 3) + 1, wordsHero.LastIndexOf("#") - wordsHero.IndexOf("#", 3) - 1));
  121. int totalTime =Convert.ToInt16( wordsHero.Substring(wordsHero.LastIndexOf("#") + 1, wordsHero.Length - wordsHero.LastIndexOf("#") - 1));
  122. //成绩=猜对的单词数*100/一共花费的时间;
  123. playerScore = guessRightNums * 100 / (int)userTimeSeconds;
  124. //更新成绩
  125. if (playerScore > maxPerformance || (playerScore == maxPerformance && (int)userTimeSeconds < totalTime))
  126. {
  127. messageMaxScore = string.Format("恭喜你<{0}>成为{1}中新的词汇通英雄,你的成绩{2},用时{3}秒", username, TextOperateClass.GradeString(grade), playerScore, (int)userTimeSeconds);
  128. Console.WriteLine(messageMaxScore);
  129. TextOperateClass.UpdataMaxperformance(grade, username, playerScore, (int)userTimeSeconds);
  130. }
  131. #endregion
  132. timeThread.Abort();
  133. Console.WriteLine("------------------------------------------------");
  134. Console.WriteLine("------------ ------------");
  135. Console.WriteLine("----------- 欢迎再来,按任意键结束 -----------");
  136. Console.WriteLine("------------ CopyRight:Sunsea ------------");
  137. Console.WriteLine("------------ ------------");
  138. Console.Write("------------------------------------------------");
  139. Console.ReadLine();
  140. }
  141. //定时提醒 10s
  142. public static void TimeRemind()
  143. {
  144. System.Timers.Timer t = new System.Timers.Timer();
  145. t.Elapsed += new ElapsedEventHandler(writesecond);
  146. t.Interval = 10000;
  147. t.Enabled = true;
  148. Console.ReadLine();
  149. }
  150. public static void writesecond(object source, ElapsedEventArgs e)
  151. {
  152. TimeSpan userTime = DateTime.Now - initTime;
  153. Console.WriteLine(string.Format("已用时{0}秒",(int)userTime.TotalSeconds));
  154. }
  155. }
  156. }

文本操作类:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Collections;
  7. using System.Text.RegularExpressions;
  8. using System.Timers;
  9. namespace WordsPlay
  10. {
  11. public class TextOperateClass
  12. {
  13. //获取级别
  14. public static string GradeString(int grade)
  15. {
  16. string gradeString = ;
  17. switch (grade)
  18. {
  19. case 1:
  20. gradeString = "高级";
  21. break;
  22. case 2:
  23. gradeString = "中级";
  24. break;
  25. case 3:
  26. gradeString = "初级";
  27. break;
  28. }
  29. return gradeString;
  30. }
  31. //根据级别获取单词存储路径
  32. private static string GradePath(int grade)
  33. {
  34. string gradePath = ;
  35. switch (grade)
  36. {
  37. case 1:
  38. gradePath =@"e:\01111139\HighLevelWord.txt";
  39. break;
  40. case 2:
  41. gradePath = @"e:\01111139\MiddleLevelWord.txt";
  42. break;
  43. case 3:
  44. gradePath = @"e:\01111139\LowLevelWord.txt";
  45. break;
  46. }
  47. return gradePath;
  48. }
  49. //按级别读取最高分
  50. public static string ReadMaxScore(int grade)
  51. {
  52. //获取级别
  53. string gradeString = GradeString(grade);
  54. FileStream fs = new FileStream(@"e:\01111139\MaxScore.txt",FileMode.Open,FileAccess.Read);
  55. StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
  56. string line = ;
  57. while ((line = sr.ReadLine()) != )
  58. {
  59. int count = line.IndexOf(gradeString);
  60. if (count == 0)
  61. {
  62. sr.Close();
  63. fs.Close();
  64. return line;
  65. }
  66. }
  67. //暂时没有记录
  68. sr.Close();
  69. fs.Close();
  70. return ;
  71. }
  72. //读取最高成绩
  73. public static string ReadMaxPerformance(int grade)
  74. {
  75. //获取级别
  76. string gradeString = GradeString(grade);
  77. FileStream fs = new FileStream(@"e:\01111139\WordsHero.txt", FileMode.Open, FileAccess.Read);
  78. StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
  79. string line = ;
  80. while ((line = sr.ReadLine()) != )
  81. {
  82. int count = line.IndexOf(gradeString);
  83. if (count == 0)
  84. {
  85. sr.Close();
  86. fs.Close();
  87. return line;
  88. }
  89. }
  90. //暂时没有记录
  91. sr.Close();
  92. fs.Close();
  93. return ;
  94. }
  95. //更新得分 //grade及为对应的行数
  96. public static void UpdataMaxScore(int grade, int score, string username)
  97. {
  98. //获取级别
  99. string gradeString = GradeString(grade);
  100. string newLineValue = string.Format("{0}#{1}#{2}", gradeString, score, username);//要更新的行
  101. FileStream fs = new FileStream(@"e:\01111139\MaxScore.txt", FileMode.Open, FileAccess.Read);
  102. StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
  103. //定义一个数组存放内容
  104. string[] maxScoreLine = new string[3];
  105. string line;
  106. for (int i = 0; (line = sr.ReadLine()) != ; i++)
  107. {
  108. maxScoreLine[i] = line;
  109. }
  110. sr.Close();
  111. fs.Close();
  112. //清空文档内容
  113. FileStream fsw = new FileStream(@"e:\01111139\MaxScore.txt", FileMode.Create, FileAccess.Write); //覆盖创建
  114. StreamWriter sw = new StreamWriter(fsw, System.Text.Encoding.Default);
  115. string subLine;
  116. foreach (string str in maxScoreLine)
  117. {
  118. subLine = str.Substring(0, 2);
  119. if (subLine.Equals(gradeString))
  120. {
  121. sw.WriteLine(newLineValue);
  122. }
  123. else
  124. {
  125. sw.WriteLine(str);
  126. }
  127. }
  128. sw.Close();
  129. fsw.Close();
  130. }
  131. //更新成绩
  132. public static void UpdataMaxperformance(int grade, string username, int playerScore, double userTimeSeconds)
  133. {
  134. //获取级别
  135. string gradeString = GradeString(grade);
  136. string newLineValue = string.Format("{0}#{1}#{2}#{3}", gradeString, username, playerScore, userTimeSeconds);//要更新的行
  137. FileStream fs = new FileStream(@"e:\01111139\WordsHero.txt", FileMode.Open, FileAccess.Read);
  138. StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
  139. //定义一个数组存放内容
  140. string[] maxScoreLine = new string[3];
  141. string line;
  142. for (int i = 0; (line = sr.ReadLine()) != ; i++)
  143. {
  144. maxScoreLine[i] = line;
  145. }
  146. sr.Close();
  147. fs.Close();
  148. //清空文档内容
  149. FileStream fsw = new FileStream(@"e:\01111139\WordsHero.txt", FileMode.Create, FileAccess.Write);
  150. StreamWriter sw = new StreamWriter(fsw, System.Text.Encoding.Default);
  151. string subLine;
  152. foreach (string str in maxScoreLine)
  153. {
  154. subLine = str.Substring(0, 2);
  155. if (subLine.Equals(gradeString))
  156. {
  157. sw.WriteLine(newLineValue);
  158. }
  159. else
  160. {
  161. sw.WriteLine(str);
  162. }
  163. }
  164. sw.Close();
  165. fsw.Close();
  166. }
  167. //读取单词,
  168. //根据读取到的单词,将单词模糊化
  169. public static string VagueWords(string fullWord)
  170. {
  171. //模糊化处理
  172. //将单词转化成字符数组
  173. char[] arrWord = fullWord.ToCharArray();
  174. //*代替字符数是单词长度的1/3
  175. int nums = arrWord.Length / 3;
  176. List<int> myListRdm = new List<int>();
  177. myListRdm = CreateNum(nums,0,arrWord.Length);
  178. //将随机数对应的位置,字母特换成*
  179. int index=0;
  180. for (int i = 0; i < myListRdm.Count; i++)
  181. {
  182. index=myListRdm[i];
  183. arrWord[index] = '*';
  184. }
  185. //将arrWord[]数组中的元素生成字符串
  186. StringBuilder st = new StringBuilder();
  187. foreach (char c in arrWord)
  188. {
  189. st = st.Append(c);
  190. }
  191. string vagueWord = st.ToString();
  192. return vagueWord; //可以根据单词长度获得遗漏的字符数
  193. }
  194. //在【min,max】区间中产生num个不相等的随机数,存在数组中,返回
  195. private static List<int> CreateNum(int nums,int min,int max)
  196. {
  197. List<int> MyList = new List<int>();
  198. Random random = new Random();
  199. //循环的次数为产生随机数个数
  200. while (true)
  201. {
  202. int i = random.Next(min, max);
  203. if (!MyList.Contains(i))
  204. {
  205. if (MyList.Count < nums)
  206. {
  207. MyList.Add(i);
  208. }
  209. else
  210. break;
  211. }
  212. }
  213. return MyList;
  214. }
  215. //返回完整单词
  216. //自行产生随机数读取。随机数的范围是(0,单词总数)
  217. public static string ReadFullWords(int grade)
  218. {
  219. //获取单词获取路径
  220. string gradePath = GradePath(grade);
  221. FileStream fs = new FileStream(gradePath, FileMode.Open, FileAccess.Read);
  222. StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
  223. string wordsString = sr.ReadToEnd();
  224. //Regex是正则表达式啊的类啊,引用using System.Text.RegularExpressions就可以看到了
  225. string[] wordsArr = Regex.Split(wordsString, " ");
  226. Random rd = new Random();
  227. int num = rd.Next(1, wordsArr.Length);
  228. return wordsArr[num];
  229. }
  230. }
  231. }

说明事项

1、文本操作乱码问题,运行之前需要在E盘创建01111139文件夹,E:\01111139\*.txt
           2、更新文本文档中的内容可以通过将文本文档读取放在数组中,然后覆盖创建文档,
                更新数组,然后在写回。
           3、这里面用了委托机制,创建一个单独的线程负责时间提醒,个人认为:基于控制台时间提醒不适宜,会导致界面很乱,读者可以考虑删除。
           4、就问题实现要求而言,最高分和词汇通英雄有点重复,做一个即可。

这样玩家游戏就能用了,管理员端可以参考下一篇博客《单词竞猜游戏之管理员端》

在控制台中实现“单词竞猜”游戏 C# 猜词游戏相关推荐

  1. Java黑皮书课后题第7章:***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来。当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测

    ***7.35(游戏:猜字词游戏)编写一个猜字词游戏,随机产生一个单词,当用户猜测正确后,正确的字母显示出来.当用户猜出一个单词,显示猜错的次数,并询问用户是否继续猜测 题目 题目描述与运行示例 破题 ...

  2. hangman游戏c语言,英语游戏 猜词游戏hangman

    HANGMAN英语课堂游戏的设计 广东深圳市电子技术学校 张江宏 一.Hangman游戏的由来 Hangman在西方是一个家喻户晓的猜词游戏.Hang的英文意思是"绞死",而Man ...

  3. Python实现猜词游戏 Hangman Game(不带提示和带提示版本)

    本文目录 Python实现猜词游戏(Hangman Game) 一.任务准备 二.Hangman游戏的功能需求 三.辅助函数的构建 1.确定一个单词是否被猜出 2.获取用户当前的猜词进度 3.确定还有 ...

  4. php编写猜拳游戏,Python中猜拳游戏与猜筛子游戏的实现方法

    猜拳游戏 import random player_input=input("请输入(0剪刀,1石头,2布):") player=int(player_input) compute ...

  5. 微信小程序开发之猜词游戏

    基于微信小程序开发的猜词游戏.之所以想开发这个小游戏,是因为网上类似的游戏,充斥了太多广告和暗坑,所以想想比如自己开发一个. 以下是几个截图,比较简单,但是足够自己玩了:) 源码地址供参考: 微信小程 ...

  6. Day18-用vim写猜词游戏

    Day18-用vim写猜词游戏

  7. 儿童猜词游戏图片_超实用的儿童社交游戏分享(听指令、认知、规则)

    儿童社交游戏分享 游戏能力是一种综合能力的体现,融合了儿童身心发展规律.RDI游戏理论.经典游戏方法等在进行社交游戏之前,需要儿童具备以下能力,若未达到以下要求,儿童在游戏中会较难进行. 社会能力:儿 ...

  8. python第四章答案猜数游戏_猜数游戏python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文实例为大家分享了python实现猜数游戏的具体代码,供大家参考,具体内容如下 ...

  9. Java:(游戏:猜字游戏)

    题目描述: 编写一个猜字游戏.随机产生一个单词,提示用户一次猜测一个字母,如运行示例所示.单词中的每个字母显示为一个星号.当用户猜测正确后,正确的字母显示出来.当用户猜出一个单词,显示猜错的次数,并且 ...

最新文章

  1. 安卓 画板 学习笔记
  2. keras 导出onnx并使用
  3. 【通知】有三AI运营组成员招收条件及管理暂行方案,你是否想好与有三AI共进退...
  4. 【中间件】大数据之分布式消息队列Kafka
  5. JavaScript实现截留雨水问题的动态编程方法算法(附完整源码)
  6. python requests get post_python+requests进行get、post方法接口测试
  7. 剖析Elasticsearch集群系列之一:Elasticsearch的存储模型和读写操作
  8. 【编译】StreamInsight简介
  9. 对于基类和派生类中的多态及重载的最好解释方法
  10. 【QT】Qaction和触发函数建立连接的方法
  11. 智能优化算法(源码)-海鸥优化算法(SOA)
  12. 基于Spring MVC + Spring + MyBatis的【网上购物系统】
  13. 如何读懂3GPP协议
  14. 拼多多和酷家乐面试总结(已拿offer)
  15. 关于pict工具进行测试用例的自动生成过程中:使用 pict.exe test.txt >test.xsl 导出为xls格式的表格文件时,出现拒绝访问的提示解决方案
  16. 计算机学院考研动员大会,计算机科学学院召开考研动员大会暨经验分享会
  17. 如图GX Works2所示我该如何操作?
  18. tcl/tk 的安装
  19. 个人笔记——PointNet初学
  20. Android_Google Pay的添加使用

热门文章

  1. Gradle学习之构建java与web项目
  2. 在cordova中使用HTML5的多文件上传
  3. disabling directory browsing
  4. 关于阿拉伯数字转化成为大写汉字
  5. 同一个闭区间上有界变差函数的和与积都是有界变差函数
  6. 如何查看linux的版本
  7. 三年java经验应该会什么?
  8. 深入理解== 和 equals 的区别
  9. 表正在被别的用户或进程使用_linux内核对进程的管理分为两个方面
  10. scala中循环守卫_Scala中的循环