最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實現(xiàn)拼圖游戲

 更新時間:2019年12月14日 09:02:05   作者:angry_youth  
這篇文章主要為大家詳細介紹了java實現(xiàn)拼圖游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java實現(xiàn)拼圖游戲的具體代碼,供大家參考,具體內(nèi)容如下

游戲說明:

設計一款拼圖游戲,要求點擊圖片按鈕,實現(xiàn)圖片按鈕的移動,直到每一個按鈕都到達指定位置游戲終止退出。

游戲設計思路:

1.準備一張圖像文件;
2.創(chuàng)建N個按鈕圖標,每個按鈕圖標里面存入一張分割后的圖片信息;
3.創(chuàng)建一個空白按鈕用于和圖標按鈕交換位置,達到移動的效果;
4.亂序,將按鈕圖標亂序,完成游戲效果;
5.創(chuàng)建一個面板添加游戲開始和游戲結(jié)束按鈕;
6.設計游戲窗口;

游戲界面設計基本結(jié)構(gòu):

代碼實現(xiàn):

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)//構(gòu)造函數(shù)初始化,傳入兩個參數(shù),一個是圖像的圖標,一個是該按鈕的數(shù)組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類-----游戲面板設計類,真正的游戲思想從此開始

主要實現(xiàn)的功能有:

1.初始化面板按鈕數(shù)組,將圖像轉(zhuǎn)化成圖標然后存入按鈕中;
2.打亂數(shù)組面板中的按鈕排序,實現(xiàn)游戲娛樂功能;
3.每個按鈕添加監(jiān)聽機制,實現(xiàn)點擊按鈕后的移動功能;

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];//創(chuàng)建一個按鈕對象數(shù)組
 int ImageWidth;
 int ImageHeight;

 public GamePanel()//構(gòu)造函數(shù)
 {
  this.setLayout(null);
  init();
 }

 public void init()//初始化完成以下功能--完成圖像的切割,完成圖像到圖標的轉(zhuǎn)換,完成按鈕圖標的添加,將按鈕添加到面板上,并且給每一個按鈕添加監(jiān)聽機制
 {
  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,在數(shù)組中的下標
    if(num < row*col-1)
    {
     bufnew = buf.getSubimage(width*j, height*i, width, height);
     icon = new ImageIcon(bufnew);//將圖像轉(zhuǎn)化成圖標
    }
    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);//空白格不添加監(jiān)聽機制
  }
 }

 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的數(shù)組元素按鈕的坐標
   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類------設置游戲的打開窗口類,創(chuàng)建了一個菜單面板存放游戲開始和游戲結(jié)束兩個按鈕,并且對游戲的窗口進行了基本設置,這是整個游戲的入口。

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("游戲結(jié)束");
 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模式,你也可以根據(jù)自己的喜好設計模式諸如–2*3,3*4,都可以;

這是我點擊開始以后運行的界面,當然每次都不同,因為亂序是隨機生成的順序,那么現(xiàn)在就可以玩你自己的游戲了:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 深入了解Spring中的FactoryBean

    深入了解Spring中的FactoryBean

    這篇文章主要介紹了深入了解Spring中的FactoryBean,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • SpringMVC中的DispatcherServlet初始化流程詳解

    SpringMVC中的DispatcherServlet初始化流程詳解

    這篇文章主要介紹了SpringMVC中的DispatcherServlet初始化流程詳解,DispatcherServlet這個前端控制器是一個Servlet,所以生命周期和普通的Servlet是差不多的,在一個Servlet初始化的時候都會調(diào)用該Servlet的init()方法,需要的朋友可以參考下
    2023-12-12
  • springboot+vue項目從第一行代碼到上線部署全流程

    springboot+vue項目從第一行代碼到上線部署全流程

    本文詳細介紹了如何從零開始搭建一個基于Spring Boot和Vue.js的前后端分離項目,并涵蓋項目需求分析、技術選型、項目結(jié)構(gòu)設計、前后端交互、部署上線等全過程,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Springboot apollo原理及使用方法詳解

    Springboot apollo原理及使用方法詳解

    這篇文章主要介紹了Springboot apollo原理及使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Spring BeanPostProcessor源碼示例解析

    Spring BeanPostProcessor源碼示例解析

    這篇文章主要為大家介紹了Spring BeanPostProcessor源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • IDEA?mybatis?Mapper.xml報紅的最新解決辦法

    IDEA?mybatis?Mapper.xml報紅的最新解決辦法

    這篇文章主要介紹了IDEA?mybatis?Mapper.xml報紅的解決辦法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • java 如何為文件及文件夾添加權限

    java 如何為文件及文件夾添加權限

    這篇文章主要介紹了java 如何為文件及文件夾添加權限的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • IDEA報錯:Unable to save settings Failed to save settings

    IDEA報錯:Unable to save settings Failed to save settings

    這篇文章主要介紹了IDEA報錯:Unable to save settings Failed to save settings的相關知識,本文給大家分享問題原因及解決方案,需要的朋友可以參考下
    2020-09-09
  • 如何使用Guava Cache做緩存

    如何使用Guava Cache做緩存

    Cache在ConcurrentHashMap的基礎上提供了自動加載數(shù)據(jù)、清除數(shù)據(jù)、get-if-absend-compute的功能,本文給大家介紹如何使用Guava Cache做緩存,感興趣的朋友一起看看吧
    2023-11-11
  • Java基礎之引用相關知識總結(jié)

    Java基礎之引用相關知識總結(jié)

    今天聊聊Java的引用,大多數(shù)時候我們說引用都是強引用,只有在對象不使用的情況下才會釋放內(nèi)存,其實Java 內(nèi)存有四種不同的引用.一起看看吧,,需要的朋友可以參考下
    2021-05-05

最新評論

黄山市| 临猗县| 仁怀市| 盐边县| 彭水| 衡南县| 杂多县| 罗田县| 定结县| 神池县| 彝良县| 松滋市| 灯塔市| 温宿县| 玛沁县| 浙江省| 万荣县| 桐柏县| 宝山区| 神池县| 舞阳县| 河曲县| 江孜县| 青阳县| 商洛市| 海宁市| 乌拉特前旗| 安庆市| 施秉县| 三河市| 商都县| 汉源县| 赤水市| 水城县| 修文县| 廊坊市| 建平县| 遂昌县| 普格县| 乾安县| 云梦县|