java实现九宫格游戏

 更新时间:2020年11月01日 10:01:51   作者:Who_Am_I.  
这篇文章主要为大家详细介绍了java实现九宫格游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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();
 
 }

}

运行结果:

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

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

相关文章

  • Spring Native 基础环境搭建过程

    Spring Native 基础环境搭建过程

    Spring Native可以通过GraalVM将Spring应用程序编译成原生镜像,提供了一种新的方式来部署Spring应用,本文介绍Spring Native基础环境搭建,感兴趣的朋友跟随小编一起看看吧
    2024-02-02
  • Hadoop环境配置之hive环境配置详解

    Hadoop环境配置之hive环境配置详解

    这篇文章主要介绍了Hadoop环境配置之hive环境配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 使用Mybatis时SqlSessionFactory对象总是报空指针

    使用Mybatis时SqlSessionFactory对象总是报空指针

    本文主要介绍了使用Mybatis时SqlSessionFactory对象总是报空指针,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • Java中Instant的使用及转换

    Java中Instant的使用及转换

    Instant是java.time包中的一个类,本文主要介绍了Java中Instant的使用及转换,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 关于dubbo的RPC和RESTful性能及对比

    关于dubbo的RPC和RESTful性能及对比

    这篇文章主要介绍了关于dubbo的RPC和RESTful性能及对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java基于BIO实现文件上传功能

    Java基于BIO实现文件上传功能

    这篇文章主要为大家详细介绍了Java基于BIO实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 详解JavaWeb过滤器 Filter问题解决

    详解JavaWeb过滤器 Filter问题解决

    过滤器就是对事物进行过滤的,在Web中的过滤器,当然就是对请求进行过滤,我们使用过滤器,就可以对请求进行拦截,然后做相应的处理,实现许多特殊功能,今天主要给大家讲解JavaWeb过滤器 Filter问题解决,感兴趣的朋友一起看看吧
    2022-10-10
  • java开发线上事故理解RocketMQ异步精髓

    java开发线上事故理解RocketMQ异步精髓

    这篇文章主要介绍了java开发线上事故理解RocketMQ异步精髓
    2022-07-07
  • Java异或运算应用场景详解

    Java异或运算应用场景详解

    这篇文章主要给大家介绍了关于Java异或运算应用场景的相关资料,异或运算会应用在很多算法题中,这里整理了几个最常见的应用场景,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 哈希表在算法题目中的实际应用详解(Java)

    哈希表在算法题目中的实际应用详解(Java)

    散列表(Hash table,也叫哈希表)是根据关键码值(Key value)而直接进行访问的数据结构,下面这篇文章主要给大家介绍了关于哈希表在算法题目中的实际应用,文中介绍的方法是Java,需要的朋友可以参考下
    2024-03-03

最新评论