Java语言实现拼图游戏源代码_Java语言实现拼图游戏源代码

/*

* JAVA小游戏-拼图 我做的第一个小游戏

* Cell类是继承的按钮类,并加上相应图形,形成方格

*MyCanvas是一个面板,加载Cell类的对象(方格),是这三个类中的核心

*/

import java.awt.Rectangle;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import java.awt.BorderLayout;

import java.awt.Button;

import java.awt.Choice;

import java.awt.Color;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.Icon;

import javax.swing.JButton;

public class MyMainFrame extends JFrame implements ActionListener {

MyCanvas myCanvas;

JPanel panelNorth, panelPreview;//定义上方的面板,及预览所需的面板

Button start, preview, set;//定义开始,预览,设定按钮

Container container;//容器,得到内容面板

public MyMainFrame() {//初使化

container = this.getContentPane();

start = new Button("开始");

start.addActionListener(this);

preview = new Button("预览");

preview.addActionListener(this);

set = new Button("设置");

set.addActionListener(this);

panelPreview = new JPanel();

panelPreview.setLayout(null);

Icon icon = new ImageIcon("pic_" + MyCanvas.pictureID + ".jpg");

JLabel label = new JLabel(icon);

label.setBounds(0, 0, 300, 300);

panelPreview.add(label);

panelNorth = new JPanel();

panelNorth.setBackground(Color.red);

panelNorth.add(start);

panelNorth.add(preview);

panelNorth.add(set);

myCanvas = new MyCanvas();

container.add(myCanvas, BorderLayout.CENTER);

container.add(panelNorth, BorderLayout.NORTH);

this.setTitle("拼图小游戏-明");

this.setLocation(300, 200);

this.setSize(308, 365);

this.setResizable(false);

this.setVisible(true);

this.setDefaultCloseOperation(3);

}

public static void main(String[] args) {

// TODO 自动生成方法存根

new MyMainFrame();

}

public void actionPerformed(ActionEvent arg0) {//对三个按钮事件的处理

// TODO 自动生成方法存根

Button button = (Button) arg0.getSource();

if (button == start) {

myCanvas.Start();

} else if (button == preview) {

if (button.getLabel() == "预览") {

container.remove(myCanvas);

container.add(panelPreview);

panelPreview.updateUI();

container.repaint();

button.setLabel("返回");

} else {

container.remove(panelPreview);

container.add(myCanvas);

container.repaint();

button.setLabel("预览");

}

} else if (button == set) {//修改所选图片

Choice pic = new Choice();

pic.add("小猫");

pic.add("小猪");

pic.add("云");

pic.add("QQ");

pic.add("卡通");

pic.add("花");

int i = JOptionPane.showConfirmDialog(this, pic, "选择图片", JOptionPane.OK_CANCEL_OPTION);

if (i == JOptionPane.YES_OPTION) {

MyCanvas.pictureID = pic.getSelectedIndex() + 1;

myCanvas.reLoadPictrue();

Icon icon = new ImageIcon("pic_" + MyCanvas.pictureID + ".jpg");

JLabel label = new JLabel(icon);

label.setBounds(0, 0, 300, 300);

panelPreview.removeAll();

panelPreview.add(label);

panelPreview.repaint();

}

}

}

}

class MyCanvas extends JPanel implements MouseListener {

boolean hasAddActionListener = false;//设置方格的动作监听器的标志位,TRUE为已经添加上动作事件,FALSE是尚未添加动作事件

Cell cell[];//定义方格

Rectangle cellNull;//定义空方格区域

public static int pictureID = 1;//当前选择的图片代号

public MyCanvas() {

this.setLayout(null);

this.setSize(400, 400);

cellNull = new Rectangle(200, 200, 100, 100);//空方格区域在第三行每三列

cell = new Cell[9];

Icon icon;

for (int i = 0; i < 3; i++) {//为9个方格加载图片,并初使化坐标,形成三行三列

for (int j = 0; j < 3; j++) {

icon = new ImageIcon("pic_" + pictureID + "_" + (i * 3 + j + 1) + ".jpg");

cell[i * 3 + j] = new Cell(icon);

cell[i * 3 + j].setLocation(j * 100, i * 100);

this.add(cell[i * 3 + j]);

}

}

this.remove(cell[8]);//移除最后一个多余的方格

}

public void reLoadPictrue() {//当选择其它图形进行拼图时,需重新加载新图片

Icon icon;

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 3; j++) {

icon = new ImageIcon("pic_" + pictureID + "_" + (i * 3 + j + 1) + ".jpg");

cell[i * 3 + j].setIcon(icon);

}

}

}

public boolean isFinish() {//判断是否拼合成功

for (int i = 0; i < 8; i++) {

int x = cell[i].getBounds().x;

int y = cell[i].getBounds().y;

if (y / 100 * 3 + x / 100 != i) {

return false;

}

}

return true;

}

