九宫格游戏(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;//所在位置的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实现)相关推荐
- java九宫格游戏实践
java九宫格游戏实践 1 问题描述 拼图游戏不仅能增强思维能力,提高智力而且富含哲理,有助于修身养性.它既有简单易学的特点,为人民群众喜闻乐见. 设计一款拼图游戏,本游戏主要完成:整幅图的现实,切换 ...
- java 九宫格数独_Java web - 数独九宫格游戏攻略
分享游戏攻略,源代码集集:- String path = request.getContextPath(); String basePath = request.getScheme()+": ...
- java课设 简单九宫格_[Java教程]简易版九宫格相加数值相等
[Java教程]简易版九宫格相加数值相等 0 2016-02-24 00:00:10 九宫格的样子以及游戏想大家接触过,想当年也是玩了好多九宫格游戏,其中最经典的就是1-9这九个数字填进格子,横竖向. ...
- 《LeetCode力扣练习》第55题 跳跃游戏 Java
<LeetCode力扣练习>第55题 跳跃游戏 Java 一.资源 题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大 ...
- leetcode-292-Nim游戏(java|python)
title: leetcode-292-Nim游戏(java|python) date: 2019-10-12 21:18:57 categories: leetcode tags: leetcode ...
- java实验2总结心得,打字小游戏JAVA实验总结及心得体会
篇一:扫雷游戏实验报告 课程设计 班 级: 姓 名: 学 号: 指导教师: 成 绩: 电子与信息工程学院信息与通信工程系 目录 1.任务概述------------------------------ ...
- java小游戏-java小游戏-大鱼吃小鱼
java小游戏-java小游戏-大鱼吃小鱼 1 创建窗口 2 添加背景图 3 启动封面 4 启动页面的点击事件 5 游戏开始时的背景添加 6 双缓存解决闪屏问题 7 地方第一条小鱼的添加 8 敌方左方 ...
- JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计
JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计 看到了这样的一道题目,还挺有意思,可以通过不同的算法设计来求解. 话说大诗人李白,一生好饮.一日,他提着酒壶,从家里出来,酒壶中有酒2斗.他边 ...
- 五子棋游戏Java代码简单实现(含活动图和类图设计)
五子棋游戏Java代码简单实现(含活动图和类图设计) 文章目录 五子棋游戏Java代码简单实现(含活动图和类图设计) 活动图设计 类图设计 代码实现 总结 OOA和OOD设计 代码设计 可改进部分 活 ...
- L2-040 哲哲打游戏 - java
L2-040 哲哲打游戏 Java (javac) 时间限制 800 ms 内存限制 64 MB Python (python3) 时间限制 1000 ms 内存限制 64 MB 其他编译器 时间限制 ...
最新文章
- 杀死某个已知名字的进程
- 【基础练习】【拓扑排序】codevs3294 车站分级题解
- 新时达二代操作器刷写数据线_新时达380全系一体机快捷调试
- JZOJ 5275. 水管
- pom文件报错_解决mac下tess4j文字识别报错问题
- 为内置对象添加原型方法 把局部变量编程全局变量
- Codeforces 374A - Inna and Pink Pony
- 关于静态资源压缩技术
- 外键 级联操作 mysql
- 虚拟机管理程序、虚拟化和云: 深入剖析 PowerVM 虚拟机管理程序
- 使用python调用百度ocr的API
- 抓取Amazon产品评论的神器
- YUV format online tool
- 下载徐小明新浪博客全部博文链接
- web地图热力图理解
- ECharts数据可视化:入门、实战与进阶干货分享(GitHub 44.5k)
- C++实现走迷宫算法
- 无线AP与无线路由的区别
- 淘宝店铺链接获取seller id,拿到店铺所有商品接口,接口接入技术解决方案
- B - Silly Mistake set +思维