Java实现英文猜词游戏的示例代码
作者:小虚竹and掘金 发布时间:2023-08-07 11:40:39
标签: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;
}
}
来源:https://juejin.cn/post/7067165682894389256


猜你喜欢
- 若将JDK版本升级到最新版本,Java窗体就可以简单实现窗体的透明效果,用户可以通过拉动滑块(Slider)调整窗体透明度,实现窗体不同透明
- 通过一个变量控制线程中断代码:package com.itsoku.chat05;import java.util.concurrent.T
- 总结并复现了一下Unsafe在安全领域的一些应用0 前言unsafe里面有很多好用的方法,比如allocateInstance可以直接创建实
- Android调试出现The selected device is incompatible问题解决在做Android调试时碰到该问题。详情
- 一、指标监控引入jar包: <dependency> &nb
- 一. String类简介1. 介绍字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来
- 本文实例为大家分享了C语言非递归后序遍历二叉树的具体代码,供大家参考,具体内容如下法一:实现思路:一个栈 先按 根->右子树->
- if语句使用布尔表达式或布尔值作为分支条件来进行分支控制,其中if语句有如下三种形式:第一种形式:if ( logic expression
- 本文实例讲述了Java类加载器和类加载机制。分享给大家供大家参考,具体如下:一 点睛1 类加载器负责将.class文件(可能在磁盘上,也可能
- 当屏幕变为横屏的时候,系统会重新呼叫当前Activity的OnCreate方法,你可以把以下方法放在你的OnCreate中来检查当前的方向,
- 本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下效果图:游戏介绍:1.2048是一款益智类小游戏,刚开始随
- Feign调用服务Headers传参在使用springcloud中经常会出现个服务调用,一般情况下会在Headers加上token的验证,那
- 看代码~ //创建socket对象 //第一个参数:设置网
- 目录1、下列四项中,不属于数据库系统的特点的是( )2、一个学生可以同时借阅多本书,一本书只能由一个学生借阅,学生和图书之间为 ( ) 联系
- 目录前言一、介绍一下GradientDrawable二、实现三、源码:总结前言今天和朋友聊到这个功能,刚开始的想法是自定义view,如何进行
- 常需要对list进行排序,小到List<String>,大到对自定义的类进行排序。不需要自行归并或堆排序。简单实现一个接口即可。
- NPOI 2.0将DataTable对象转换为Excel 2007文件提供下载using NPOI.SS.UserModel;using N
- LinearLayout<?xml version="1.0" encoding="utf-8"
- Java把内存分成两种,一种叫做栈内存,一种叫做堆内存在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
- 一、线程优先级的介绍java 中的线程优先级的范围是1~10,默认的优先级是5。“高优先级线程”会优先于“低优先级线程”执行。java 中有