Java实现英文猜词游戏的示例代码

作者:小虚竹and掘金 时间:2023-08-07 11:40:39 

前言

《英文猜词游戏》代码行数没有超过200行,是之前为了背英语单词,特意研发的小游戏。

主要设计

1.事先准备单词文本。

2.为了让玩家能与程序互动,使用下面这个命令可达效果

Scanner sc = new Scanner(System.in);

3.运行WordleMaster里的main方法

4.在Wordle中输入第一个单词(默认第一个单词是abort,会显示在console中。可在代码中修改)

5.将Wordle中的判定结果输入到console中。

  • 0表示不包含该字母,即灰色。

  • 1表示包含该字母,但是位置不正确,即黄色。

  • 2表示包含该字母且在正确的位置,即绿色。

6.在console输出的结果中选择一个单词输入Wordle中,并在console中输入该词的序号。

7.重复5-6步,直至找到正确答案。

功能截图

游戏开始:

Java实现英文猜词游戏的示例代码

输入单词(这个单词可以自己设定)

Java实现英文猜词游戏的示例代码

Java实现英文猜词游戏的示例代码

代码实现

游戏启动类

public class WordleMaster {
   public static void main(String[] args) throws IOException {
       final String DEFAULT_FIRST_WORD = "abort";
       Scanner sc = new Scanner(System.in);
       System.out.println("欢迎使用 wordle-master !请在Wordle游戏中输入第一个单词:(输入回车则默认使用abort作为初始词)");
       System.out.println("提示:英文单词长度要为5!");
       Word lastWord = new Word(sc.nextLine());
       while (!lastWord.isValid()) {
           if (lastWord.getWord().equals("")) {
               lastWord = new Word(DEFAULT_FIRST_WORD);
               break;
           }
           System.out.println("请输入一个有效的单词!");
           lastWord = new Word(sc.nextLine());
       }
       System.out.println("初始词为:" + lastWord.getWord());
       Pattern pattern = new Pattern();
       // 输入Wordle结果
       int[] res = pattern.result();

// 读取所有的单词
       List<Word> allWords = new ArrayList<>();

File file = new File("wordle_words.txt");
       InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
       BufferedReader bufferedReader = new BufferedReader(reader);
       String word = bufferedReader.readLine();
       while (word != null){
           Word w = new Word(word);
           allWords.add(w);
           word = bufferedReader.readLine();
       }
       bufferedReader.close();
       reader.close();

// 符合条件的单词
       List<Word> hope = allWords;
       while (hope.size() > 1){
           for (int i = 0; i < res.length; i++) {
               int finalI = i;
               Word finalLastWord = lastWord;
               // 如果出现单词中有两个相同字母的情况(如cheer)
               for (int j = 0; j < finalLastWord.getWord().length(); j++) {
                   for (int k = j + 1; k < finalLastWord.getWord().length(); k++) {
                       if (finalLastWord.getWord().charAt(j) == finalLastWord.getWord().charAt(k)){
                           if (res[j] == 0 && res[k] != 0){
                               res[j] = 3;
                               hope.remove(lastWord);
                           }else if(res[j] != 0 && res[k] == 0){
                               res[k] = 3;
                               hope.remove(lastWord);
                           }
                       }
                   }
               }
               switch (res[i]) {
                   case 0:
                       hope = hope.stream().filter(w -> w.notInclude(finalLastWord.getWord().charAt(finalI))).collect(Collectors.toList());
                       break;
                   case 2:
                       hope = hope.stream().filter(w -> w.getWord().charAt(finalI) == finalLastWord.getWord().charAt(finalI)).collect(Collectors.toList());
                       break;
                   case 1:
                       hope = hope.stream().filter(w -> w.notLocate(finalLastWord.getWord().charAt(finalI), finalI)).collect(Collectors.toList());
                       break;
                   default:
               }
           }
           System.out.println("size: " + hope.size());
           for (int i = 0; i < Math.min(10, hope.size()); i++) {
               System.out.print(i + ". " + hope.get(i).getWord() + "  ");
           }
           System.out.println();
           if (hope.size() > 1) {
               Scanner scanner = new Scanner(System.in);
               int chose = Integer.MAX_VALUE;
               while (chose > 9 || chose < 0) {
                   System.out.println("请选择一个:");
                   String s = scanner.nextLine();
                   chose = s.length() == 1 ? Integer.parseInt(s) : Integer.MAX_VALUE;
               }
               lastWord = hope.get(chose);
               System.out.println(lastWord.getWord());
               res = pattern.result();
           }
       }
   }

}

