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

 }

}

运行结果:

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

(0)

相关推荐

  • Java实现解出世界最难九宫格问题

    芬兰数学家因卡拉花费3个月设计出了世界上迄今难度最大的数独游戏,而且它只有一个答案.因卡拉说只有思考能力最快.头脑最聪明的人才能破解这个游戏. 今日,一则腾讯的新闻称中国老头三天破解世界最难九宫格,虽然最后老人是改了一个数字,但是引起本人一时兴趣,想通过计算机程序求解该问题,于是在宿舍呆了一下午,终于成功求解,程序源码如下. 复制代码 代码如下: package numberGame; public class Point {     private int col;// 行号     priv

  • Java实现九宫格的简单实例

     Java实现九宫格的简单实例 九宫格:共有三行三列九个格子,从1到9共九个数字不重复地填入这九个格子中,条件是每行.每列.两个对角线上三个数字的和相等. 下面用Java实现九宫格: public class NineTable { public static void main(String[] args) { int arr[][] = new int[3][3]; int a = 2; int b = 3 / 2; for (int i = 1; i <= 9; i++) { arr[a+

  • java实现九宫格游戏

    本文实例为大家分享了java实现九宫格游戏的具体代码,供大家参考,具体内容如下 代码思路: 创建了一个九宫格按钮类(继承了JButton),定义了一个九宫格类,先随机生成8个数,用网格排版放入9个格子,然后在游戏创建了3x3的矩阵用于存储状态,再对每个按键加监听器,当按下去时判断能否移动,能移动则交换空格和这个按钮的名字,每次按下去判断是否从1-8排布,判断是否赢. 由于随机生成的排序,所以没有考虑到无解的情况.如果要使有解,可以对于12345678这样的排列,逆序对为0,因此为偶排列,我们对其

  • java实现九宫格拼图游戏

    本文实例为大家分享了java实现九宫格拼图游戏的具体代码,供大家参考,具体内容如下 设计步骤: 先将框架构思出来,首先将拼图游戏的雏形实现,即一个界面,九个按钮,按钮上的图片显示出自己想要的图片. (1)其次构思移动版块的问题,想到按钮直接互换是极为麻烦的一件事,所以采用更换按钮上的图片.按钮类上有两个属性,a[9]表示按钮的位置,b[9]表示按钮上图片的编号, 空白快图片编号为8标记,点击按钮之后,点击事件得到点击的块数在哪(1-9),if -else判断相邻是否为标记的空白快.方法简单但是代

  • Java太阳系小游戏分析和源码详解

    最近看了面向对象的一些知识,然后跟着老师的讲解做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下最近学的知识: 用到知识点:类的继承.方法的重载与重写.多态.封装等 分析: 1.需要加载图片.画图 2.建一个面板,主页面 3.行星类 效果图: 先看一下源码结构图: 现在逐步分析各个类的功能: 1)工具类-----util包中 --Constant类   封装了游戏中用到的常量 --GameUtil类  封装了游戏的图片加载功能 --MyFrame类  封装了游戏面板的构造,用于各面板的父类 -

  • java贪吃蛇游戏编写代码

    本文实例为大家分享了java贪吃蛇游戏展示的具体代码,供大家参考,具体内容如下 1.采用MVC(model.view.control)框架模式 2.包和类的关系树形图为: 3.源码: package com.huai; import Java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.util.HashSet; import java.util.LinkedList; import java.u

  • 基于Java代码实现游戏服务器生成全局唯一ID的方法汇总

    在服务器系统开发时,为了适应数据大并发的请求,我们往往需要对数据进行异步存储,特别是在做分布式系统时,这个时候就不能等待插入数据库返回了取自动id了,而是需要在插入数据库之前生成一个全局的唯一id,使用全局的唯一id,在游戏服务器中,全局唯一的id可以用于将来合服方便,不会出现键冲突.也可以将来在业务增长的情况下,实现分库分表,比如某一个用户的物品要放在同一个分片内,而这个分片段可能是根据用户id的范围值来确定的,比如用户id大于1000小于100000的用户在一个分片内.目前常用的有以下几种:

  • Java贪吃蛇游戏完善版

    很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了. 下面是项目各包及类的层次关系: 游戏的主要运行界面截图如下: 下面是部分代码,详细源码见此链接:贪吃蛇源码下载 Snake类: package com.huowolf.entities; import java.awt.Color; import java.awt.Graphics; import java.awt.Point

  • java桌球小游戏 小球任意角度碰撞

    本文实例为大家分享了java桌球小游戏的具体代码,供大家参考,具体内容如下 import javax.swing.*; import java.awt.*; public class BallGame extends JFrame { /** *继承swing里面的窗口类 */ //加载图片 Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.jpg.png");/*得到系统默认的工具包*/ Image desk

  • java实现猜拳游戏

    本文实例为大家分享了java实现猜拳游戏的具体代码,供大家参考,具体内容如下 package com.farsight.session7; import java.util.Scanner; /** * 根据输入的数字,判断数组strs的值 然后进行逻辑判断 */ public class 猜拳 { public static void main(String[] args) { String[] strs = { "石头", "剪刀", "布"

  • java实现连连看游戏

    本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下 代码会实现共享的,这个是截图 代码: package com.lr.bean; import java.util.Scanner; import java.util.Random; import com.lr.bean.Point; public class Link{ public static void main(String[] args){ Scanner sc=new Scanner(System.in);

随机推荐