java实现九宫格游戏
程序员文章站
2022-05-05 09:08:16
本文实例为大家分享了java实现九宫格游戏的具体代码,供大家参考,具体内容如下代码思路:创建了一个九宫格按钮类(继承了jbutton),定义了一个九宫格类,先随机生成8个数,用网格排版放入9个格子,然...
本文实例为大家分享了java实现九宫格游戏的具体代码,供大家参考,具体内容如下
代码思路:
创建了一个九宫格按钮类(继承了jbutton),定义了一个九宫格类,先随机生成8个数,用网格排版放入9个格子,然后在游戏创建了3x3的矩阵用于存储状态,再对每个按键加监听器,当按下去时判断能否移动,能移动则交换空格和这个按钮的名字,每次按下去判断是否从1-8排布,判断是否赢。
由于随机生成的排序,所以没有考虑到无解的情况。如果要使有解,可以对于12345678这样的排列,逆序对为0,因此为偶排列,我们对其中的任意两个数进行交换一次,奇偶性对调,变成奇排列,再交换一次又变成偶排列,因此你可以初始化游戏时,通过对12345678进行偶数次有效移动即可。
代码
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);//根据指定字体名称、样式和磅值大小,创建一个新 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());//添加监听器 } 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的随机数 rand = new int[8];//随机数 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", "你赢了,是否继续", 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(); } }
运行结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: 一兜糖闪退怎么办 一兜糖闪退解决方法介绍