代码思路:

创建了一个九宫格按钮类(继承了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;//所在位置的xprivate int y;//所在位置的yString 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{@Overridepublic 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实现)相关推荐

  1. java九宫格游戏实践

    java九宫格游戏实践 1 问题描述 拼图游戏不仅能增强思维能力,提高智力而且富含哲理,有助于修身养性.它既有简单易学的特点,为人民群众喜闻乐见. 设计一款拼图游戏,本游戏主要完成:整幅图的现实,切换 ...

  2. java 九宫格数独_Java web - 数独九宫格游戏攻略

    分享游戏攻略,源代码集集:- String path = request.getContextPath(); String basePath = request.getScheme()+": ...

  3. java课设 简单九宫格_[Java教程]简易版九宫格相加数值相等

    [Java教程]简易版九宫格相加数值相等 0 2016-02-24 00:00:10 九宫格的样子以及游戏想大家接触过,想当年也是玩了好多九宫格游戏,其中最经典的就是1-9这九个数字填进格子,横竖向. ...

  4. 《LeetCode力扣练习》第55题 跳跃游戏 Java

    <LeetCode力扣练习>第55题 跳跃游戏 Java 一.资源 题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大 ...

  5. leetcode-292-Nim游戏(java|python)

    title: leetcode-292-Nim游戏(java|python) date: 2019-10-12 21:18:57 categories: leetcode tags: leetcode ...

  6. java实验2总结心得,打字小游戏JAVA实验总结及心得体会

    篇一:扫雷游戏实验报告 课程设计 班 级: 姓 名: 学 号: 指导教师: 成 绩: 电子与信息工程学院信息与通信工程系 目录 1.任务概述------------------------------ ...

  7. java小游戏-java小游戏-大鱼吃小鱼

    java小游戏-java小游戏-大鱼吃小鱼 1 创建窗口 2 添加背景图 3 启动封面 4 启动页面的点击事件 5 游戏开始时的背景添加 6 双缓存解决闪屏问题 7 地方第一条小鱼的添加 8 敌方左方 ...

  8. JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计

    JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计 看到了这样的一道题目,还挺有意思,可以通过不同的算法设计来求解. 话说大诗人李白,一生好饮.一日,他提着酒壶,从家里出来,酒壶中有酒2斗.他边 ...

  9. 五子棋游戏Java代码简单实现(含活动图和类图设计)

    五子棋游戏Java代码简单实现(含活动图和类图设计) 文章目录 五子棋游戏Java代码简单实现(含活动图和类图设计) 活动图设计 类图设计 代码实现 总结 OOA和OOD设计 代码设计 可改进部分 活 ...

  10. L2-040 哲哲打游戏 - java

    L2-040 哲哲打游戏 Java (javac) 时间限制 800 ms 内存限制 64 MB Python (python3) 时间限制 1000 ms 内存限制 64 MB 其他编译器 时间限制 ...

最新文章

  1. 杀死某个已知名字的进程
  2. 【基础练习】【拓扑排序】codevs3294 车站分级题解
  3. 新时达二代操作器刷写数据线_新时达380全系一体机快捷调试
  4. JZOJ 5275. 水管
  5. pom文件报错_解决mac下tess4j文字识别报错问题
  6. 为内置对象添加原型方法 把局部变量编程全局变量
  7. Codeforces 374A - Inna and Pink Pony
  8. 关于静态资源压缩技术
  9. 外键 级联操作 mysql
  10. 虚拟机管理程序、虚拟化和云: 深入剖析 PowerVM 虚拟机管理程序
  11. 使用python调用百度ocr的API
  12. 抓取Amazon产品评论的神器
  13. YUV format online tool
  14. 下载徐小明新浪博客全部博文链接
  15. web地图热力图理解
  16. ECharts数据可视化:入门、实战与进阶干货分享(GitHub 44.5k)
  17. C++实现走迷宫算法
  18. 无线AP与无线路由的区别
  19. 淘宝店铺链接获取seller id,拿到店铺所有商品接口,接口接入技术解决方案
  20. B - Silly Mistake set +思维

热门文章

  1. 量土地用计算机,土地面积计算器
  2. h5实现文件下载,兼容ios、android
  3. 图像相似度对比分析软件,图像相似度计算方法
  4. Java map转list
  5. IT计算机实习:JAVA实习报告范文(三)
  6. 概率统计Python计算:离散型2-维随机向量的联合分布律及边缘分布
  7. 推荐Python、Django中文文档地址
  8. HBase数据库结构、存储理解(举例解释、容易理解、深入浅出)
  9. WebMagic抓取阿里司法拍卖信息
  10. php培训周期,合肥PHP培训周期为什么往往比2个月要长?