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

 更新时间:2022年02月22日 08:30:32   作者:小虚竹and掘金  
这篇文章主要介绍了如何用Java编写一个英文猜词游戏,可以用来背英语单词。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

前言

《英文猜词游戏》代码行数没有超过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步,直至找到正确答案。

功能截图

游戏开始:

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

代码实现

游戏启动类

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;
    }
}

总结

通过此次的《英文猜词游戏》实现,让我对JAVA的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

以上就是Java实现英文猜词游戏的示例代码的详细内容,更多关于Java猜词游戏的资料请关注脚本之家其它相关文章!

相关文章

  • Java8函数式接口java.util.function速查大全

    Java8函数式接口java.util.function速查大全

    因为Java8引入了函数式接口,在java.util.function包含了几大类函数式接口声明,这篇文章主要给大家介绍了关于Java8函数式接口java.util.function速查的相关资料,需要的朋友可以参考下
    2021-08-08
  • spring boot与spring mvc的区别及功能介绍

    spring boot与spring mvc的区别及功能介绍

    这篇文章主要介绍了spring boot与spring mvc的区别是什么以及spring boot和spring mvc功能介绍,感兴趣的朋友一起看看吧
    2018-02-02
  • Java连接MySQL数据库并实现数据交互功能

    Java连接MySQL数据库并实现数据交互功能

    在现代应用中,数据库是不可或缺的一部分,Java 作为一种广泛使用的编程语言,提供了丰富的 API 来与各种数据库进行交互,本文将详细介绍如何在 Java 中连接 MySQL 数据库,并实现基本的数据交互功能,需要的朋友可以参考下
    2024-10-10
  • Java设计模式之单例模式简单解析

    Java设计模式之单例模式简单解析

    这篇文章主要介绍了Java设计模式之单例模式简单解析,单例模式的优点在于在内存中某个类只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例,避免对资源的多重暂用,需要的朋友可以参考下
    2023-12-12
  • Caused by: java.lang.NumberFormatException: For input string: “port“(问题解决)

    Caused by: java.lang.NumberFormatException: For input s

    这篇文章主要介绍了Caused by: java.lang.NumberFormatException: For input string: “port“,本文给大家分享完美解决方法,需要的朋友可以参考下
    2023-01-01
  • Array Index Out of Bounds:数组越界错误解决方案及调试技巧

    Array Index Out of Bounds:数组越界错误解决方案及调试技巧

    数组越界访问是指访问数组中超出其有效索引范围的元素,这是一种常见的编程错误,可能导致程序崩溃或数据损坏,下面这篇文章主要给大家介绍了关于Array Index Out of Bounds:数组越界错误解决方案及调试技巧的相关资料,需要的朋友可以参考下
    2024-08-08
  • 关于Java限流功能的简单实现

    关于Java限流功能的简单实现

    这篇文章主要介绍了关于Java限流功能的简单实现,在Java中,限流是一种常见的技术手段,用于控制系统的访问速率,以保护系统免受过载和滥用,需要的朋友可以参考下
    2023-07-07
  • HttpClient实现远程调用

    HttpClient实现远程调用

    这篇文章主要为大家详细介绍了HttpClient实现远程调用的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 详解java连接mysql数据库的五种方式

    详解java连接mysql数据库的五种方式

    这篇文章主要介绍了详解java连接mysql数据库的五种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • SpringBoot使用RestTemplate实现HTTP请求详解

    SpringBoot使用RestTemplate实现HTTP请求详解

    这篇文章主要为大家详细介绍了SpringBoot如何使用RestTemplate实现进行HTTP请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03

最新评论