使用java实现一个九宫格游戏
创始人
2024-11-18 02:01:30
0次

代码思路:

创建了一个九宫格按钮类(继承了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 l = new LinkedList();
 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();
 
 }

}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...