生活随笔
收集整理的這篇文章主要介紹了
在控制台中实现“单词竞猜”游戏 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. 競猜的單詞。只顯示每個單詞的部分字母,并且這些字母是隨機顯示出來的??桃膺z漏的字母應當使用*替代。應當有多少字母被顯示出來,視單詞的長度而定,如果單詞本身較長,則多顯示,反之亦然。
d) 游戲結束前,比較一家玩家的成績與文件中存儲的詞匯通英雄的成績,如果前者成績更高,需要將如下信息保存在文件中。(成績:猜對的單詞數*100/一共花費的時間)
i. 玩家姓名
ii. 所用時間
iii. 分數。
另外,要注意的是,如果發現他們分數相同就比較使用的時間。
還有,不同級別的詞匯通英雄信息應當分別放在不同的文件中。
e) 如果玩家在給定次數內(選取20次)沒有猜出5個單詞,則游戲結束。
l? 實驗方法
參照學生信息管理系統。
1.??? 創建一個線程專門負責時間提醒
2.??? 采用兩種用戶,管理員負責將游戲初始化,更新詞匯表,之前自動更新和逐個輸入
3.??? 玩家玩游戲
單詞競猜?
| Program類 | 主函數 |
| TextOperateClass類 | 文本操作類 |
?玩家主函數:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Collections;using System.Timers;using System.Threading; namespace WordsPlay{ class Program{ static DateTime initTime; static void Main(string[] args){Console.WriteLine("------------------------------------------------");Console.WriteLine("------------ ------------");Console.WriteLine("------------ 歡迎來到單詞競猜游戲 ------------");Console.WriteLine("------------ CopyRight:Sunsea ------------");Console.WriteLine("------------ ------------");Console.WriteLine("------------------------------------------------"); Console.WriteLine("請輸入你的姓名:"); string username = string.Format(Console.ReadLine()); Console.WriteLine("請選擇游戲級別:\n\t1.高級 \n\t2.中級 \n\t3.低級"); int grade = int.Parse(Console.ReadLine()); while (grade < 1 || grade > 3){Console.WriteLine("請輸入1~3的正整數!");grade = int.Parse(Console.ReadLine());} string s = TextOperateClass.ReadMaxScore(grade); int maxScore = Convert.ToInt16(s.Substring(s.IndexOf("#") + 1, s.LastIndexOf("#") - s.IndexOf("#")-1)); string maxScoreUsername = s.Substring(s.LastIndexOf("#") + 1, s.Length - s.LastIndexOf("#") - 1); string maxScoreMessage = string.Format("當前最高分記錄{0}分,記錄保持者{1}",maxScore,maxScoreUsername);Console.WriteLine(maxScoreMessage); int playerScore = 0; int guessRightNums = 0; int countWhile = 1000; initTime = DateTime.Now; Thread timeThread = new Thread(TimeRemind);timeThread.Start(); while (countWhile>0){ string fullWord = TextOperateClass.ReadFullWords(grade); string vagueWord = TextOperateClass.VagueWords(fullWord); Console.WriteLine("請猜{0}的完整拼寫:",vagueWord); int SingleWordGuessNums = 6; while (SingleWordGuessNums>0){ string playerGuessWord = Console.ReadLine(); if (playerGuessWord.Equals(fullWord)){guessRightNums++; break;} else{Console.WriteLine("你的猜測有誤,是否放棄本單詞猜測:放棄<y>,不放棄繼續猜!"); try{ if (char.Parse(Console.ReadLine()) == 'y') break;} catch (Exception){ Console.WriteLine("輸入錯誤");} } SingleWordGuessNums--;} string isContinue; while (true){Console.WriteLine("繼續請輸<y>,退出請輸<n>?");isContinue = Console.ReadLine(); if (isContinue != "y" && isContinue != "n" && isContinue != "Y" && isContinue != "N")Console.WriteLine("請按提示正確輸入,是否繼續!"); else break; } if (isContinue == "n") break; countWhile--; if (countWhile <= 1000 - 20 && guessRightNums < 5){Console.WriteLine("Sorry,你在20個單詞中猜正確的單詞不達5個,游戲結束"); break;} } DateTime endTime = DateTime.Now;TimeSpan userTime = endTime - initTime; double userTimeSeconds = userTime.TotalSeconds; #region if (guessRightNums > maxScore){TextOperateClass.UpdataMaxScore(grade, guessRightNums, username);Console.WriteLine("恭喜你打破了得分記錄");} string messageMaxScore = string.Format("你<{0}>在{1}中的得分是{2}", username, TextOperateClass.GradeString(grade),guessRightNums);Console.WriteLine(messageMaxScore); #endregion #region string wordsHero =TextOperateClass.ReadMaxPerformance(grade); int maxPerformance = Convert.ToInt16(wordsHero.Substring(wordsHero.IndexOf("#", 3) + 1, wordsHero.LastIndexOf("#") - wordsHero.IndexOf("#", 3) - 1)); int totalTime =Convert.ToInt16( wordsHero.Substring(wordsHero.LastIndexOf("#") + 1, wordsHero.Length - wordsHero.LastIndexOf("#") - 1)); playerScore = guessRightNums * 100 / (int)userTimeSeconds; if (playerScore > maxPerformance || (playerScore == maxPerformance && (int)userTimeSeconds < totalTime)){messageMaxScore = string.Format("恭喜你<{0}>成為{1}中新的詞匯通英雄,你的成績{2},用時{3}秒", username, TextOperateClass.GradeString(grade), playerScore, (int)userTimeSeconds);Console.WriteLine(messageMaxScore);TextOperateClass.UpdataMaxperformance(grade, username, playerScore, (int)userTimeSeconds);} #endregion timeThread.Abort();Console.WriteLine("------------------------------------------------");Console.WriteLine("------------ ------------");Console.WriteLine("----------- 歡迎再來,按任意鍵結束 -----------");Console.WriteLine("------------ CopyRight:Sunsea ------------");Console.WriteLine("------------ ------------");Console.Write("------------------------------------------------"); Console.ReadLine();} public static void TimeRemind(){System.Timers.Timer t = new System.Timers.Timer();t.Elapsed += new ElapsedEventHandler(writesecond);t.Interval = 10000;t.Enabled = true;Console.ReadLine();} public static void writesecond(object source, ElapsedEventArgs e){TimeSpan userTime = DateTime.Now - initTime;Console.WriteLine(string.Format("已用時{0}秒",(int)userTime.TotalSeconds));} }}
文本操作類:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Collections;using System.Text.RegularExpressions;using System.Timers; namespace WordsPlay{ public class TextOperateClass{ public static string GradeString(int grade){ string gradeString = ; switch (grade){ case 1:gradeString = "高級"; break; case 2:gradeString = "中級"; break; case 3:gradeString = "初級"; break; } return gradeString;} private static string GradePath(int grade){ string gradePath = ; switch (grade){ case 1:gradePath =@"e:\01111139\HighLevelWord.txt"; break; case 2:gradePath = @"e:\01111139\MiddleLevelWord.txt"; break; case 3:gradePath = @"e:\01111139\LowLevelWord.txt"; break;} return gradePath;} public static string ReadMaxScore(int grade){ string gradeString = GradeString(grade); FileStream fs = new FileStream(@"e:\01111139\MaxScore.txt",FileMode.Open,FileAccess.Read);StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default); string line = ; while ((line = sr.ReadLine()) != ){ int count = line.IndexOf(gradeString); if (count == 0){sr.Close();fs.Close(); return line;}} sr.Close();fs.Close(); return ; } public static string ReadMaxPerformance(int grade){ string gradeString = GradeString(grade); FileStream fs = new FileStream(@"e:\01111139\WordsHero.txt", FileMode.Open, FileAccess.Read);StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default); string line = ; while ((line = sr.ReadLine()) != ){ int count = line.IndexOf(gradeString); if (count == 0){sr.Close();fs.Close(); return line;}} sr.Close();fs.Close(); return ; } public static void UpdataMaxScore(int grade, int score, string username){ string gradeString = GradeString(grade); string newLineValue = string.Format("{0}#{1}#{2}", gradeString, score, username); FileStream fs = new FileStream(@"e:\01111139\MaxScore.txt", FileMode.Open, FileAccess.Read);StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default); string[] maxScoreLine = new string[3]; string line; for (int i = 0; (line = sr.ReadLine()) != ; i++){maxScoreLine[i] = line;}sr.Close();fs.Close(); FileStream fsw = new FileStream(@"e:\01111139\MaxScore.txt", FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fsw, System.Text.Encoding.Default); string subLine; foreach (string str in maxScoreLine){subLine = str.Substring(0, 2); if (subLine.Equals(gradeString)){sw.WriteLine(newLineValue);} else{sw.WriteLine(str);}}sw.Close();fsw.Close();} public static void UpdataMaxperformance(int grade, string username, int playerScore, double userTimeSeconds){ string gradeString = GradeString(grade); string newLineValue = string.Format("{0}#{1}#{2}#{3}", gradeString, username, playerScore, userTimeSeconds); FileStream fs = new FileStream(@"e:\01111139\WordsHero.txt", FileMode.Open, FileAccess.Read);StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default); string[] maxScoreLine = new string[3]; string line; for (int i = 0; (line = sr.ReadLine()) != ; i++){maxScoreLine[i] = line;}sr.Close();fs.Close(); FileStream fsw = new FileStream(@"e:\01111139\WordsHero.txt", FileMode.Create, FileAccess.Write);StreamWriter sw = new StreamWriter(fsw, System.Text.Encoding.Default); string subLine; foreach (string str in maxScoreLine){subLine = str.Substring(0, 2); if (subLine.Equals(gradeString)){sw.WriteLine(newLineValue);} else{sw.WriteLine(str);}}sw.Close();fsw.Close();} public static string VagueWords(string fullWord){ char[] arrWord = fullWord.ToCharArray(); int nums = arrWord.Length / 3; List<int> myListRdm = new List<int>();myListRdm = CreateNum(nums,0,arrWord.Length); int index=0; for (int i = 0; i < myListRdm.Count; i++){ index=myListRdm[i];arrWord[index] = '*';} StringBuilder st = new StringBuilder(); foreach (char c in arrWord){st = st.Append(c);} string vagueWord = st.ToString(); return vagueWord; } private static List<int> CreateNum(int nums,int min,int max){List<int> MyList = new List<int>();Random random = new Random(); while (true){ int i = random.Next(min, max); if (!MyList.Contains(i)){ if (MyList.Count < nums){MyList.Add(i);} else break;}} return MyList; } public static string ReadFullWords(int grade){ string gradePath = GradePath(grade); FileStream fs = new FileStream(gradePath, FileMode.Open, FileAccess.Read);StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default); string wordsString = sr.ReadToEnd(); string[] wordsArr = Regex.Split(wordsString, " "); Random rd = new Random(); int num = rd.Next(1, wordsArr.Length); return wordsArr[num];} }}
說明事項
?????????? 1、文本操作亂碼問題,運行之前需要在E盤創建01111139文件夾,E:\01111139\*.txt
?????????? 2、更新文本文檔中的內容可以通過將文本文檔讀取放在數組中,然后覆蓋創建文檔,
??????????????? 更新數組,然后在寫回。
?????????? 3、這里面用了委托機制,創建一個單獨的線程負責時間提醒,個人認為:基于控制臺時間提醒不適宜,會導致界面很亂,讀者可以考慮刪除。
?????????? 4、就問題實現要求而言,最高分和詞匯通英雄有點重復,做一個即可。
?
這樣玩家游戲就能用了,管理員端可以參考下一篇博客《單詞競猜游戲之管理員端》
總結
以上是生活随笔為你收集整理的在控制台中实现“单词竞猜”游戏 C# 猜词游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。