有猜字母游戲,其游戲規(guī)則為:程序隨機(jī)產(chǎn)生5個(gè)按照一定順序排列的字符作為猜測(cè)的結(jié)果,由玩家來(lái)猜測(cè)此字符串。玩家可以猜測(cè)多次,每猜測(cè)一次,則由系統(tǒng)提示結(jié)果。如果猜測(cè)的完全正確,則游戲結(jié)束,計(jì)算玩家的游戲得分并輸出;如果沒(méi)有猜對(duì),則提示猜測(cè)的結(jié)果,如猜對(duì)了幾個(gè)字符,以及猜對(duì)了幾個(gè)字符的位置等信息,并提示玩家游戲繼續(xù)。
本案例要求使用交互的方式實(shí)現(xiàn)此游戲:由玩家在控制臺(tái)輸入所猜測(cè)的字符串,如果所猜測(cè)的字符串與結(jié)果并不完全相同,則在界面輸出比較后的結(jié)果,并提醒玩家繼續(xù)猜測(cè)。交互過(guò)程如圖-7所示:

圖- 7
由圖-7可以看出,每次猜測(cè)后,程序?qū)⒈容^玩家所輸入的字符串,比較字符以及字符的位置,然后提示結(jié)果:5個(gè)字符中正確的字符個(gè)數(shù),以及位置正確的字符個(gè)數(shù),以便于玩家判斷后續(xù)如何進(jìn)行猜測(cè)。
玩家終于猜測(cè)正確后,游戲結(jié)束,并給出游戲得分,交互過(guò)程如圖-8所示:

圖- 8
其中,游戲的得分規(guī)則為:字符的個(gè)數(shù)乘以100為總分,即此游戲的總分為 500 分。玩家如果第一次就猜對(duì),則得滿分(500分);每多猜測(cè)一次,則扣10分。由圖-8可以看出,玩家共猜測(cè)了5次,因此,得分為 450。
最后,如果玩家在控制臺(tái)錄入 exit,則游戲中止,程序結(jié)束。交互過(guò)程如圖-9所示:

圖- 9
本案例需要實(shí)現(xiàn)猜字母游戲中的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì),即,設(shè)計(jì)相關(guān)的數(shù)據(jù)結(jié)構(gòu),可以存儲(chǔ)此程序中所用到的相關(guān)數(shù)據(jù)。
1.2 方案分析猜字母游戲可以看出,此程序需要存儲(chǔ)隨機(jī)生成的字母?jìng)€(gè)數(shù)、隨機(jī)生成的字符串、玩家猜測(cè)的總次數(shù)、玩家錄入的字符串,以及比較后的結(jié)果。因此,設(shè)計(jì)如下變量來(lái)存儲(chǔ)此游戲中需要用到的相關(guān)數(shù)據(jù):
實(shí)現(xiàn)此案例需要按照如下步驟進(jìn)行。
步驟一:定義類(lèi)及 main方法
首先定義一個(gè)名為 GuessingGame 的類(lèi),并在類(lèi)中添加java應(yīng)用程序的主方法main,代碼如下所示:
public class GuessingGame { public static void main(String[] args) { }}步驟二:存儲(chǔ)猜測(cè)的次數(shù)
定義一個(gè)int類(lèi)型變量 count,用于記錄玩家猜字母的總次數(shù),代碼如下所示:
public class GuessingGame { public static void main(String[] args) { int count = 0; }}步驟三:存儲(chǔ)用戶猜測(cè)的數(shù)據(jù)
char數(shù)組類(lèi)型變量 input:用于保存用戶猜測(cè)的數(shù)據(jù),代碼如下所示:
public class GuessingGame { public static void main(String[] args) { int count = 0;char[] input=null; }}步驟四:存儲(chǔ)隨機(jī)生成的多個(gè)字母
定義一個(gè)char數(shù)組類(lèi)型 chs, 用于保存隨機(jī)生成的字母。代碼如下所示:
public class GuessingGame { public static void main(String[] args) { int count = 0;char[] input=null; char[] chs =null; }}步驟五:存儲(chǔ)比較結(jié)果
定義一個(gè)int數(shù)組類(lèi)型變量 result,用于存儲(chǔ)比較的結(jié)果。該數(shù)組有兩個(gè)元素,第一個(gè)用于保存完全猜對(duì)的字母?jìng)€(gè)數(shù)(字符和位置均正確),第二個(gè)元素用于保存猜對(duì)的字母?jìng)€(gè)數(shù)(字符正確,但是位置不正確)。代碼如下所示:
public class GuessingGame { public static void main(String[] args) { int count = 0;char[] input=null; char[] chs =null; int[] result =new int[2]; }}1.4 完整代碼本案例的完整代碼如下所示:

public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 表示猜測(cè)的字符串 char[] chs =null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; }}View Code2 猜字母游戲——設(shè)計(jì)程序結(jié)構(gòu)2.1 問(wèn)題本案例需要實(shí)現(xiàn)猜字母游戲程序中的程序結(jié)構(gòu)設(shè)計(jì)。
2.2 方案分析猜字母游戲可以看出,程序首先需要隨機(jī)產(chǎn)生 5 個(gè)不同的字母作為需要猜測(cè)的結(jié)果,因此,可以先定義一個(gè)方法,以實(shí)現(xiàn)此功能;其次,每當(dāng)玩家猜測(cè)一次后,程序需要將玩家錄入的字符串和正確答案進(jìn)行比較,統(tǒng)計(jì)正確的字符個(gè)數(shù)以及正確的位置個(gè)數(shù),因此,也可以先定義一個(gè)方法,專(zhuān)用于實(shí)現(xiàn)比較功能。這樣,就可以在 main 方法中調(diào)用這兩個(gè)方法。
2.3 步驟實(shí)現(xiàn)此案例需要按照如下步驟進(jìn)行。
步驟一:定義方法 generate()
在 GuessingGame 類(lèi)中,定義方法 generate(),該方法用于隨機(jī)生成五個(gè)不同的字母。代碼如下所示:
import java.util.Scanner;public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 表示猜測(cè)的字符串 char[] chs =null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; } /** * 隨機(jī)生成需要猜測(cè)的字母序列 * * @return 存儲(chǔ)隨機(jī)字符的數(shù)組 */ public static char[] generate() { char[] chs = new char[5]; return chs; }}步驟二:定義方法 check()
在GuessingGame類(lèi)中,定義方法 check()。該方法用于將玩家輸入的多個(gè)字母(參數(shù) input )和系統(tǒng)隨機(jī)生成的多個(gè)字母(參數(shù) chs)進(jìn)行比較,統(tǒng)計(jì)正確的字符個(gè)數(shù),以及位置正確的個(gè)數(shù),并將結(jié)果存儲(chǔ)到數(shù)組中,然后返回給調(diào)用方。代碼如下所示:
import java.util.Scanner;public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 表示猜測(cè)的字符串 char[] chs =null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; } /** * 隨機(jī)生成需要猜測(cè)的字母序列 * * @return 存儲(chǔ)隨機(jī)字符的數(shù)組 */ public static char[] generate() { char[] chs = new char[5]; return chs; } /** * 比較玩家輸入的字母序列和程序所生成的字母序列,逐一比較字符及其位置,并記載比較結(jié)果 * * @param chs * 程序生成的字符序列 * @param input * 玩家輸入的字符序列 * @return 存儲(chǔ)比較的結(jié)果。返回值int數(shù)組 的長(zhǎng)度為2,其中,索引為0的位置 * 用于存放完全猜對(duì)的字母?jìng)€(gè)數(shù)(字符和位置均正確),索引為1的位置用于存放猜對(duì)的字母?jìng)€(gè)數(shù)(字符正確,但是位置不正確)。 */ public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; return result; }}2.4 完整代碼本案例的完整代碼如下所示:

import java.util.Scanner;public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 表示猜測(cè)的字符串 char[] chs =null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; } /** * 隨機(jī)生成需要猜測(cè)的字母序列 * * @return 存儲(chǔ)隨機(jī)字符的數(shù)組 */ public static char[] generate() { char[] chs = new char[5]; return chs; } /** * 比較玩家輸入的字母序列和程序所生成的字母序列,逐一比較字符及其位置,并記載比較結(jié)果 * * @param chs * 程序生成的字符序列 * @param input * 玩家輸入的字符序列 * @return 存儲(chǔ)比較的結(jié)果。返回值int數(shù)組 的長(zhǎng)度為2,其中,索引為0的位置 * 用于存放完全猜對(duì)的字母?jìng)€(gè)數(shù)(字符和位置均正確),索引為1的位置用于存放猜對(duì)的字母?jìng)€(gè)數(shù)(字符正確,但是位置不正確)。 */ public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; return result; }}View Code3 猜字母游戲——實(shí)現(xiàn)字母生成方法3.1 問(wèn)題實(shí)現(xiàn)猜字母游戲中的字母生成方法,即,隨機(jī)生成 5 個(gè)不同的字母作為猜測(cè)的結(jié)果。
3.2 方案實(shí)現(xiàn)gererate方法,首先聲明一個(gè)字符類(lèi)型的數(shù)組,用于存儲(chǔ) 26 個(gè)大寫(xiě)字母,然后聲明一個(gè) boolean 類(lèi)型的數(shù)組,其長(zhǎng)度也為 26。此數(shù)組中的初始值均為false,意味著,程序起始,沒(méi)有任何字母被選中。如果某個(gè)字母被選中,則同時(shí)設(shè)置該字母在 boolean 類(lèi)型數(shù)組中對(duì)應(yīng)位置上的值為true,表示該字母被選中過(guò)。
然后,使用嵌套循環(huán):外層循環(huán)用于控制所生成的字母?jìng)€(gè)數(shù),即,循環(huán) 5 次,以產(chǎn)生5 個(gè)字母;而內(nèi)層循環(huán)則用于判斷所生成的字母是否重復(fù)。generate方法的程序流程如圖-10所示。

圖- 10
3.3 步驟實(shí)現(xiàn)此案例需要按照如下步驟進(jìn)行。
步驟一:構(gòu)建存儲(chǔ)所有字母的數(shù)組
在generate方法中,首先定義 char 類(lèi)型的數(shù)組變量 letters,用于存放26 個(gè)大寫(xiě)字母,然后定義 boolean 類(lèi)型的數(shù)組變量 flag,flag數(shù)組的大小和letters數(shù)組的大小相同,用于記載某字母是否被選中,以便于判斷字母是否重復(fù)。代碼如下所示:
public static char[] generate() { char[] chs = new char[5]; char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; boolean[] flags = new boolean[letters.length]; return chs; }步驟二:隨機(jī)選擇 5 個(gè)不同的字母
使用嵌套循環(huán),隨機(jī)選擇 5 個(gè)不同的字母,并且這五個(gè)字母各不相同。代碼如下所示:
public static char[] generate() { char[] chs = new char[5] ; char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; boolean[] flags = new boolean[letters.length]; for (int i = 0; i < chs.length; i++) { int index; do { index = (int) (Math.random() * (letters.length)); } while (flags[index]);// 判斷生成的字符是否重復(fù) chs[i] = letters[index]; flags[index] = true; } return chs; }3.4 完整代碼本案例的完整代碼如下所示:

import java.util.Scanner;public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 表示猜測(cè)的字符串 char[] chs =null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; } /** * 隨機(jī)生成需要猜測(cè)的字母序列 * * @return 存儲(chǔ)隨機(jī)字符的數(shù)組 */ public static char[] generate() {char[] chs = new char[5]; char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; boolean[] flags = new boolean[letters.length]; for (int i = 0; i < chs.length; i++) { int index; do { index = (int) (Math.random() * (letters.length)); } while (flags[index]);// 判斷生成的字符是否重復(fù) chs[i] = letters[index]; flags[index] = true; } return chs; } /** * 比較玩家輸入的字母序列和程序所生成的字母序列,逐一比較字符及其位置,并記載比較結(jié)果 * * @param chs * 程序生成的字符序列 * @param input * 玩家輸入的字符序列 * @return 存儲(chǔ)比較的結(jié)果。返回值int數(shù)組 的長(zhǎng)度為2,其中,索引為0的位置 * 用于存放完全猜對(duì)的字母?jìng)€(gè)數(shù)(字符和位置均正確),索引為1的位置用于存放猜對(duì)的字母?jìng)€(gè)數(shù)(字符正確,但是位置不正確)。 */ public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; return result; }}View Code4 猜字母游戲——實(shí)現(xiàn)字母檢測(cè)方法4.1 問(wèn)題比較玩家輸入的字母序列和程序所生成的字母序列,逐一比較字符及其位置,并記載比較結(jié)果。
4.2 方案實(shí)現(xiàn)check方法,需要逐一取出玩家錄入的每個(gè)字符,并和結(jié)果字符串一一比較:比較字符本身以及字符所在的位置,并記載比較的結(jié)果。此案例需要使用嵌套循環(huán)來(lái)實(shí)現(xiàn)。check方法的流程如圖-11所示,其中紅色部分表示外層循環(huán),藍(lán)色部分表示內(nèi)層循環(huán)。

圖- 11
4.3 步驟實(shí)現(xiàn)此案例需要按照如下步驟進(jìn)行。
步驟一:構(gòu)建存儲(chǔ)比較結(jié)果的數(shù)組
在check() 方法中,首先定義int 類(lèi)型的數(shù)組類(lèi)型變量result,用于存儲(chǔ)比較的結(jié)果。數(shù)組 result 的長(zhǎng)度為2,其中,resut[0] 用于存放完全猜對(duì)的字母?jìng)€(gè)數(shù)(字符和位置均正確),result[1] 用于存放猜對(duì)的字母?jìng)€(gè)數(shù)(字符正確,但是位置不正確)。代碼如下所示:
public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; return result; }步驟二:比較
使用嵌套循環(huán),統(tǒng)計(jì)完全猜對(duì)的字母?jìng)€(gè)數(shù),和猜對(duì)的字母?jìng)€(gè)數(shù)(位置不對(duì)),代碼如下所示:
public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; for (int i = 0; i < input.length; i++) { for (int j = 0; j < chs.length; j++) { if (input[i] == chs[j]) { result[1]++; if (i == j) { result[0]++; } break; } } } return result; }4.4 完整代碼本案例的完整代碼如下所示:

