java實現(xiàn)九宮格游戲
本文實例為大家分享了java實現(xiàn)九宮格游戲的具體代碼,供大家參考,具體內(nèi)容如下
代碼思路:
創(chuàng)建了一個九宮格按鈕類(繼承了JButton),定義了一個九宮格類,先隨機生成8個數(shù),用網(wǎng)格排版放入9個格子,然后在游戲創(chuàng)建了3x3的矩陣用于存儲狀態(tài),再對每個按鍵加監(jiān)聽器,當按下去時判斷能否移動,能移動則交換空格和這個按鈕的名字,每次按下去判斷是否從1-8排布,判斷是否贏。
由于隨機生成的排序,所以沒有考慮到無解的情況。如果要使有解,可以對于12345678這樣的排列,逆序?qū)?,因此為偶排列,我們對其中的任意兩個數(shù)進行交換一次,奇偶性對調(diào),變成奇排列,再交換一次又變成偶排列,因此你可以初始化游戲時,通過對12345678進行偶數(shù)次有效移動即可。
代碼
Play.java
package game; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.LinkedList; import java.util.Random; import javax.swing.*; import java.util.*; class Number extends JButton{//按鍵 Number(int x,int y,String name){ super(name); this.name=name; this.x=x; this.y=y; } private String name; private int x;//所在位置的x private int y;//所在位置的y String GetName() { return name; } int GetX() { return x; } int GetY() { return y; } } //九宮格 class Box extends JFrame{ /* * 成員變量 */ Number []n;//方塊 int [][]A=new int[3][3];//地圖 Box(){//初始化 super("九宮格"); final int N = 9; setSize(500,500); Container c = getContentPane(); setLayout(new GridLayout(3,3)); n = new Number[N]; Font f=new Font("華文行楷",Font.BOLD,20);//根據(jù)指定字體名稱、樣式和磅值大小,創(chuàng)建一個新 Font。 Init(); for(int i=0;i<N-1;i++) { n[i]=new Number(i/3,i%3," "+(Rand[i])); n[i].setBackground(Color.yellow); n[i].setFont(f); c.add(n[i]); n[i].addActionListener(new Change());//添加監(jiān)聽器 } n[N-1]=new Number(2,2,"");//空格 n[N-1].setBackground(Color.yellow); n[N-1].setFont(f); n[N-1].addActionListener(new Change()); c.add(n[N-1]); for(int i=0;i<A.length;i++) { for(int j=0;j<A[i].length;j++) { if(i==2&&j==2) { continue; } A[i][j]=Rand[i*3+j]; } } A[2][2]=0; for(int i=0;i<A.length;i++) { for(int j=0;j<A[i].length;j++) { System.out.print(A[i][j]+" "); } System.out.println(); } setVisible(true); } int []Rand; void Init() {//生成1-8的隨機數(shù) Rand = new int[8];//隨機數(shù) Random r = new Random(1); int n; LinkedList<Integer> l = new LinkedList<Integer>(); for(int i=1;i<=8;i++) { n = r.nextInt(8); n=(int)(Math.random()*8); n = n+1; while(l.contains(n)) { n = (int)(Math.random()*8); n = n +1; } l.add(n); } for (int i = 0; i < l.size(); i++) { Rand[i]=l.get(i); System.out.println(Rand[i]); } } int []move=new int[2];//移動坐標 boolean Move(int x,int y) {//是否可以移動 int [][]Flag = {//四個方向 {-1,0},{0,1},{1,0},{0,-1} }; for(int i=0;i<4;i++) {//判斷四個方向是否可以移動 int xi,yi; xi=x+Flag[i][0]; yi=y+Flag[i][1]; if(xi>=0&&xi<=2&&yi>=0&&yi<=2&&A[xi][yi]==0) {//有空格,可以移動 move[0]=xi; move[1]=yi; return true; } } return false;//是否不可以運動 } boolean Win() {//是否贏 boolean flag=true; for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { System.out.print(A[i][j]+" "); if(i==2&&j==2) { if(A[i][j]!=0) flag = false; } else{ if((A[i][j]!=i*3+j+1)) flag=false; } } System.out.println(); } if(flag) { System.out.println("你贏了"); } return flag; } class Change implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO 自動生成的方法存根 //((Number)e.getSource()).setText("取消"); int x=((Number)e.getSource()).GetX(); int y=((Number)e.getSource()).GetY(); System.out.print(x+" "+y+"|||"); String s = ((Number)e.getSource()).GetName(); System.out.print(s); if(Move(x,y)) { System.out.println("可以移動"); int t = A[x][y]; System.out.print(t); A[x][y]=0; A[move[0]][move[1]]=t; System.out.println(move[0]+" "+move[1]); ((Number)e.getSource()).setText(""); System.out.println(t); n[move[0]*3+move[1]].setText(t+" "); } else { System.out.println("不可以移動"); } if(Win()) { int res = JOptionPane.showConfirmDialog(null, "GameWin", "你贏了,是否繼續(xù)", JOptionPane.YES_NO_OPTION); if (res == JOptionPane.YES_OPTION) { new Box(); } else { return; } } } } } public class Play { public static void main(String[] args) { // TODO 自動生成的方法存根 Box b = new Box(); } }
運行結(jié)果:
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談Java實現(xiàn)面向?qū)ο缶幊蘪ava oop
這篇文章主要介紹了淺談Java實現(xiàn)面向?qū)ο缶幊蘪ava oop,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-07-07Java實現(xiàn)注冊登錄與郵箱發(fā)送賬號驗證激活功能
這篇文章主要介紹了Java實現(xiàn)注冊登錄與郵箱發(fā)送賬號驗證激活功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習吧2022-12-12Java中ArrayList去除重復(fù)元素(包括字符串和自定義對象)
本文主要介紹了Java中ArrayList去除重復(fù)元素(包括字符串和自定義對象)的方法。具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03mybatis修改int型數(shù)據(jù)無法修改成0的解決
這篇文章主要介紹了mybatis修改int型數(shù)據(jù)無法修改成0的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09java后端pageHelper分頁實現(xiàn)方法步驟
這篇文章主要給大家介紹了關(guān)于java后端pageHelper分頁實現(xiàn)方法的相關(guān)資料,在我們的Java項目中分頁是必不可少的數(shù)據(jù)展示頁面,文中通過圖文以及示例代碼介紹的非常詳細,需要的朋友可以參考下2023-07-07SpringBoot+vue+Axios實現(xiàn)Token令牌的詳細過程
Token是在服務(wù)端產(chǎn)生的,前端可以使用用戶名/密碼向服務(wù)端請求認證(登錄),服務(wù)端認證成功,服務(wù)端會返回?Token?給前端,Token可以使用自己的算法自定義,本文給大家介紹SpringBoot+vue+Axios實現(xiàn)Token令牌,感興趣的朋友一起看看吧2023-10-10