处理

public class Pattern {

private int[] pattern;

/**
    * 输入wordle结果,五位数字组成。
    * 0:The letter is not in the word in any spot.
    * 1:The letter is in the word and in the correct spot.
    * 2:The letter is in the word but in the wrong spot.
    * @return  int数组
    */
   public int[] result(){
       String s = "";
       while (input(s) == null){
           System.out.println("输入单词判定结果:0为灰色,1为黄色,2为绿色。例如10120。");
           Scanner scanner = new Scanner(System.in);
           s = scanner.nextLine();
       }
       pattern = input(s);
       return pattern;
   }

public int[] input(String s){
       if (s.length() != 5) return null;
       int[] res = new int[5];
       for (int i = 0; i < s.length(); i++) {
           if (s.charAt(i) < '0' || s.charAt(i) > '2') {
               return null;
           }
           res[i] = s.charAt(i) - '0';
       }
       return res;
   }

public int[] getPattern() {
       return pattern;
   }
}

单词判断

public class Word {
   private final String word;

Word(String word){
       this.word = word;
   }

public boolean notInclude(char c){
       return !word.contains(String.valueOf(c));
   }

public boolean notLocate(char c, int i){
       return word.contains(String.valueOf(c)) && word.charAt(i) != c;
   }

public String getWord(){
       return this.word;
   }
   public boolean isValid() {
       if (word.length() != 5) {
           return false;
       }
       for (int i = 0; i < word.length(); i++) {
           if (word.charAt(i) < 'a' || word.charAt(i) > 'z') {
               return false;
           }
       }
       return true;
   }
}

来源:https://juejin.cn/post/7067165682894389256

标签:Java,猜词,游戏
0
投稿

猜你喜欢

  • C# List介绍及具体用法

    2021-09-15 07:59:14
  • C#画图之饼图折线图的实现方法

    2021-12-05 22:26:13
  • Android实现多个连续带数字圆圈效果

    2021-09-10 02:46:23
  • C#中的yield关键字详解

    2023-01-11 08:19:01
  • IDEA标签tabs多行显示的设置

    2023-09-18 06:58:08
  • Protostuff序列化和反序列化的使用说明

    2022-08-29 07:28:08
  • android使用SoundPool播放音效的方法

    2023-07-08 01:16:29
  • C# 对Outlook2010进行二次开发的图文教程

    2022-02-03 00:34:34
  • Spring Security权限管理实现接口动态权限控制

    2022-07-03 12:25:53
  • C语言枚举(enum)和联合(union)实例分享

    2023-06-17 01:56:42
  • 解决javac不是内部或外部命令,也不是可运行程序的报错问题

    2022-07-13 22:39:25
  • Java 数据结构深入理解ArrayList与顺序表

    2023-02-15 14:24:07
  • Android PickerView实现三级联动效果

    2023-02-25 15:05:47
  • C#程序中类数量对程序启动的影响详解

    2022-09-02 11:35:02
  • Spring Boot集成Redis实现缓存机制(从零开始学Spring Boot)

    2023-03-21 15:11:38
  • flutter日期选择器 flutter时间选择器

    2023-09-22 04:50:15
  • idea首次使用需要配置哪些东西

    2022-05-16 20:01:37
  • C#实现读取指定盘符硬盘序列号的方法

    2023-05-23 15:06:39
  • 简单谈谈Java 中的线程的几种状态

    2023-05-10 13:29:45
  • Java TreeSet类的简单理解和使用

    2023-01-02 18:32:27
  • asp之家 软件编程 m.aspxhome.com