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

				版权声明:本文为博主原创文章,未经博主允许不得转载。					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、就问题实现要求而言,最高分和词汇通英雄有点重复,做一个即可。

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值