import java.util.Scanner;public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 表示猜測(cè)的字符串 char[] chs =null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; } /** * 隨機(jī)生成需要猜測(cè)的字母序列 * * @return 存儲(chǔ)隨機(jī)字符的數(shù)組 */ public static char[] generate() {char[] chs = new char[5]; char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; boolean[] flags = new boolean[letters.length]; for (int i = 0; i < chs.length; i++) { int index; do { index = (int) (Math.random() * (letters.length)); } while (flags[index]);// 判斷生成的字符是否重復(fù) chs[i] = letters[index]; flags[index] = true; } return chs; } /** * 比較玩家輸入的字母序列和程序所生成的字母序列,逐一比較字符及其位置,并記載比較結(jié)果 * * @param chs * 程序生成的字符序列 * @param input * 玩家輸入的字符序列 * @return 存儲(chǔ)比較的結(jié)果。返回值int數(shù)組 的長(zhǎng)度為2,其中,索引為0的位置 * 用于存放完全猜對(duì)的字母?jìng)€(gè)數(shù)(字符和位置均正確),索引為1的位置用于存放猜對(duì)的字母?jìng)€(gè)數(shù)(字符正確,但是位置不正確)。 */ public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; for (int i = 0; i < input.length; i++) { for (int j = 0; j < chs.length; j++) { if (input[i] == chs[j]) {// 判斷字符是否正確 result[1]++; if (i == j) {// 判斷位置是否正確 result[0]++; } break; } } } return result; }}View Code5 猜字母游戲——實(shí)現(xiàn)主方法5.1 問(wèn)題實(shí)現(xiàn)猜字母游戲的整體流程。
5.2 方案為實(shí)現(xiàn)猜字母游戲的整體過(guò)程,首先需要調(diào)用generate() 方法,以生成五個(gè)字母;
其次,需要使用 while(true) 循環(huán)允許玩家進(jìn)行多次猜測(cè);
在循環(huán)中,接收玩家猜測(cè)的字母,然后調(diào)用check() 方法,檢查猜測(cè)的結(jié)果。如果猜測(cè)正確,則輸出提示信息和分?jǐn)?shù),游戲結(jié)束;如果猜測(cè)錯(cuò)誤,則輸出猜測(cè)的判斷結(jié)果并提示玩家游戲繼續(xù)。main程序流程如圖-12所示。

