java實現(xiàn)單詞小游戲
本文實例為大家分享了java實現(xiàn)單詞小游戲的具體代碼,供大家參考,具體內(nèi)容如下
介紹
公司最近有一個競技場項目,里面有一個單詞小游戲。
游戲大概就是隨機(jī)生成一個5*5的棋盤,上面有單詞的字母,通過滑動連出正確的單詞。
棋盤生成算法
思路
首先隨機(jī)選個一個起點(diǎn),從這個點(diǎn)開始鋪單詞。
分別選取上下左右四個方向作為下一個字母的擺放位置,不能觸邊也不能走重復(fù)路,直到平鋪完所有的單詞。
如果在棋盤能平鋪下單詞的情況下,找不到路徑,就從四個角作為起點(diǎn),必能找到路徑。
代碼
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();
// 隨機(jī)選取一個位置開始
Random random = new Random();
int randomX = random.nextInt(m);
int randomY = random.nextInt(n);
// 開始從隨機(jī)位置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});
// 隨機(jī)四個角的一個
Collections.shuffle(starts);
// 初始化棋盤
initBoard(m, n);
// dfs鋪單詞
generateDfs(board, wordChar, starts.get(0)[0], starts.get(0)[1], 0);
}
// 查看結(jié)果
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) {
// 碰到邊 或者碰到已經(jīng)走過的位置 不能走了 死路
if (i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] == '/') {
return false;
}
// 擺放一個字母
board[i][j] = wordChar[index];
//如果已經(jīng)達(dá)到單詞長度則直接返回 找到一條路
if (index == wordChar.length - 1) {
return true;
}
// 記錄當(dāng)前矩陣元素
char tmp = board[i][j];
// 修改為/ 表示已經(jīng)訪問過
board[i][j] = '/';
// 向上下左右四個方向開啟遞歸
// 查看能走幾個方向 隨機(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;
}
}
運(yùn)行結(jié)果




以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南
這篇文章主要為大家介紹了Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Java連接Mysql數(shù)據(jù)庫詳細(xì)代碼實例
這篇文章主要介紹了Java連接Mysql數(shù)據(jù)庫詳細(xì)代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
Java通過反射機(jī)制將對象封裝成JSON和JsonArray格式
這篇文章主要介紹了Java通過反射機(jī)制將對象封裝成JSON和JsonArray格式,JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法,需要的朋友可以參考下2023-10-10
如何基于LoadingCache實現(xiàn)Java本地緩存
這篇文章主要介紹了如何基于LoadingCache實現(xiàn)Java本地緩存,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
關(guān)于Springboot+gateway整合依賴并處理依賴沖突問題
這篇文章主要介紹了Springboot+gateway整合依賴并處理依賴沖突問題,給大家提到了spring boot版本和spring cloud版本,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
Eclipse連接Mysql數(shù)據(jù)庫操作總結(jié)
這篇文章主要介紹了Eclipse連接Mysql數(shù)據(jù)庫操作總結(jié)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08

