题目要求分析:
第一步:随机产生一个单词,所以我们必须先自己定义一个存放所有单词的字符串数组。
第二步: 要随机产生一个单词,我们不妨随机产生一个单词数组的角标取出单词。
第三步:猜单词:(重点!!!)
- 提示用户猜随机产生的单词的每一个字母,加一串单词的密文。
- 密文的每一次更新,重新写一个方法,记录每次更新完的密文状态,即当字母猜对(字母存在),将该位置的密文改为对应的字母,猜错,记录猜错的次数,密文不更新。
- 直到猜完为止,打印该单词与猜错的次数。
- 循环猜单词,再随机产生单词,重复2.3步骤。
代码实现
import java.util.*;
class Class34{
public static String[] words={"apple","banana","orange","pear","watermelon"};//定义全局变量单词组
public static String word=null;//定义全局变量一个单词
public static int missed=0;//定义全局变量记录错次数
public static boolean[] state=null;//定义全局变量单词的状态数组,状态为
public static void main(String[] args){
Scanner input=new Scanner(System.in);
Random random=new Random();
word=words[random.nextInt(words.length)];//随机产生一个单词
state=new boolean[word.length()];//初始化单词对应的密文状态
while(true){
String pwd=getPwd();//提示用户时要加入的密文
System.out.print("Enter a letter in word "+pwd+":");
String letter=input.nextLine();//输入一个所猜的单词字母,如猜"a",其虽然是一个字符,但也是以字符串的形式存在
changeWordState(letter);//根据单词,密文状态,字母来更新密文
if(isEnd()){//什么时候结束游戏
System.out.println("The word is "+word+" ,you missed "+missed);//打印所猜的单词与错误次数
System.out.print("Do you want to guess another word? y or n:");//提示是否要继续猜单词
if(input.nextLine().equals("y")){//如果继续猜
word=words[random.nextInt(words.length)];//再随机产生一个单词
state=new boolean[word.length()];//更新一下状态
missed=0;//错误次数更新为0,随后while循环继续猜
}else{//不继续猜就结束循环,结束猜单词游戏
break;
}
}
}
}
public static boolean isEnd(){//判断结束条件
for(int i=0;i<state.length;i++){//遍历单词状态
if(state[i]==false){//如果有状态数组中有单词是*,即没有猜完
return false;//返回没有结束
}
}
return true;//遍历完数组没有false,返回猜完了
}
public static void changeWordState(String letter){//更新单词状态的方法
boolean isExist=false;//设置一个标签,区分for循环是正常结束还是中途结束
for(int i=0;i<word.length();i++){//遍历单词数组
if((word.charAt(i)+"").equals(letter)) {//如果输入的字母存在
isExist=true;//标签改为true
if(state[i]==false){//如果字母存在且状态为false(没有更新)
state[i]=true;//更新后状态修改为true
}else{
System.out.println("\t"+letter+" is already in the word !");//否则就是存在且已经更新过状态了,输出此字母已经存在
return;//结束遍历
}
}
}
if(!isExist){//如果标签为false,及此字母不存在于此单词中
missed++;//你猜错了,错误次数++
System.out.println("\t"+letter+" is not in the word !");//打印没有这个字母
}
}
public static String getPwd(){//获取密文的方法
String pwd="";//先定义一个存密文的字符串
for(int i=0;i<word.length();i++){//遍历单词
if(state[i]==true){//如果状态是true ,表明存在需要修改
pwd+=word.charAt(i);//打印正确的字母
}
else{//否则不是不需要修改
pwd+="*";//打印单词长度所对应的***长度
}
}
return pwd;//打印完之后就返回密文
}
}
易错问题:
- 数组的长度不用(),获取字符串的长度不用括号
- 返回值的类型要清楚,有时不明白返回类型时就可以void
- 输入一个字符也是以字符串形式存储的
- 比较字符与字符串时要将字符转换为字符串+" ",也可将字符串转为字符就是取下标charAt(0)
- \t 横向跳格,即前边有一定的空格,\n换行
- 判断相等是是==,两个等号哦
总结:题目要求分析到位,每一步都需要代码实现,一步一步解决,不妨实现一步编译运行看看结果,再慢慢优化,易错雷区勿踩,要多加联系就会减少出错哦,要细心哟!