java实现单词小游戏
作者:mangoBUPT 发布时间:2023-11-25 05:03:33
标签:java,单词
本文实例为大家分享了java实现单词小游戏的具体代码,供大家参考,具体内容如下
介绍
公司最近有一个竞技场项目,里面有一个单词小游戏。
游戏大概就是随机生成一个5*5的棋盘,上面有单词的字母,通过滑动连出正确的单词。
棋盘生成算法
思路
首先随机选个一个起点,从这个点开始铺单词。
分别选取上下左右四个方向作为下一个字母的摆放位置,不能触边也不能走重复路,直到平铺完所有的单词。
如果在棋盘能平铺下单词的情况下,找不到路径,就从四个角作为起点,必能找到路径。
代码
import java.util.*;
/**
* @author Wang Guolong
* @version 1.0
* @date 2020/7/31 5:50 下午
*/
public class GenerateWordBoard {
private static char[][] board;
public static void main(String[] args) {
GenerateWordBoard g = new GenerateWordBoard();
g.generateCharBoard("vocabulary", 5, 5);
}
private void generateCharBoard(String word, int m, int n) {
// 单词为空 直接返回
if (word.isEmpty()) {
return;
}
// 单词长度大于棋盘 铺不下 直接返回
if (word.length() > m * n) {
return;
}
// 初始化棋盘 全为*
initBoard(m, n);
char[] wordChar = word.toCharArray();
// 随机选取一个位置开始
Random random = new Random();
int randomX = random.nextInt(m);
int randomY = random.nextInt(n);
// 开始从随机位置dfs铺单词 从index 0 开始
boolean result = generateDfs(board, wordChar, randomX, randomY, 0);
// 如果没有找到路线 那么从四个角开始 必能找到一条路
if (!result) {
List<int[]> starts = Arrays.asList(new int[]{0, 0}, new int[]{0, n - 1}, new int[]{m - 1, 0},
new int[]{m - 1, n - 1});
// 随机四个角的一个
Collections.shuffle(starts);
// 初始化棋盘
initBoard(m, n);
// dfs铺单词
generateDfs(board, wordChar, starts.get(0)[0], starts.get(0)[1], 0);
}
// 查看结果
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
private void initBoard(int m, int n) {
// 初始化
board = new char[m][n];
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
board[i][j] = '*';
}
}
}
/**
* 返回true则为找到一条路 返回false为死路
*/
private boolean generateDfs(char[][] board, char[] wordChar, int i, int j, int index) {
// 碰到边 或者碰到已经走过的位置 不能走了 死路
if (i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] == '/') {
return false;
}
// 摆放一个字母
board[i][j] = wordChar[index];
//如果已经达到单词长度则直接返回 找到一条路
if (index == wordChar.length - 1) {
return true;
}
// 记录当前矩阵元素
char tmp = board[i][j];
// 修改为/ 表示已经访问过
board[i][j] = '/';
// 向上下左右四个方向开启递归
// 查看能走几个方向 随机选择一个
List<int[]> directions = Arrays.asList(new int[]{-1, 0}, new int[]{1, 0}, new int[]{0, -1}, new int[]{0, 1});
Collections.shuffle(directions);
boolean res = false;
for (int k = 0; k < directions.size(); k++) {
int di = i + directions.get(k)[0], dj = j + directions.get(k)[1];
boolean partialRes = generateDfs(board, wordChar, di, dj, index + 1);
if (k == 0) {
res = partialRes;
} else {
res = res || partialRes;
}
// 如果res为true 说明找到一条路 就不再遍历了 还原后返回true
if (res) {
// 还原矩阵元素
board[i][j] = tmp;
return true;
}
}
// 还原矩阵元素
board[i][j] = '*';
return false;
}
}
运行结果
来源:https://blog.csdn.net/MCmango/article/details/113937740


猜你喜欢
- 介绍在进行项目开发的时候,刚好需要用到对字符串表达式进行求值的处理场景,因此寻找了几个符合要求的第三方组件LambdaParser、Dyna
- 本文实例为大家分享了C#实现飞行棋的具体代码,供大家参考,具体内容如下基于Winform框架写的不足之处请大佬指教using System;
- 本期文章源码:GitHub一文彻底搞懂《并查集》!概念并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。
- 一、常见场景1、ThreadLocal作为线程上下文副本,那么一种最常见的使用方式就是用来方法隐式传参,通过提供的set()和get()两个
- Environment的中文意思是环境,它表示整个spring应用运行时的环境信息,它包含两个关键因素profilespropertiesp
- Map集合的概述概述:interface Map<K,V> 其中K是键的类型,键是唯一的,不重复。V是值的类型,是可以重复。且每
- 目录一、Ehcache缓存简介Hibernate缓存EhCache缓存特点对比Redis缓存二、集成SpringBoot框架1、核心依赖2、
- INotifyPropertyChanged:该接口包含一个事件, 针对属性发生变更时, 执行该事件发生。// /
- 这篇文章主要介绍了Java ForkJoin框架的原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- jwt简介冒泡排序:(Bubble Sort)是一种简单的交换排序。之所以叫做冒泡排序,因为我们可以把每个元素当成一个小气泡,根据气泡大小,
- Service翻译成中文是服务,熟悉Windows 系统的同学一定很熟悉了。Android里的Service跟Windows里的Servic
- 一.关于使用Mybatisplus自带的selectById和insert方法时的一些问题1.selectById的问题(1).表的主键列名
- 这篇文章主要介绍了JAVA如何定义构造函数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 1、点击【File】->【Project Structure】菜单(或使用Shift+Ctrl+Alt+S快捷键),打开【Projec
- 前言以前用到要对数字格式的地方,都是直接到网上搜一下。拿过来能用就行。因为平时用的不多。但是最近的项目对这个用的多了。网上拿来的不够用了。自
- 一、问题在哪里?问题来源于app开发中一个很常见的场景——用户头像要展示成圆的: 二、怎么
- 说明:1、集合类型参数化;2、可根据集合中的对象的各个属性进行排序,传入属性名称即可;注:属性必须实现了IComparable接口,C#中i
- 前台代码: <asp:Button ID="Button1" runat="server" T
- 前言说起Android进行间通信,大家第一时间会想到AIDL,但是由于Binder机制的限制,AIDL无法传输超大数据。那么我们如何在进程间
- ${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的 SQL 中,