圖- 12
5.3 步驟實(shí)現(xiàn)此案例需要按照如下步驟進(jìn)行。
步驟一:構(gòu)建存儲(chǔ)所有字母的數(shù)組
在main方法中,先輸出提示信息表示游戲開(kāi)始,然后調(diào)用generate() 方法生成要猜測(cè)的五個(gè)字母,并提示玩家開(kāi)始猜測(cè),代碼如下所示:
import java.util.Scanner;public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; Scanner scanner = new Scanner(System.in); System.out.步驟二:構(gòu)建循環(huán)
使用while(true)循環(huán),并在循環(huán)中調(diào)用Scanner類(lèi)的next() 方法接收玩家猜測(cè)的字符串。為方便字符串的比較,將玩家錄入的字符串均轉(zhuǎn)換為大寫(xiě)字母,然后先判斷玩家錄入的是否為“EXIT”,如果是,則循環(huán)中止,游戲結(jié)束。代碼如下所示:
import java.util.Scanner;public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; Scanner scanner = new Scanner(System.in); System.out.println("GuessingGame>歡迎嘗試猜字母游戲!"); // 表示猜測(cè)的字符串 char[] chs = generate(); System.out.println("GuessingGame>游戲開(kāi)始,請(qǐng)輸入你所猜的5個(gè)字母序列:(exit——退出)"); while (true) { String inputStr = scanner.next().trim().toUpperCase(); if ("EXIT".equals(inputStr)) { System.out.println("GuessingGame>謝謝你的嘗試,再見(jiàn)!"); break; } } scanner.close(); } /** * 隨機(jī)生成需要猜測(cè)的字母序列 * * @return 存儲(chǔ)隨機(jī)字符的數(shù)組 */ public static char[] generate() { char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; boolean[] flags = new boolean[letters.length]; char[] chs = new char[5]; for (int i = 0; i < chs.length; i++) { int index; do { index = (int) (Math.random() * (letters.length)); } while (flags[index]);// 判斷生成的字符是否重復(fù) chs[i] = letters[index]; flags[index] = true; } return chs; } /** * 比較玩家輸入的字母序列和程序所生成的字母序列,逐一比較字符及其位置,并記載比較結(jié)果 * * @param chs * 程序生成的字符序列 * @param input * 玩家輸入的字符序列 * @return 存儲(chǔ)比較的結(jié)果。返回值int數(shù)組 的長(zhǎng)度為2,其中,索引為0的位置 * 用于存放完全猜對(duì)的字母?jìng)€(gè)數(shù)(字符和位置均正確),索引為1的位置用于存放猜對(duì)的字母?jìng)€(gè)數(shù)(字符正確,但是位置不正確)。 */ public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; for (int i = 0; i < input.length; i++) { for (int j = 0; j < chs.length; j++) { if (input[i] == chs[j]) {// 判斷字符是否正確 result[1]++; if (i == j) {// 判斷位置是否正確 result[0]++; } break; } } } return result; }}步驟三:比較
如果玩家錄入的不是“EXIT”,則調(diào)用check() 方法與答案進(jìn)行比較,并得到存儲(chǔ)比較結(jié)果的數(shù)組 result 。
比較完畢后,根據(jù)比較結(jié)果輸出提示信息到界面,并計(jì)算分?jǐn)?shù)。如果5個(gè)字符的位置均正確,則表示游戲結(jié)束,計(jì)算并輸出玩家的得分;否則,將猜測(cè)的次數(shù)累加1 ,并提示玩家所猜對(duì)的字符個(gè)數(shù)以及位置個(gè)數(shù),游戲繼續(xù)。代碼如下所示:
import java.util.Scanner;public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; Scanner scanner = new Scanner(System.in); System.out.println("GuessingGame>歡迎嘗試猜字母游戲!"); // 表示猜測(cè)的字符串 char[] chs = generate(); System.out.println("GuessingGame>游戲開(kāi)始,請(qǐng)輸入你所猜的5個(gè)字母序列:(exit——退出)"); while (true) { String inputStr = scanner.next().trim().toUpperCase(); if ("EXIT".equals(inputStr)) { System.out.println("GuessingGame>謝謝你的嘗試,再見(jiàn)!"); break; }input = inputStr.toCharArray(); result = check(chs, input); if (result[0] == chs.length) {// 完全猜對(duì)的情況 int score = 100 * chs.length - count * 10; System.out.println("GuessingGame>恭喜你猜對(duì)了!你的得分是:" + score); break; } else { count++; System.out.println("GuessingGame>你猜對(duì)" + result[1] + "個(gè)字符,其中" + result[0] + "個(gè)字符的位置正確!(總次數(shù)=" + count + ",exit——退出)"); } scanner.close(); } /** * 隨機(jī)生成需要猜測(cè)的字母序列 * * @return 存儲(chǔ)隨機(jī)字符的數(shù)組 */ public static char[] generate() { char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; boolean[] flags = new boolean[letters.length]; char[] chs = new char[5]; for (int i = 0; i < chs.length; i++) { int index; do { index = (int) (Math.random() * (letters.length)); } while (flags[index]);// 判斷生成的字符是否重復(fù) chs[i] = letters[index]; flags[index] = true; } return chs; } /** * 比較玩家輸入的字母序列和程序所生成的字母序列,逐一比較字符及其位置,并記載比較結(jié)果 * * @param chs * 程序生成的字符序列 * @param input * 玩家輸入的字符序列 * @return 存儲(chǔ)比較的結(jié)果。返回值int數(shù)組 的長(zhǎng)度為2,其中,索引為0的位置 * 用于存放完全猜對(duì)的字母?jìng)€(gè)數(shù)(字符和位置均正確),索引為1的位置用于存放猜對(duì)的字母?jìng)€(gè)數(shù)(字符正確,但是位置不正確)。 */ public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; for (int i = 0; i < input.length; i++) { for (int j = 0; j < chs.length; j++) { if (input[i] == chs[j]) {// 判斷字符是否正確 result[1]++; if (i == j) {// 判斷位置是否正確 result[0]++; } break; } } } return result; }}5.4 完整代碼本案例的完整代碼如下所示:

import java.util.Scanner;public class GuessingGame { public static void main(String[] args) { // 表示玩家猜測(cè)的次數(shù) int count = 0;//表示用戶猜測(cè)的數(shù)據(jù)char[] input=null; // 用于保存判斷的結(jié)果 int[] result = new int[2]; Scanner scanner = new Scanner(System.in); System.out.println("GuessingGame>歡迎嘗試猜字母游戲!"); // 表示猜測(cè)的字符串 char[] chs = generate(); System.out.println("GuessingGame>游戲開(kāi)始,請(qǐng)輸入你所猜的5個(gè)字母序列:(exit——退出)"); while (true) { String inputStr = scanner.next().trim().toUpperCase(); if ("EXIT".equals(inputStr)) { System.out.println("GuessingGame>謝謝你的嘗試,再見(jiàn)!"); break; } input = inputStr.toCharArray(); result = check(chs, input); if (result[0] == chs.length) {// 完全猜對(duì)的情況 int score = 100 * chs.length - count * 10; System.out.println("GuessingGame>恭喜你猜對(duì)了!你的得分是:" +score); break; } else { count++; System.out.println("GuessingGame>你猜對(duì)" + result[1] + "個(gè)字符,其中" + result[0] + "個(gè)字符的位置正確!(總次數(shù)=" + count + ",exit——退出)"); } } scanner.close(); } /** * 隨機(jī)生成需要猜測(cè)的字母序列 * * @return 存儲(chǔ)隨機(jī)字符的數(shù)組 */ public static char[] generate() { char[] letters = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; boolean[] flags = new boolean[letters.length]; char[] chs = new char[5]; for (int i = 0; i < chs.length; i++) { int index; do { index = (int) (Math.random() * (letters.length)); } while (flags[index]);// 判斷生成的字符是否重復(fù) chs[i] = letters[index]; flags[index] = true; } return chs; } /** * 比較玩家輸入的字母序列和程序所生成的字母序列,逐一比較字符及其位置,并記載比較結(jié)果 * * @param chs * 程序生成的字符序列 * @param input * 玩家輸入的字符序列 * @return 存儲(chǔ)比較的結(jié)果。返回值int數(shù)組 的長(zhǎng)度為2,其中,索引為0的位置 * 用于存放完全猜對(duì)的字母?jìng)€(gè)數(shù)(字符和位置均正確),索引為1的位置用于存放猜對(duì)的字母?jìng)€(gè)數(shù)(字符正確,但是位置不正確)。 */ public static int[] check(char[] chs, char[] input) { int[] result = new int[2]; for (int i = 0; i < input.length; i++) { for (int j = 0; j < chs.length; j++) { if (input[i] == chs[j]) {// 判斷字符是否正確 result[1]++; if (i == j) {// 判斷位置是否正確 result[0]++; } break; } } } return result; }}View Code
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注