当前位置: 移动技术网 > IT编程>开发语言>Java > java实现九宫格游戏

java实现九宫格游戏

2020年11月01日  | 移动技术网IT编程  | 我要评论
本文实例为大家分享了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();
 
 }

}

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网