java實(shí)現(xiàn)單詞小游戲
本文實(shí)例為大家分享了java實(shí)現(xiàn)單詞小游戲的具體代碼,供大家參考,具體內(nèi)容如下
介紹
公司最近有一個(gè)競(jìng)技場(chǎng)項(xiàng)目,里面有一個(gè)單詞小游戲。
游戲大概就是隨機(jī)生成一個(gè)5*5的棋盤(pán),上面有單詞的字母,通過(guò)滑動(dòng)連出正確的單詞。
棋盤(pán)生成算法
思路
首先隨機(jī)選個(gè)一個(gè)起點(diǎn),從這個(gè)點(diǎn)開(kāi)始鋪單詞。
分別選取上下左右四個(gè)方向作為下一個(gè)字母的擺放位置,不能觸邊也不能走重復(fù)路,直到平鋪完所有的單詞。
如果在棋盤(pán)能平鋪下單詞的情況下,找不到路徑,就從四個(gè)角作為起點(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; } // 單詞長(zhǎng)度大于棋盤(pán) 鋪不下 直接返回 if (word.length() > m * n) { return; } // 初始化棋盤(pán) 全為* initBoard(m, n); char[] wordChar = word.toCharArray(); // 隨機(jī)選取一個(gè)位置開(kāi)始 Random random = new Random(); int randomX = random.nextInt(m); int randomY = random.nextInt(n); // 開(kāi)始從隨機(jī)位置dfs鋪單詞 從index 0 開(kāi)始 boolean result = generateDfs(board, wordChar, randomX, randomY, 0); // 如果沒(méi)有找到路線 那么從四個(gè)角開(kāi)始 必能找到一條路 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ī)四個(gè)角的一個(gè) Collections.shuffle(starts); // 初始化棋盤(pán) 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)走過(guò)的位置 不能走了 死路 if (i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] == '/') { return false; } // 擺放一個(gè)字母 board[i][j] = wordChar[index]; //如果已經(jīng)達(dá)到單詞長(zhǎng)度則直接返回 找到一條路 if (index == wordChar.length - 1) { return true; } // 記錄當(dāng)前矩陣元素 char tmp = board[i][j]; // 修改為/ 表示已經(jīng)訪問(wèn)過(guò) board[i][j] = '/'; // 向上下左右四個(gè)方向開(kāi)啟遞歸 // 查看能走幾個(gè)方向 隨機(jī)選擇一個(gè) 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 說(shuō)明找到一條路 就不再遍歷了 還原后返回true if (res) { // 還原矩陣元素 board[i][j] = tmp; return true; } } // 還原矩陣元素 board[i][j] = '*'; return false; } }
運(yùn)行結(jié)果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java簡(jiǎn)易小游戲制作代碼
- java實(shí)現(xiàn)2048小游戲(含注釋)
- java實(shí)現(xiàn)簡(jiǎn)單的猜數(shù)字小游戲
- Java實(shí)現(xiàn)2048小游戲(可直接運(yùn)行)
- java實(shí)現(xiàn)象棋小游戲
- 利用Java編寫(xiě)24點(diǎn)小游戲的實(shí)例代碼
- java實(shí)現(xiàn)單機(jī)版五子棋小游戲
- java面向?qū)ο笾藱C(jī)猜拳小游戲
- Java實(shí)現(xiàn)天天酷跑小游戲完整代碼(附源碼)
- Java實(shí)現(xiàn)簡(jiǎn)單的五子棋小游戲
- 利用java開(kāi)發(fā)簡(jiǎn)易版掃雷游戲
相關(guān)文章
java加密算法分享(rsa解密、對(duì)稱(chēng)加密、md5加密)
這篇文章主要介紹了java加密算法,包括rsa解密、對(duì)稱(chēng)加密、md5加密等,需要的朋友可以參考下2014-05-05Java實(shí)現(xiàn)Windows計(jì)算器界面
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)Windows計(jì)算器界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的圖文教程
這篇文章主要介紹了idea 2023.1字體設(shè)置及自動(dòng)調(diào)整大小的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07基于FileNotFoundException問(wèn)題的解決
這篇文章主要介紹了基于FileNotFoundException問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03spring使用WebSocket注入service層失敗問(wèn)題及解決
這篇文章主要介紹了spring使用WebSocket注入service層失敗問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Java數(shù)組集合的深度復(fù)制代碼實(shí)例
這篇文章主要介紹了Java數(shù)組集合的深度復(fù)制代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Springboot如何通過(guò)自定義工具類(lèi)獲取bean
這篇文章主要介紹了Springboot通過(guò)自定義工具類(lèi)獲取bean方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09簡(jiǎn)單介紹區(qū)分applet和application的方法
applet和application都是Java語(yǔ)言編寫(xiě)出來(lái)的應(yīng)用程序,本文簡(jiǎn)單介紹了二者的不同之處,需要的朋友可以參考下2017-09-09Activiti開(kāi)發(fā)環(huán)境的搭建過(guò)程詳解
這篇文章主要介紹了Activiti開(kāi)發(fā)環(huán)境的搭建過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03