public void Start() {//对方格进行重新排列,打乱顺序

while (cell[0].getBounds().x <= 100 && cell[0].getBounds().y <= 100) {//当第一个方格距左上角较近时

int x = cellNull.getBounds().x;

int y = cellNull.getBounds().y;

int direction = (int) (Math.random() * 4);//产生0-4,对应空方格的上下左右移动

if (direction == 0) {//空方格左移动,与左侧方格互换位置,左侧方格右移动

x -= 100;

if (test(x, y)) {

for (int j = 0; j < 8; j++) {

if ((cell[j].getBounds().x == x) && (cell[j].getBounds().y == y)) {//依次寻找左侧的按钮

cell[j].move("RIGHT", 100);

cellNull.setLocation(x, y);

break;//找到后跳出for循环

}

}

}

} else if (direction == 1) {//RIGHT

x += 100;

if (test(x, y)) {

for (int j = 0; j < 8; j++) {

if ((cell[j].getBounds().x == x) && (cell[j].getBounds().y == y)) {

cell[j].move("LEFT", 100);

cellNull.setLocation(x, y);

break;

}

}

}

} else if (direction == 2) {//UP

y -= 100;

if (test(x, y)) {

for (int j = 0; j < 8; j++) {

if ((cell[j].getBounds().x == x) && (cell[j].getBounds().y == y)) {

cell[j].move("DOWN", 100);

cellNull.setLocation(x, y);

break;

}

}

}

} else {//DOWN

y += 100;

if (test(x, y)) {

for (int j = 0; j < 8; j++) {

if ((cell[j].getBounds().x == x) && (cell[j].getBounds().y == y)) {

cell[j].move("UP", 100);

cellNull.setLocation(x, y);

break;

}

}

}

}

}

if (!hasAddActionListener)//如果尚未添加动作事件,则添加

{

for (int i = 0; i < 8; i++)//为第个方格添加动作事件,这样单击按钮就能移动了

{

cell[i].addMouseListener(this);

}

}

hasAddActionListener = true;

}

private boolean test(int x, int y) {

if ((x >= 0 && x <= 200) || (y >= 0 && y <= 200)) {

return true;

} else {

return false;

}

}

// public void paint(Graphics g){

//

// for(int i=0;i<=300;i+=100)

// g.drawLine(0, i, 300, i);

// for(int i=0;i<=300;i+=100)

// g.drawLine(i, 0, i, 300);

// for(int i=0;i<8;i++)

// cell[i].repaint();

// }

public void mouseClicked(MouseEvent arg0) {

}

public void mouseEntered(MouseEvent arg0) {

}

public void mouseExited(MouseEvent arg0) {

}

public void mouseReleased(MouseEvent arg0) {

}

public void mousePressed(MouseEvent arg0) {//方格的鼠标事件,因为用到了MyCanvas中的一些方法,因此没有在Cell类中处理鼠标事件

Cell button = (Cell) arg0.getSource();

int x1 = button.getBounds().x;//得到所单击方格的坐标

int y1 = button.getBounds().y;

int x2 = cellNull.getBounds().x;//得到空方格的坐标

int y2 = cellNull.getBounds().y;

if (x1 == x2 && y1 - y2 == 100)//进行比较,如果满足条件则进行交换

{

button.move("UP", 100);

} else if (x1 == x2 && y1 - y2 == -100) {

button.move("DOWN", 100);

} else if (x1 - x2 == 100 & y1 == y2) {

button.move("LEFT", 100);

} else if (x1 - x2 == -100 && y1 == y2) {

button.move("RIGHT", 100);

} else {

return;//不满足就不进行任何处理

}

cellNull.setLocation(x1, y1);

this.repaint();

if (this.isFinish()) {//进行是否完成的判断

JOptionPane.showMessageDialog(this, "恭喜你完成拼图,加油!");

for (int i = 0; i < 8; i++) {

cell[i].removeMouseListener(this);//如果已完成,撤消鼠标事件,鼠标单击方格不在起作用

}

hasAddActionListener = false;

}

}

}

class Cell extends JButton {

Cell(Icon icon) {//实际为ICON

super(icon);

this.setSize(100, 100);

}

public void move(String direction, int sleep) {//方格的移动

if (direction == "UP") {

this.setLocation(this.getBounds().x, this.getBounds().y - 100);

} else if (direction == "DOWN") {

this.setLocation(this.getBounds().x, this.getBounds().y + 100);

} else if (direction == "LEFT") {

this.setLocation(this.getBounds().x - 100, this.getBounds().y);

} else {

this.setLocation(this.getBounds().x + 100, this.getBounds().y);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值