Java二維數(shù)組實(shí)現(xiàn)數(shù)字拼圖效果
二維數(shù)組實(shí)現(xiàn)數(shù)字拼圖,供大家參考,具體內(nèi)容如下
二維數(shù)組可以自己隨意定義大小,通過方法判斷來實(shí)現(xiàn)對(duì)所有的數(shù)字進(jìn)行隨機(jī)打亂,并可以通過移動(dòng)來正確還原,并可以判斷0(表示空格)是否可以移動(dòng),是否在范圍內(nèi)。
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[][] arrays = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 0 } }; int sum = 1; String direction; bianLi(arrays); daLuanErWeiShuZu(arrays); System.out.println("========================================"); while (true) { bianLi(arrays); if (isOk(arrays)) { break; } sum++; try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("請(qǐng)輸入移動(dòng)方向(W 上、S 下、A 左、D 右)"); direction = scanner.next(); switch (direction) { case "W": case "w": tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "上", arrays); break; case "S": case "s": tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "下", arrays); break; case "A": case "a": tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "左", arrays); break; case "D": case "d": tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "右", arrays); break; default: System.out.println("非法輸入,重新輸入"); break; } } System.out.println("一共走了" + sum + "步"); System.out.println("挑戰(zhàn)成功"); }
判斷當(dāng)前坐標(biāo)是否可以移動(dòng)
/** * 判斷當(dāng)前坐標(biāo)是否可以移動(dòng) * * @param arrays * @return 可以移動(dòng)返回true */ public static boolean isYiDong(int[][] arrays) { int returnX = returnX(arrays); int returnY = returnY(arrays); System.out.println(returnX + ":" + returnY); if (returnX >= 0 && returnX + 1 < arrays.length && returnY >= 0 && returnY + 1 < arrays.length) { return true; } return false; }
獲取當(dāng)前0所在行的具體地址
// 獲取0所在行的位置 public static int returnX(int[][] arrays) { for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays[i].length; j++) { if (0 == arrays[i][j]) { return i; } } } return -1; }
獲取當(dāng)前0所在列的具體地址
// 獲取0所在列的位置 public static int returnY(int[][] arrays) { for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays[i].length; j++) { if (0 == arrays[i][j]) { return j; } } } return -1; }
二維數(shù)組隨機(jī)打亂,需要判斷左上角、右上角、左下角、右下角、中間、上中、下種、左中、右中,那些方向可以移動(dòng),生成隨機(jī)數(shù)來確定移動(dòng)方向
// 二維數(shù)組隨機(jī)打亂 public static void daLuanErWeiShuZu(int[][] arrays) { for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays[i].length; j++) { // 左上 if (i == 0 && j == 0) { // 根據(jù)生成的隨機(jī)數(shù)確定向右邊邊移動(dòng)還是向下移動(dòng) if (ouShuOrJiShu()) { tiHuanShuZuWeiZhi(i, j, "下", arrays); } else { tiHuanShuZuWeiZhi(i, j, "右", arrays); } } // 右上 if (i == 0 && j == arrays[0].length - 1) { // 根據(jù)生成的隨機(jī)數(shù)確定向左邊邊移動(dòng)還是向下移動(dòng) if (ouShuOrJiShu()) { tiHuanShuZuWeiZhi(i, j, "下", arrays); } else { tiHuanShuZuWeiZhi(i, j, "左", arrays); } } // 左下 if (i == arrays.length - 1 && j == 0) { // 根據(jù)生成的隨機(jī)數(shù)確定向左邊邊移動(dòng)還是向下移動(dòng) if (ouShuOrJiShu()) { tiHuanShuZuWeiZhi(i, j, "上", arrays); } else { tiHuanShuZuWeiZhi(i, j, "右", arrays); } } // 右下 if (i == arrays.length - 1 && j == arrays[i].length - 1) { // 根據(jù)生成的隨機(jī)數(shù)確定向左邊邊移動(dòng)還是向下移動(dòng) if (ouShuOrJiShu()) { tiHuanShuZuWeiZhi(i, j, "上", arrays); } else { tiHuanShuZuWeiZhi(i, j, "左", arrays); } } // 上中 if (i == 0 && j > 0 && j < arrays[i].length - 1) { switch (oneToThree(3)) { case 0: tiHuanShuZuWeiZhi(i, j, "右", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "下", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "左", arrays); break; default: break; } } // 左中 if (j == 0 && i > 0 && i < arrays.length - 1) { switch (oneToThree(3)) { case 0: tiHuanShuZuWeiZhi(i, j, "上", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "右", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "下", arrays); break; default: break; } } // 下中 if (i == arrays.length - 1 && j > 0 && j < arrays[i].length - 1) { switch (oneToThree(3)) { case 0: tiHuanShuZuWeiZhi(i, j, "上", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "右", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "左", arrays); break; default: break; } } // 右中 if (j == arrays[i].length - 1 && i > 0 && i < arrays[i].length - 1) { switch (oneToThree(3)) { case 0: tiHuanShuZuWeiZhi(i, j, "上", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "左", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "下", arrays); break; default: break; } } if (i > 0 && j > 0 && i < arrays.length - 2 && j < arrays[i].length - 2) { switch (oneToThree(4)) { case 0: tiHuanShuZuWeiZhi(i, j, "上", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "右", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "下", arrays); break; case 3: tiHuanShuZuWeiZhi(i, j, "左", arrays); break; default: break; } } } } }
該方法實(shí)現(xiàn)對(duì)0的位置和需要替換位置數(shù)據(jù)的替換,并對(duì)0范圍進(jìn)行驗(yàn)證,怕0出現(xiàn)數(shù)組下標(biāo)越位。
/** * 根據(jù)輸入的數(shù)據(jù),對(duì)二維數(shù)組進(jìn)行數(shù)據(jù)替換 * * @param i 高位坐標(biāo) * @param j 地位坐標(biāo) * @param direction 移動(dòng)方向 * @param arrays 需要交換數(shù)據(jù)的數(shù)組 */ public static void tiHuanShuZuWeiZhi(int i, int j, String direction, int[][] arrays) { int tem = -1; switch (direction) { case "上": if (i > 0) { tem = arrays[i][j]; arrays[i][j] = arrays[i - 1][j]; arrays[i - 1][j] = tem; } break; case "下": if (i < arrays.length - 1) { tem = arrays[i][j]; arrays[i][j] = arrays[i + 1][j]; arrays[i + 1][j] = tem; } break; case "左": if (j > 0) { tem = arrays[i][j]; arrays[i][j] = arrays[i][j - 1]; arrays[i][j - 1] = tem; } break; case "右": if (j < arrays.length - 1) { tem = arrays[i][j]; arrays[i][j] = arrays[i][j + 1]; arrays[i][j + 1] = tem; } break; default: break; } }
完整代碼如下
import java.util.Random; import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[][] arrays = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 0 } }; int sum = 1; String direction; bianLi(arrays); daLuanErWeiShuZu(arrays); System.out.println("========================================"); while (true) { bianLi(arrays); if (isOk(arrays)) { break; } sum++; try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("請(qǐng)輸入移動(dòng)方向(W 上、S 下、A 左、D 右)"); direction = scanner.next(); switch (direction) { case "W": case "w": tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "上", arrays); break; case "S": case "s": tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "下", arrays); break; case "A": case "a": tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "左", arrays); break; case "D": case "d": tiHuanShuZuWeiZhi(returnX(arrays), returnY(arrays), "右", arrays); break; default: System.out.println("非法輸入,重新輸入"); break; } } System.out.println("一共走了" + sum + "步"); System.out.println("挑戰(zhàn)成功"); } // /** // * 判斷當(dāng)前坐標(biāo)是否可以移動(dòng) // * // * @param arrays // * @return 可以移動(dòng)返回true // */ // public static boolean isYiDong(int[][] arrays) { // int returnX = returnX(arrays); // int returnY = returnY(arrays); // System.out.println(returnX + ":" + returnY); // if (returnX >= 0 && returnX + 1 < arrays.length && returnY >= 0 && returnY + 1 < arrays.length) { // return true; // } // return false; // } /** * * @param arrays 需要驗(yàn)證的數(shù)據(jù) * @return 成功返回true */ public static boolean isOk(int[][] arrays) { int sum = 1; for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays.length; j++) { if (sum == 9) { sum = 0; } if (arrays[i][j] != sum) { return false; } sum++; } } return true; } // 獲取0所在行的位置 public static int returnX(int[][] arrays) { for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays[i].length; j++) { if (0 == arrays[i][j]) { return i; } } } return -1; } // 獲取0所在列的位置 public static int returnY(int[][] arrays) { for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays[i].length; j++) { if (0 == arrays[i][j]) { return j; } } } return -1; } // 遍歷二維數(shù)組 public static void bianLi(int[][] arrays) { for (int[] is : arrays) { for (int is2 : is) { System.out.print(is2 + "\t"); } System.out.println(); } } // 二維數(shù)組隨機(jī)打亂 public static void daLuanErWeiShuZu(int[][] arrays) { for (int i = 0; i < arrays.length; i++) { for (int j = 0; j < arrays[i].length; j++) { // 左上 if (i == 0 && j == 0) { // 根據(jù)生成的隨機(jī)數(shù)確定向右邊邊移動(dòng)還是向下移動(dòng) if (ouShuOrJiShu()) { tiHuanShuZuWeiZhi(i, j, "下", arrays); } else { tiHuanShuZuWeiZhi(i, j, "右", arrays); } } // 右上 if (i == 0 && j == arrays[0].length - 1) { // 根據(jù)生成的隨機(jī)數(shù)確定向左邊邊移動(dòng)還是向下移動(dòng) if (ouShuOrJiShu()) { tiHuanShuZuWeiZhi(i, j, "下", arrays); } else { tiHuanShuZuWeiZhi(i, j, "左", arrays); } } // 左下 if (i == arrays.length - 1 && j == 0) { // 根據(jù)生成的隨機(jī)數(shù)確定向左邊邊移動(dòng)還是向下移動(dòng) if (ouShuOrJiShu()) { tiHuanShuZuWeiZhi(i, j, "上", arrays); } else { tiHuanShuZuWeiZhi(i, j, "右", arrays); } } // 右下 if (i == arrays.length - 1 && j == arrays[i].length - 1) { // 根據(jù)生成的隨機(jī)數(shù)確定向左邊邊移動(dòng)還是向下移動(dòng) if (ouShuOrJiShu()) { tiHuanShuZuWeiZhi(i, j, "上", arrays); } else { tiHuanShuZuWeiZhi(i, j, "左", arrays); } } // 上中 if (i == 0 && j > 0 && j < arrays[i].length - 1) { switch (oneToThree(3)) { case 0: tiHuanShuZuWeiZhi(i, j, "右", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "下", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "左", arrays); break; default: break; } } // 左中 if (j == 0 && i > 0 && i < arrays.length - 1) { switch (oneToThree(3)) { case 0: tiHuanShuZuWeiZhi(i, j, "上", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "右", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "下", arrays); break; default: break; } } // 下中 if (i == arrays.length - 1 && j > 0 && j < arrays[i].length - 1) { switch (oneToThree(3)) { case 0: tiHuanShuZuWeiZhi(i, j, "上", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "右", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "左", arrays); break; default: break; } } // 右中 if (j == arrays[i].length - 1 && i > 0 && i < arrays[i].length - 1) { switch (oneToThree(3)) { case 0: tiHuanShuZuWeiZhi(i, j, "上", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "左", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "下", arrays); break; default: break; } } if (i > 0 && j > 0 && i < arrays.length - 2 && j < arrays[i].length - 2) { switch (oneToThree(4)) { case 0: tiHuanShuZuWeiZhi(i, j, "上", arrays); break; case 1: tiHuanShuZuWeiZhi(i, j, "右", arrays); break; case 2: tiHuanShuZuWeiZhi(i, j, "下", arrays); break; case 3: tiHuanShuZuWeiZhi(i, j, "左", arrays); break; default: break; } } } } } /** * 判斷是否是偶數(shù) * * @return 偶數(shù)返回true */ public static boolean ouShuOrJiShu() { return new Random().nextInt(1000) % 2 == 0 ? true : false; } /** * * @param n 需要模的值 * @return 返回0-(n-1)的值 */ public static int oneToThree(int n) { return new Random().nextInt(1000) % n; } /** * 根據(jù)輸入的數(shù)據(jù),對(duì)二維數(shù)組進(jìn)行數(shù)據(jù)替換 * * @param i 高位坐標(biāo) * @param j 地位坐標(biāo) * @param direction 移動(dòng)方向 * @param arrays 需要交換數(shù)據(jù)的數(shù)組 */ public static void tiHuanShuZuWeiZhi(int i, int j, String direction, int[][] arrays) { int tem = -1; switch (direction) { case "上": if (i > 0) { tem = arrays[i][j]; arrays[i][j] = arrays[i - 1][j]; arrays[i - 1][j] = tem; } break; case "下": if (i < arrays.length - 1) { tem = arrays[i][j]; arrays[i][j] = arrays[i + 1][j]; arrays[i + 1][j] = tem; } break; case "左": if (j > 0) { tem = arrays[i][j]; arrays[i][j] = arrays[i][j - 1]; arrays[i][j - 1] = tem; } break; case "右": if (j < arrays.length - 1) { tem = arrays[i][j]; arrays[i][j] = arrays[i][j + 1]; arrays[i][j + 1] = tem; } break; default: break; } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)詳解
- java二維數(shù)組指定不同長(zhǎng)度實(shí)例方法
- java二維數(shù)組實(shí)現(xiàn)推箱子小游戲
- Java二維數(shù)組與動(dòng)態(tài)數(shù)組ArrayList類詳解
- Java二維數(shù)組查找功能代碼實(shí)現(xiàn)
- Java二維數(shù)組實(shí)戰(zhàn)案例
- java二維數(shù)組遍歷的2種代碼
- Java二維數(shù)組計(jì)算集合總結(jié)
- Java二維數(shù)組簡(jiǎn)單定義與使用方法示例
- java二維數(shù)組基礎(chǔ)知識(shí)詳解
相關(guān)文章
Java基礎(chǔ)之List內(nèi)元素的排序性能對(duì)比
這篇文章主要介紹了Java基礎(chǔ)之List內(nèi)元素的排序性能對(duì)比,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Spring Boot中使用 Spring Security 構(gòu)建權(quán)限系統(tǒng)的示例代碼
本篇文章主要介紹了Spring Boot中使用 Spring Security 構(gòu)建權(quán)限系統(tǒng)的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08解決異常處理問題:getReader()?has?already?been?called?for?this
這篇文章主要介紹了解決異常處理:getReader()?has?already?been?called?for?this問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Idea?springboot?springCloud熱加載熱調(diào)試兩種常用方式
這篇文章主要介紹了Idea?springboot?springCloud熱加載熱調(diào)試常用的兩種方式,在項(xiàng)目開發(fā)的過程中,需要修改調(diào)試的時(shí)候偶每次都需要重啟項(xiàng)目浪費(fèi)時(shí)間,下面是我整理的兩種常用的兩種方式,需要的朋友可以參考下2023-04-04springMVC的RequestMapping請(qǐng)求不到路徑的解決
這篇文章主要介紹了springMVC的RequestMapping請(qǐng)求不到路徑的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08IDEA 顯示Run Dashboard窗口的2種方式(推薦)
這篇文章主要介紹了IDEA 顯示Run Dashboard窗口的2種方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08使用java8 API遍歷過濾文件目錄及子目錄和隱藏文件示例詳解
這篇文章主要介紹了使用java8API遍歷過濾文件目錄及子目錄及隱藏文件示例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07