java实现拼图游戏

本文实例为大家分享了java实现拼图游戏的具体代码,供大家参考,具体内容如下

游戏说明:

设计一款拼图游戏,要求点击图片按钮,实现图片按钮的移动,直到每一个按钮都到达指定位置游戏终止退出。

游戏设计思路:

1.准备一张图像文件;
2.创建N个按钮图标,每个按钮图标里面存入一张分割后的图片信息;
3.创建一个空白按钮用于和图标按钮交换位置,达到移动的效果;
4.乱序,将按钮图标乱序,完成游戏效果;
5.创建一个面板添加游戏开始和游戏结束按钮;
6.设计游戏窗口;

游戏界面设计基本结构:

代码实现:

Cell类----设计每个按钮对象应该具备的属性功能---针对按钮

package puzzle_game;
import java.awt.Rectangle;
import javax.swing.Icon;
import javax.swing.JButton;

@SuppressWarnings("serial")
public class Cell extends JButton{
 private static int IMAGEWIDTH;//设置按钮的宽度大小
 private static int IMAGEHEIGHT;
 private int ID = 0;//设置当前按钮的指向坐标

 public Cell(Icon icon, int id, int imagewidth, int height)//构造函数初始化,传入两个参数,一个是图像的图标,一个是该按钮的数组ID
 {
  this.setIcon(icon);
  this.ID = id;
  this.IMAGEWIDTH = imagewidth;
  this.IMAGEHEIGHT = height;
  this.setSize(IMAGEWIDTH, IMAGEHEIGHT);
 }

 public void move(Direction dir)//移动
 {
  Rectangle rec = this.getBounds();//获取当前对象的这个边框
  switch(dir)
  {
  case UP://向上移动,改变坐标
   this.setLocation(rec.x, rec.y + IMAGEHEIGHT);
   break;
  case DOWN://向下移动
   this.setLocation(rec.x, rec.y - IMAGEHEIGHT);
   break;
  case LEFT://向左移动
   this.setLocation(rec.x - IMAGEWIDTH, rec.y);
   break;
  case RIGHT://向右移动
   this.setLocation(rec.x + IMAGEWIDTH, rec.y);
   break;
  }
 }

 public int getID() {
  return ID;
 }

 public int getX()
 {
  return this.getBounds().x;
 }

 public int getY()
 {
  return this.getBounds().y;
 }
}

Direction类------方向枚举类,存放移动的方向

package puzzle_game;
public enum Direction {
 UP,
 DOWN,
 LEFT,
 RIGHT
}

GamePanel类-----游戏面板设计类,真正的游戏思想从此开始

主要实现的功能有:

1.初始化面板按钮数组,将图像转化成图标然后存入按钮中;
2.打乱数组面板中的按钮排序,实现游戏娱乐功能;
3.每个按钮添加监听机制,实现点击按钮后的移动功能;

