解题思路:
这个题需要的数据有单词的数组,输入的字符以及密文。
步骤:
1、先生成一组单词,声明一个字符数组来储存单词(由编写者自由决定单词及单词个数)。
2、随机抽取一个单词(根据下标来随机抽取,作为一次猜字)
3、创建该单词的一个状态数组。
4、当前轮猜错的次数。
5、开始输入字符猜单词。
程序获得用户输入的字符串后,若该字母在随机抽取的单词中出现了,变*为该字母,若没有出现则输出该字母不在单词中,并且当前轮猜错的的次数加一。若输入该字母之前已经输入过了该字母,则输出该字母已经在单词中了。一直当该单词字母全部猜中,输出该单词,然后询问是否进行下一轮。如果不进行,则退出程序,否则继续开始下一轮游戏,继续随机抽取一个单词,并且将猜错的次数归零。将一些需要调用的变量写为全局变量,方便调用。
完整代码如下:
import java.util.*;
/*
数据1、单词的数组
2、输入的字符
3、密文
*/
class Class34{
//1、先生成一组单词
public static String[] words={"computer","public","static","void",};
//2、随机抽取一个单词
public static String word = null;//给空值
//3、创建该单词的一个状态数组
public static boolean[] state= null;
//4、当前轮猜错的次数
public static int missed = 0;//默认为零
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Random random = new Random();
word = words[random.nextInt(words.length)];//对全局变量word初始化,抽取角标来确定单词
state = new boolean[word.length()];//根据word来改变(初始化)
//5、开始输入字符猜单词
while(true){
String password = getPassWord();
System.out.print("Enter a letter in word "+ password+":");
String letter = sc.nextLine();//获取字符串
changeWordState(letter);//改变单词的状态,拿letter和word进行比较,然后改变state
if(isEnd()){//表示是否猜完
System.out.println("The word is " + word+".You missed "+missed+" time");
System.out.print("Do you want to guess another word? Enter y or n>");
if(sc.nextLine().equals("y")){
word = words[random.nextInt(words.length)];
state = new boolean[word.length()];
missed = 0;
}else{
break;
}
}
}
}
public static boolean isEnd(){//不用传值,直接从全局变量拿
for(int i = 0;i<state.length;i++){
if(state[i]==false){//如果等于false,就代表没有猜完
return false;
}
}
return true;
}
public static void changeWordState(String letter){
//结果可能改,也可能不改。也有可能存在且已经输入过。故不给返回值类型
boolean isExist = false;//设置一个标记
for(int i = 0;i<word.length();i++){
if((word.charAt(i)+"").equals(letter)){//字符后面加空串变为字符串,字符串之间进行比较
isExist=true;//相等则更改标记的状态
if(state[i]==false){//相等,但是状态没改变,把状态改为true
state[i]=true;
}else{
System.out.println("\t" +letter+" is already in the word");
return;
}
}
}
if(!isExist){
missed++;
System.out.println("\t"+letter+" is not in the word");
}
}
public static String getPassWord(){//根据单词的本身和单词的状态,返回一个单词的密文
String password="";//先创建一个空字符串
for(int i = 0;i<word.length();i++){
if(state[i]==true){//状态里面的第i个字母是true,把相对应的字符填进去
password+=word.charAt(i);
}else{
password+="*";//里面是false,则是*
}
}
return password;//返回密码
}
}