生活随笔
收集整理的這篇文章主要介紹了
在控制台中实现“单词竞猜”游戏 C# 猜词游戏
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 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">
? 場(chǎng)景
設(shè)計(jì)規(guī)則
a) 這是一個(gè)單人玩的游戲。
b) 可以分三個(gè)級(jí)別,分別是高級(jí)、中級(jí)、低級(jí)。不同級(jí)別對(duì)應(yīng)的單詞系列也不一樣。要求一旦玩家選定了要玩的級(jí)別,應(yīng)當(dāng)先提示它關(guān)于此級(jí)別最高分是多少,是誰創(chuàng)下的記錄,然后再開始游戲。
c) 游戲開始后,應(yīng)顯示如下信息:
i. 剩余可用競(jìng)猜次數(shù)(競(jìng)猜次數(shù)的初始值等于被猜的單詞遺漏的字符數(shù)加5),
ii. 玩家所得分?jǐn)?shù):完全猜對(duì)一個(gè)單詞得一分。
iii. 已用時(shí)間:要每10 秒更新一次已用時(shí)間的顯示。
iv. 競(jìng)猜的單詞。只顯示每個(gè)單詞的部分字母,并且這些字母是隨機(jī)顯示出來的。刻意遺漏的字母應(yīng)當(dāng)使用*替代。應(yīng)當(dāng)有多少字母被顯示出來,視單詞的長(zhǎng)度而定,如果單詞本身較長(zhǎng),則多顯示,反之亦然。
d) 游戲結(jié)束前,比較一家玩家的成績(jī)與文件中存儲(chǔ)的詞匯通英雄的成績(jī),如果前者成績(jī)更高,需要將如下信息保存在文件中。(成績(jī):猜對(duì)的單詞數(shù)*100 /一共花費(fèi)的時(shí)間)
i. 玩家姓名
ii. 所用時(shí)間
iii. 分?jǐn)?shù)。
另外,要注意的是,如果發(fā)現(xiàn)他們分?jǐn)?shù)相同就比較使用的時(shí)間。
還有,不同級(jí)別的詞匯通英雄信息應(yīng)當(dāng)分別放在不同的文件中。
e) 如果玩家在給定次數(shù)內(nèi)(選取20次) 沒有猜出5個(gè)單詞,則游戲結(jié)束。
l? 實(shí)驗(yàn)方法
參照學(xué)生信息管理系統(tǒng)。
1.??? 創(chuàng)建一個(gè)線程專門負(fù)責(zé)時(shí)間提醒
2.??? 采用兩種用戶,管理員負(fù)責(zé)將游戲初始化,更新詞匯表,之前自動(dòng)更新和逐個(gè)輸入
3.??? 玩家玩游戲
單詞競(jìng)猜? Program類 主函數(shù) TextOperateClass類 文本操作類
?玩家主函數(shù):
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("------------ 歡迎來到單詞競(jìng)猜游戲 ------------" ); Console.WriteLine("------------ CopyRight:Sunsea ------------" ); Console.WriteLine("------------ ------------" ); Console.WriteLine("------------------------------------------------" ); Console.WriteLine("請(qǐng)輸入你的姓名:" ); string username = string .Format(Console.ReadLine()); Console.WriteLine("請(qǐng)選擇游戲級(jí)別:\n\t1.高級(jí) \n\t2.中級(jí) \n\t3.低級(jí)" ); int grade = int .Parse(Console.ReadLine()); while (grade < 1 || grade > 3 ) { Console.WriteLine("請(qǐng)輸入1~3的正整數(shù)!" ); 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("當(dāng)前最高分記錄{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("請(qǐng)猜{0}的完整拼寫:" ,vagueWord); int SingleWordGuessNums = 6 ; while (SingleWordGuessNums>0 ) { string playerGuessWord = Console.ReadLine(); if (playerGuessWord.Equals(fullWord)) { guessRightNums++; break ; } else { Console.WriteLine("你的猜測(cè)有誤,是否放棄本單詞猜測(cè):放棄<y>,不放棄繼續(xù)猜!" ); try { if (char .Parse(Console.ReadLine()) == 'y' ) break ; } catch (Exception) { Console.WriteLine("輸入錯(cuò)誤" ); } } SingleWordGuessNums--; } string isContinue; while (true ) { Console.WriteLine("繼續(xù)請(qǐng)輸<y>,退出請(qǐng)輸<n>?" ); isContinue = Console.ReadLine(); if (isContinue != "y" && isContinue != "n" && isContinue != "Y" && isContinue != "N" ) Console.WriteLine("請(qǐng)按提示正確輸入,是否繼續(xù)!" ); else break ; } if (isContinue == "n" ) break ; countWhile--; if (countWhile <= 1000 - 20 && guessRightNums < 5 ) { Console.WriteLine("Sorry,你在20個(gè)單詞中猜正確的單詞不達(dá)5個(gè),游戲結(jié)束" ); 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}中新的詞匯通英雄,你的成績(jī){2},用時(shí){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("----------- 歡迎再來,按任意鍵結(jié)束 -----------" ); 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("已用時(shí){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 = "高級(jí)" ; break ; case 2 : gradeString = "中級(jí)" ; break ; case 3 : gradeString = "初級(jí)" ; 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]; } } }
說明事項(xiàng)
?????????? 1、文本操作亂碼問題,運(yùn)行之前需要在E盤創(chuàng)建01111139文件夾,E:\01111139\*.txt ?????????? 2、更新文本文檔中的內(nèi)容可以通過將文本文檔讀取放在數(shù)組中,然后覆蓋創(chuàng)建文檔, ??????????????? 更新數(shù)組,然后在寫回。 ?????????? 3、這里面用了委托機(jī)制,創(chuàng)建一個(gè)單獨(dú)的線程負(fù)責(zé)時(shí)間提醒,個(gè)人認(rèn)為:基于控制臺(tái)時(shí)間提醒不適宜,會(huì)導(dǎo)致界面很亂,讀者可以考慮刪除。 ?????????? 4、就問題實(shí)現(xiàn)要求而言,最高分和詞匯通英雄有點(diǎn)重復(fù),做一個(gè)即可。
?
這樣玩家游戲就能用了,管理員端可以參考下一篇博客《單詞競(jìng)猜游戲之管理員端》
總結(jié)
以上是生活随笔 為你收集整理的在控制台中实现“单词竞猜”游戏 C# 猜词游戏 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。