日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

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

發布時間:2025/3/11 C# 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在控制台中实现“单词竞猜”游戏 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個單詞,則游戲結束。

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;
  • //可以無限制猜詞,最大循環次數1000
  • int countWhile = 1000;
  • //如果在20次內沒能猜正5個,退出
  • initTime = DateTime.Now; //記錄猜詞起始時間
  • //單獨線程用于定時
  • Thread timeThread = new Thread(TimeRemind);
  • timeThread.Start(); //在主線程調用TimeRemind方法
  • while (countWhile>0)
  • {
  • string fullWord = TextOperateClass.ReadFullWords(grade); //獲取一個完整單詞
  • string vagueWord = TextOperateClass.VagueWords(fullWord); //獲取一個被*替換字母的單詞
  • Console.WriteLine("請猜{0}的完整拼寫:",vagueWord);
  • //一個單詞有6次參測機會
  • 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--;
  • //如果在20次中沒猜正5個,游戲強退
  • 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));
  • //成績=猜對的單詞數*100/一共花費的時間;
  • 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();
  • }
  • //定時提醒 10s
  • 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 ;
  • }
  • //更新得分 //grade及為對應的行數
  • 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();
  • //*代替字符數是單詞長度的1/3
  • 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] = '*';
  • }
  • //將arrWord[]數組中的元素生成字符串
  • StringBuilder st = new StringBuilder();
  • foreach (char c in arrWord)
  • {
  • st = st.Append(c);
  • }
  • string vagueWord = st.ToString();
  • return vagueWord; //可以根據單詞長度獲得遺漏的字符數
  • }
  • //在【min,max】區間中產生num個不相等的隨機數,存在數組中,返回
  • 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;
  • }
  • //返回完整單詞
  • //自行產生隨機數讀取。隨機數的范圍是(0,單詞總數)
  • 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();
  • //Regex是正則表達式啊的類啊,引用using System.Text.RegularExpressions就可以看到了
  • 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# 猜词游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。