编写一个猜词游戏,随机产生一个单词,并以" * “显示,之后提示用户一次输入一个字母,如果单词中有该字母,则用该字母替换到对应的” * "位置上的字符,当用户猜完全部字母,显示一共猜错了多少次,并询问是否继续猜下一个单词。

例如:

  • 当前单词为 ***** --> 输入h后
  • 当前单词为 h**** -->输入l后
  • 当前单词为 hll
  • 直到全部猜完后 提示 一共错误 几次 是否继续游戏(Y/N)
  • 输入Y继续游戏 输入N结束游戏

分析:

  1. 首先词库的获取不是一个JVM就可以提供的,所以新手起步,排除随机拿出一个可读单词的可能性。
  2. 然后新建一个字符串,考虑到与大小写无关,我们用小写字母组成一个一个5位的字符串s1。
  3. 再新建一个字符串s2,由五个“ * ” 组成。
  4. 开始猜词,屏幕打印一个字符,就遍历s1,如果有相同的,将s2替换对应该字符的下标的字符,并重新打印在屏幕。
  5. 直到全部猜对,结束进程。判断是否全部猜对的元素可以是替换的次数是否等于s1的字符串长度,也可以判断s2是否包含“ * ”。
  6. 开始编程。
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];
    }

}