编写一个猜词游戏,随机产生一个单词,并以" * “显示,之后提示用户一次输入一个字母,如果单词中有该字母,则用该字母替换到对应的” * "位置上的字符,当用户猜完全部字母,显示一共猜错了多少次,并询问是否继续猜下一个单词。
例如:
- 当前单词为 ***** --> 输入h后
- 当前单词为 h**** -->输入l后
- 当前单词为 hll
- 直到全部猜完后 提示 一共错误 几次 是否继续游戏(Y/N)
- 输入Y继续游戏 输入N结束游戏
分析:
- 首先词库的获取不是一个JVM就可以提供的,所以新手起步,排除随机拿出一个可读单词的可能性。
- 然后新建一个字符串,考虑到与大小写无关,我们用小写字母组成一个一个5位的字符串s1。
- 再新建一个字符串s2,由五个“ * ” 组成。
- 开始猜词,屏幕打印一个字符,就遍历s1,如果有相同的,将s2替换对应该字符的下标的字符,并重新打印在屏幕。
- 直到全部猜对,结束进程。判断是否全部猜对的元素可以是替换的次数是否等于s1的字符串长度,也可以判断s2是否包含“ * ”。
- 开始编程。
package Test;
import static java.lang.String.valueOf;
import java.util.Random;
import java.util.Scanner;
/*
编写一个猜词游戏,随机产生一个单词,并以*显示
之后提示用户一次输入一个字母,如果单词中有该字母,则用该字母替换到对应的*位置上的字符
当用户猜完全部字母,显示一共猜错了多少次,并询问是否继续猜下一个单词。
例如:
当前单词为 ***** --> 输入h后
当前单词为 h**** -->输入l后
当前单词为 h*ll*
直到全部猜完后 提示 一共错误 几次 是否继续游戏(Y/N)
输入Y继续游戏 输入N结束游戏
*/
public class Test {
public static void main(String[] args) {
start();
}
public static String s1(int n) {//随机生成字符串方法
Random r = new Random();
String a = "abcdefghigklmnopqrstuvwxyz";
char[] array = new char[n];
for (int i = 0; i < array.length; i++) {
array[i] = a.charAt(r.nextInt(26));
}
String s1 = valueOf(array);
return s1;
}
public static char input(){//用户输入方法
Scanner sc=new Scanner(System.in);
char c=(char)sc.nextLine().charAt(0);
return c;
}
public static void chuanzhi(String a,char[] b,int n){//用来改变字符数组的值
// System.out.println(a);//字符串对照,调试使用
System.out.println(b);
System.out.println("您错误的次数;"+n/4);
if(search(b,'*')){
char c = input();
for (int i = 0; i <a.toCharArray().length ; i++) {
if(a.charAt(i)==c){
b[i]=c;
}else if(!search(a.toCharArray(),c)){
n++;
}
}
chuanzhi(a,b,n);
}else {
System.out.println("恭喜你通关了,是否再试一次?Y/N");
end();
}
}
public static void start(){//封装好游戏入口,方便调用
System.out.println("猜词游戏");
System.out.println("----------------------");
System.out.println("请输入单词的长度:");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String s1= s1(n);
char[] s2=new char[n];
for (int i = 0; i <s1.toCharArray().length ; i++) {
s2[i]='*';
}
System.out.println("正在随机生成单词。。。");
System.out.println("生成完毕!!!");
System.out.println("请开始猜单词!");
chuanzhi(s1,s2,1);
}
public static void end(){
char c=input();
if(c=='Y'||c=='y'){
start();
}else if(c=='N'||c=='n'){
System.out.println("正在退出。。。");
return;
}else {
System.out.println("请输入正确的字母...Y/N");
end();
}
}
public static boolean search(char[] arr,char b) {
for (int i = 0; i <arr.length ; i++) {
if(arr[i]==b){
return true;
}
}
return false;
}
}
总结:本题里面有太多要素,如果读者可以精读,绝对可以学到很多,由于目前线程还没有学,所以输入的字符要稍等一下,不要太快输入,否则线程会卡掉.
码字到深夜12:00纪念。
2020年12月9日修改后的代码
package test;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Random;
import java.util.Scanner;
public class Title4 {
/*
编写一个猜词游戏,随机产生一个单词,并以*显示
之后提示用户一次输入一个字母,如果单词中有该字母,则用该字母替换到对应的*位置上的字符
当用户猜完全部字母,显示一共猜错了多少次,并询问是否继续猜下一个单词。
例如:
当前单词为 ***** --> 输入h后
当前单词为 h**** -->输入l后
当前单词为 h*ll*
直到全部猜完后 提示 一共错误 几次 是否继续游戏(Y/N)
输入Y继续游戏 输入N结束游戏
*/
public static void main(String[] args) {
playGame();
}
public static void playGame(){
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("--来玩呀--");
int errorTime = 0;
int rightTime = 0;
String q = getQuestion();
StringBuilder xing = new StringBuilder();
for (int i = 0; i < q.length(); i++) {
xing.append("*");
}
int[] times = guessWord(new StringBuilder(q),xing,errorTime,rightTime,sc);
int count = times[0]+times[1];
double errort = times[0];
double lv = errort / count;
NumberFormat nf = new DecimalFormat("#0.0%");
String lvstr = nf.format(lv);
System.out.println("恭喜你终于答对了 ,这个词是:"+q);
System.out.println("此次猜词共进行了"+count+"次,错误:"+errort+"次,错误率为:"+lvstr+",是否需要再来一局?(Y/N)");
String r = sc.next();
if("n".equalsIgnoreCase(r)){
System.exit(0);
}
}
}
public static int[] guessWord(StringBuilder q,StringBuilder xing,int errorTime,int rightTime,Scanner sc){
while (xing.indexOf("*") != -1) {
//单词中含有* 则代表没有全部猜完 需要继续猜词
System.out.println("当前的词语为" + xing + " --->请输入当前猜的单词:");
String w = sc.next();
int start = 0;
int rep = 0;
boolean type = false;//状态为 表示 当前是否匹配到字符 如果匹配到 则变成true
while ((rep = q.indexOf(w, start)) != -1) {
type = true;
xing.replace(rep, rep+1, w);
start = ++rep;
}
if (!type) {
errorTime++;
} else {
rightTime++;
}
}
return new int[]{errorTime,rightTime};
}
public static String getQuestion(){
String[] q = {"hello","world","public","internationalization","runtimeException","Tom","Jerry","HelloKitty"};
Random r = new Random();
int index = r.nextInt(8);//当前的随机下标
return q[index];
}
}