package puzzle_game;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class GamePanel extends JPanel implements MouseListener{

 private Cell BlankCell = null;
 private int row = 4;
 private int col = 4;//设置这个拼图的行列
 private Cell cells[] = new Cell[row*col];//创建一个按钮对象数组
 int ImageWidth;
 int ImageHeight;

 public GamePanel()//构造函数
 {
  this.setLayout(null);
  init();
 }

 public void init()//初始化完成以下功能--完成图像的切割,完成图像到图标的转换,完成按钮图标的添加,将按钮添加到面板上,并且给每一个按钮添加监听机制
 {
  int num = 0;
  BufferedImage buf = null;
  BufferedImage bufnew = null;
  ImageIcon icon = null;
  int width = 0;
  int height = 0;
  try
  {
   buf = ImageIO.read(new File("F:/Image/Puzzle_game/puze.jpg"));//读取文件图像
   ImageWidth = buf.getWidth();
   ImageHeight = buf.getHeight();
   System.out.println("ImageWidth->"+ImageWidth+"ImageHeight->"+ImageHeight);
   width = ImageWidth/col;
   height = ImageHeight/row;
  }catch(Exception e)
  {
   System.out.println(e);
  }
  for(int i = 0; i < row; i++)
  {
   for(int j = 0; j < col; j++)
   {
    num = i*col+j;//表示当前这个图像的坐标id,在数组中的下标
    if(num < row*col-1)
    {
     bufnew = buf.getSubimage(width*j, height*i, width, height);
     icon = new ImageIcon(bufnew);//将图像转化成图标
    }
    else//使最后一张图像为空白图像
    {
     icon = new ImageIcon("F:/Image/Puzzle_game/background2.jpg");//一张空白图像
    }
    cells[num] = new Cell(icon, num, width, height);//添加图标到每一个BUTTON按钮上面
    cells[num].setLocation(width*j, height*i);
   }
  }
  BlankCell = cells[cells.length-1];//初始化空白格
  for(int i = 0; i < cells.length; i++)
  {
   this.add(cells[i]);//将每一个按钮添加到当前这个面板上面
   if(i < cells.length-1)
    cells[i].addMouseListener(this);//空白格不添加监听机制
  }
 }

 public void OutOfOrder()//乱序----打乱图片的排布顺序
 {
  Random random = new Random();
  for(int i = 0 ; i < cells.length ; i++)
  {
   int index1 = random.nextInt(cells.length);//cells的长度是9,但是他的上限是9,取不到9,所取值范围是0-8
   int index2 = random.nextInt(cells.length);
   int x = cells[index1].getX();
   int y = cells[index1].getY();//获取下标是index1的数组元素按钮的坐标
   cells[index1].setLocation(cells[index2].getX(), cells[index2].getY());
   cells[index2].setLocation(x, y);
  }
 }

 public boolean IsWin()//判断游戏玩家是否赢
 {
  for(int i = 0; i < cells.length; i++)
  {
   int x = cells[i].getX();
   int y = cells[i].getY();
   if(x/(ImageWidth/col) + y/(ImageHeight/row) != i)
   {
    return false;
   }
  }
  return true;
 }

 public void mouseClicked(MouseEvent e)
 {
  Cell t = (Cell) e.getSource();
  int x = BlankCell.getX();
  int y = BlankCell.getY();
  if(t.getY() == y && t.getX() + ImageWidth/col == x)//图像向右走
  {
   t.move(Direction.RIGHT);
   BlankCell.move(Direction.LEFT);
  }
  else if(t.getY() == y && t.getX() - ImageWidth/col == x)//图像向左走
  {
   t.move(Direction.LEFT);
   BlankCell.move(Direction.RIGHT);
  }
  else if(t.getX() == x && t.getY() + ImageHeight/row == y)//图像向上走
  {
   t.move(Direction.UP);
   BlankCell.move(Direction.DOWN);
  }
  else if(t.getX() == x && t.getY() - ImageHeight/row == y)//图像向下走
  {
   t.move(Direction.DOWN);
   BlankCell.move(Direction.UP);
  }
  if(IsWin())
  {
   int choice = JOptionPane.showConfirmDialog(null, "恭喜您过关了是否还来一局?", "提示", JOptionPane.YES_NO_OPTION);
   if(choice == 0)//表示再来一局
   {
    this.OutOfOrder();
   }
   else//表示退出游戏
    System.exit(1);
  }
 }
 @Override
 public void mousePressed(MouseEvent e) {
 }
 @Override
 public void mouseReleased(MouseEvent e) {
 }
 @Override
 public void mouseEntered(MouseEvent e) {
 }
 @Override
 public void mouseExited(MouseEvent e) {
 }
}

GameFrame类------设置游戏的打开窗口类,创建了一个菜单面板存放游戏开始和游戏结束两个按钮,并且对游戏的窗口进行了基本设置,这是整个游戏的入口。

package puzzle_game;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameFrame extends JFrame {
 public JPanel pane1 = new JPanel();
 public JButton button1 = new JButton("游戏开始");
 public JButton button2 = new JButton("游戏结束");
 public GameFrame()
 {
  super("拼图游戏");
  pane1.setLayout(new FlowLayout());
  pane1.add(button1);
  pane1.add(button2);
  Container con = this.getContentPane();
  con.add(pane1,BorderLayout.NORTH);
  GamePanel gamepane = new GamePanel();
  con.add(gamepane,BorderLayout.CENTER);
  this.setBounds(300, 300, 600, 600);
  this.setVisible(true);
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  button1.addActionListener(new ActionListener()
  {
   public void actionPerformed(final ActionEvent e)
   {
    gamepane.OutOfOrder();
   }
  });
  button2.addActionListener(new ActionListener()
  {
   public void actionPerformed(final ActionEvent e)
   {
    System.exit(1);
   }
  });
 }

 public static void main(String[] args) {
  new GameFrame();  }
}

这是刚运行程序以后的界面,也是拼图成功的界面,我设置的是4*4模式,你也可以根据自己的喜好设计模式诸如–2*3,3*4,都可以;

这是我点击开始以后运行的界面,当然每次都不同,因为乱序是随机生成的顺序,那么现在就可以玩你自己的游戏了:

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

(0)

