欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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();
 
 }

}

运行结果:

java实现九宫格游戏

java实现九宫格游戏

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

相关标签: java 九宫格