前四回介绍了c#常用的数据类型,数组,字符串的常用操作,本回书进入实践环节,综合运用前面讲到的这些知识,实践一个控制台小游戏。
以下是需求说明:
/*
Playing a console-based game
To solve the problem, your program must be able to:
Choose a random word to use as the secret word. That word is chosen from a word list, as described in the following paragraph.
Keep track of the user’s partially guessed word, which begins as a series of dashes and then updated as correct letters are guessed.Implement the basic control structure and manage the details (ask the user to guess a letter, keep track of the number of guesses remaining, print out the various messages, detect the end of the game, and so forth) */简单说需求就是从一个单词集合中随机选取一个单词, 假设猜想单词school, 就在控制台上输出 _ _ _ _ _ _,根据英语普遍规律,绝大部分的单词都有元音字母,所以从元音字母开始猜比较容易。假设用户猜字母O,单词school中出现了,就在单词上预留的位置中填写此字母,_ _ _ o o _ 当用户们猜测的单词为school中并未出现的字母,则将在控制台中输出最近一次单词的状态。若给定猜测次数内,单词仍未猜出,则系统获胜,若猜出此单词,则为用户获胜。
java版本实现
public class Main { //1一个单词数组(字符串数组) //2随机获取一个单词,随机一个下标(下标值在0到单词数组长度之间) //3得到单词长度len,创建一个长度为len的字符数组word,数组元素初值均为- //4循环以下步骤(退出循环的条件为,用户允许猜错的次数<=0或word字符中数组中不再包含-字符) //5输出word到屏幕 //6获取客户输入,判断随机选出的单词中是否包含用户输入的字符 //7若包含,得到字符在单词中出现的位置,并将该位置的字符替换成用户输入的字符,返回到4 //8若不包含,用户可以猜错的次数减一,返回到4 //9.得出最后结论:判断用户允许猜错的次数是否大于0,如果大于0,输出用户胜利,否则输出用户失败 public static boolean isContaisChar(char[] array, char c) { boolean bFind = false; for(int i = 0; i0 && isContaisChar(wordShow,'-')) { //5输出word到屏幕 System.out.println(wordShow); //6获取客户输入,判断随机选出的单词中是否包含用户输入的字符 Scanner sc = new Scanner(System.in); String c = sc.nextLine(); //7若包含,得到字符在单词中出现的位置,并将该位置的字符替换成用户输入的字符,返回到4 boolean bFind = false; for(int i = 0; i < wordShow.length; i++) { if(strWordChoose.charAt(i) == c.toCharArray()[0]) { wordShow[i] = c.toCharArray()[0]; bFind = true; } } //8若不包含,用户可以猜错的次数减一,返回到4 if(!bFind) { nGuessTimes--; System.out.println("您还有"+nGuessTimes+"次机会"); } } //9.得出最后结论:判断用户允许猜错的次数是否大于0,如果大于0,输出用户胜利,否则输出用户失败 if(nGuessTimes > 0) { System.out.println("you win"); } else { System.out.println("you lose"); } }}
以下给出代码实现(C#):
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 using System.Diagnostics; 7 8 namespace GuessWord 9 {10 class Program11 {12 static int wrongGuess, lettersLeft;13 14 static void Main(string[] args)15 {16 string wordToGuess = GetWordToGuess();17 18 char[] maskedWord = GetHiddenLetters(wordToGuess, '-');19 20 lettersLeft = wordToGuess.Length;21 char userGuess;22 23 wrongGuess = 3;24 25 while (wrongGuess > 0 && lettersLeft > 0)26 {27 DisplayCharacters(maskedWord);28 29 Console.WriteLine("Enter a letter?");30 userGuess = char.Parse(Console.ReadLine());31 32 maskedWord = CheckGuess(userGuess, wordToGuess, maskedWord);33 }34 35 Console.WriteLine("Well done! Thanks for playing.");36 Console.ReadLine();37 }38 39 static string GetWordToGuess()40 {41 Random number = new Random();42 int wordNumber = number.Next(0, 9);43 44 string[] words = { "picture", "chinese", "school", "question", "include", "simple", "difficult", "understand", "necessary", "support" };45 46 string selectWord = words[wordNumber];47 return selectWord;48 }49 50 static char[] GetHiddenLetters(string word, char mask)51 {52 char[] hidden = new char[word.Length];53 54 for (int i = 0; i < word.Length; i++)55 {56 hidden[i] = mask;57 }58 59 return hidden;60 }61 62 static void DisplayCharacters(char[] characters)63 {64 foreach (char letter in characters)65 {66 Console.Write(letter);67 }68 Console.WriteLine();69 }70 71 static char[] CheckGuess(char letterToCheck, string word, char[] characters)72 {73 if (word.Contains(letterToCheck))74 {75 for (int i = 0; i < word.Length; i++)76 {77 if (word[i] == letterToCheck)78 {79 characters[i] = word[i];80 lettersLeft--;81 }82 }83 }84 else85 {86 wrongGuess--;87 }88 89 return characters;90 }91 }92 }