相关推荐

  • java实现简单美女拼图游戏

    拼图小游戏,学习阶段.很多不足,改进了一下 演示图片: J_Puzzle.java import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.a

  • Java制作智能拼图游戏原理及代码

    今天突发奇想,想做一个智能拼图游戏来给哄女友. 需要实现这些功能 第一图片自定义 第二宫格自定义,当然我一开始就想的是3*3 4*4 5*5,没有使用3*5这样的宫格. 第三要实现自动拼图的功能,相信大家知道女人耍游戏都不是很厉害,所以这个自动拼图功能得有. 其他什么暂停.排行就不写了! 现在重点问题出来了 要实现自动拼图功能似乎要求有点高哦!计算机有可不能像人一样只能: 先追究下本质 拼图游戏其实就是排列问题: 排列有这么一个定义:在一个1,2,...,n的排列中,如果一对数的前后位置与大小顺

  • JavaFx实现拼图游戏

    最近学习JavaFx,发现网上大概只有官方文档可以查阅,学习资料较少,写个拼图游戏供记录.. 大概说一下思路: 1.面板的构建:面板采用GridPane,方便3*3的图片布局. 2.每个小格子中的图片当然不是一张张手工切好的,利用imageview.setViewPort(Rectangle2D 2d)的方法进行切割. 3.再来说鼠标点击时图片的移动,这时候以里面的空格子为中心,不以鼠标点击的那个事件源为中心,这样可以避免走弯路(当时我是有一种柳暗花明的感觉.). 4.鼠标点击后空格子和其周围带

  • java实现拼图游戏

    本文实例为大家分享了java实现拼图游戏的具体代码,供大家参考,具体内容如下 游戏说明: 设计一款拼图游戏,要求点击图片按钮,实现图片按钮的移动,直到每一个按钮都到达指定位置游戏终止退出. 游戏设计思路: 1.准备一张图像文件: 2.创建N个按钮图标,每个按钮图标里面存入一张分割后的图片信息: 3.创建一个空白按钮用于和图标按钮交换位置,达到移动的效果: 4.乱序,将按钮图标乱序,完成游戏效果: 5.创建一个面板添加游戏开始和游戏结束按钮: 6.设计游戏窗口: 游戏界面设计基本结构: 代码实现:

  • java实现拼图小游戏

    一个简单的拼图小游戏,供大家参考,具体内容如下 1.首先设计视图面板. 2.添加所需要的图片按钮. 3.最主要的是设计监听事件,添加图片的监听按钮,设定移动空白图片周围的按钮. 4.判断是否成功 . package sxy; import java.awt.Choice; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEv

  • Java游戏开发拼图游戏经典版

    游戏介绍: 拼图游戏是一款经典的益智游戏,游戏难度分为 简单.正常.困难 三种难度,分别对应3*3,4*4,5*5布局,游戏开始前图片被随机打乱,空块位于最右下角,玩家通过点击空块周围图片或者按键方式对图片和空块进行相互交换,直到所有图片都回到原位即为游戏胜利. 本次制作的拼图游戏运行界面如下: 使用素材文件夹: 链接: https://pan.baidu.com/s/10qE7yq6IwU-vWprvc5Axgw   提取码: p16e 游戏设计的思路 对拼图界面的图像信息可以采用二维数组ma

  • java控制台实现拼图游戏

    本文实例为大家分享了java控制台实现拼图游戏的具体代码,供大家参考,具体内容如下 1.首先对原始的拼图进行多次无规律的移动,将拼图打乱 2.然后进行游戏,在游戏移动同时对拼图顺序进行判断 ①如果拼图成功,则跳出循环,结束游戏: ②如果拼图失败,陷入死循环,继续移动拼图,直至拼图成功为止. import java.util.Random; import java.util.Scanner; public class GrameOfPingTuTest{ private static Scanne

  • java实现简单的拼图游戏

    用Java来实现简单的拼图游戏,供大家参考,具体内容如下 首先我们看一下这个拼图小游戏的效果图: 创建一个名称为MedleyGame的类,该类继承了JFrame类:然后在该类中分别声明一个面板对象和一个按钮对象,面板对象用来添加拼图按钮,按钮对象为当前显示空白图片的按钮:最后为该类编写一个main()方法和一个构造方法MedleyGame(),并在构造方法中设置窗体的相关属性,如窗体的标题.显示位置.大小等. java项目结构如下: 具体java代码如下: package pac; import

  • java实现九宫格拼图游戏

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

  • java基础教程之拼图游戏的实现

    目录 前言 废话不多说,直接上效果图: 1.所需技术 2.具体实现 2.1 图片制作 2.2 创建项目 2.3 编码实现 总结 前言 大家在初学java的时候,大部分的代码都是在控制台上运行的.可能大家辛辛苦苦写了几十行代码,最终就只是在控制台输出一个字符,这个时候,心里肯定是拔凉拔凉的,心中那一朵编程的火花,就马上给扑灭了.我们都知道兴趣是最好的老师.为了拯救大家快要熄灭的小火花,小编在这里给大家带来使用java做个小游戏,并且通过做这个游戏,好好收悉一下面向对象的实际使用. 废话不多说,直接

  • Java实现Android拼图游戏设计过程解析

    目录 1.项目介绍 2.项目原理 3.项目设计 4.项目实现 5.获取布局 6.准备图片 7.初始化item 8.游戏图片的切换 9.游戏胜利的判断 10.游戏封面 1.项目介绍 这是一款基于 Java 开发的移动端安卓小游戏——大家来拼图 2.项目原理 把选定的一张图片切分很多份,先是 33 格式,在一定的时间内点击格子交换使图形拼成一张完整的图片就算闯关成功,这样关卡也很容易设计,33:44:55:6*6: 3.项目设计 我们需要一个容器,可以放这些图片的块块,为了方便,我们准备使用Rela

  • Java实现简易拼图游戏的方法详解

    目录 效果展示 游戏结构 实现代码 效果展示 介绍:游戏共有五张图片可以选择,分成了4 X 4 十六个方格,点击开始就可以开始游戏.游戏运行的截图如下: 游戏结构 实现代码 代码如下:MedleyGame.java类 package game.medleyPicture; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.even

随机推荐