Java 簡單拼圖遊戲(實現音樂播放功能)

mcp3128發表於2017-12-14

  此程式為用JAVA編寫的拼圖小遊戲,可通過簡單的圖片移動實現拼圖,並實現音樂播放功能。(此程式只完成簡單功能的實現,大佬勿噴)

程式原始碼下載:點選下載程式原始碼

軟體系統實現

拼圖主體為一方形區域,位於中央,其中包含九個小區域,放置圖片,其中第九張為空。通過點選空白附近圖片完成圖片的移動。

拼圖背景為自己插入的圖片,不會隨滑鼠的點選而改變;

拼圖上側為三個按鈕重新開始,音樂,提示,分別實現重新開始,音樂播放與提示部分的顯示,當點選重新開始按鈕時,遊戲重新開始,拼圖主體進行變換;

當點選音樂按鈕時音樂播放停止,音樂圖示變暗,當再次點選時音樂播放,音樂圖示變亮;當點選提示按鈕時提示顯示,提示圖示變亮,當再次點選時提示時,提示圖示變暗,提示部分消失。

右上側為提示部分,當點選提示時,提示部分顯示,再次點選時消失。

拼圖按鈕與主體之間為遊戲時間與移動步數的顯示,其中時間每秒鐘加一,圖片移動時移動步數加一,當點選重新開始按鈕時,遊戲時間與移動步數全部變為0。

當拼圖完成後拼圖左側與右側顯示恭喜成功字樣,拼圖邊框變為紅色。點選重新開始時字樣消失。


程式碼:

Yard.java

import javax.swing.JFrame;

public class Yard extends JFrame {
	Win win = new Win();

	public Yard() {
		this.setTitle("拼圖");
		this.setSize(1000, 850);
		this.setLocationRelativeTo(null); // 設定窗體初始位置
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);// 不可改變大小
		this.add(win);
		this.setVisible(true);
	}

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

Win.java

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;

public class Win extends JPanel implements MouseListener {
	private int[][] tu = new int[3][3];
	static boolean flag = false;// 判斷是否成功
	private boolean flag1 = false;// 判斷提示按鈕的顯示
	private int xx, yy;// 獲取的拼圖行列座標
	private int N = 0;// 移動步數
	static int T = 0;// 計算時間
	private Font font1 = new Font("華文彩雲", Font.BOLD, 50);
	private Font font2 = new Font("黑體", Font.BOLD, 20);
	private Font font3 = new Font("黑體", Font.BOLD, 90);
	private JButton b = new JButton("重新開始");
	private JButton mus = new JButton("音樂");
	private JButton out = new JButton("提示");
	private Audio au = new Audio();// 設定音樂
	private int k1 = 0, k2 = 0;// 判斷音樂,提示按鈕點選次數
	public Win() {
		final Time time = new Time();
		time.start();// 開始計時
		/**點選重新開始按鈕後*/
		b.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if (e.getSource() == b) {
					Start();
					time.setT(0);
					flag = false;
					N = 0;
					T = 0;
				}
			}
		});
		/**點選音樂按鈕後*/
		mus.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				k1++;
				/* 單擊一下音樂按鈕停止播放 */
				if (e.getSource() == mus && k1 % 2 != 0) {
					au.stop();
					mus.setBackground(Color.GRAY);
				}
				/* 單擊一下音樂按鈕開始播放 */
				else if (e.getSource() == mus && k1 % 2 == 0) {
					au.start();
					mus.setBackground(Color.cyan);
				}
			}
		});
		/**點選提示按鈕後*/
		out.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				k2++;
				/* 單擊一下提示按鈕顯示提示 */
				if (e.getSource() == out && k2 % 2 != 0) {
					flag1 = true;
					out.setBackground(Color.cyan);
				}
				/* 再單擊一下提示按鈕提示消失 */
				else if (e.getSource() == out && k2 % 2 == 0) {
					flag1 = false;
					out.setBackground(Color.gray);
				}
			}
		});
		/** 設定重新開始,音樂與提示按鈕 */
		b.setPreferredSize(new Dimension(140, 70));
		b.setBackground(Color.cyan);
		b.setFont(font2);
		mus.setPreferredSize(new Dimension(140, 70));
		mus.setBackground(Color.cyan);
		mus.setFont(font2);
		out.setPreferredSize(new Dimension(140, 70));
		out.setBackground(Color.gray);
		out.setFont(font2);
		add(b);
		add(mus);
		add(out);
		Start();
		/** 音樂播放 */
		au.init();
		au.start();
		/** 滑鼠監聽 */
		this.addMouseListener(this);
	}

	private void Start() {
		/** 將tu[i][j]賦值為1-9 */
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++) {
				tu[i][j] = i * 3 + j + 1;
			}
		/** 打亂順序 */
		Random r = new Random();
		int a, b, c;
		for (int i = 0; i < 10; i++) {
			a = r.nextInt(3);
			b = r.nextInt(3);
			c = tu[a][b];
			tu[a][b] = tu[b][a];
			tu[b][a] = c;
		}
	}

	/* 繪製提示圖部分 */
	public void paint(Graphics g) {
		super.paint(g);

		if (flag1) {
			g.drawRect(790, 0, 190, 190);
			Image image = null;
			try {
				String str = "tu.png";
				image = ImageIO.read(new File(str));
			} catch (IOException e) {
				e.printStackTrace();
			}
			/** 設定提示邊框 */
			g.setColor(Color.pink);
			g.fillRect(730, 0, 200, 190);
			g.setColor(Color.black);
			g.setFont(font1);
			g.drawString("提", 740, 80);
			g.drawString("示", 740, 130);
			/** 顯示提示圖片 */
			g.drawImage(image, 810, 0, 190, 190, this);
		}

	}

	/* 繪製拼圖中的每個元件 */
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		/** 繪製背景圖 */
		BufferedImage image1 = null;
		try {
			String str = "back1.png";
			image1 = ImageIO.read(new File(str));
		} catch (IOException e) {
			e.printStackTrace();
		}
		g.drawImage(image1, 0, 0, 1000, 900, this);
		/** 繪製拼圖主體 */
		g.drawRect(200, 200, 600, 600);
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++) {
				if (tu[i][j] != 9) {
					Image image = null;
					try {
						String str = "tu" + tu[i][j] + ".png";
						image = ImageIO.read(new File(str));
					} catch (IOException e) {
						e.printStackTrace();
					}
					g.drawImage(image, 200 + 200 * j, 200 + 200 * i, 200, 200,
							this);// 顯示圖片

				}
			}

		g.setFont(font1);// 設定字型
		/** 拼圖完成時 */
		if (flag) {
			g.setColor(Color.yellow);
			g.setFont(font3);// 設定字型
			g.drawString("恭", 50, 350);
			g.setColor(Color.red);
			g.drawString("喜", 50, 600);
			g.setColor(Color.green);
			g.drawString("成", 850, 350);
			g.setColor(Color.cyan);
			g.drawString("功", 850, 600);
			g.setColor(Color.red);
			((Graphics2D) g).setStroke(new BasicStroke(15.0f));
			g.drawRect(200, 200, 600, 600);
			g.drawRect(195, 195, 610, 610);
		}
		/** 設定邊框粗度 */
		((Graphics2D) g).setStroke(new BasicStroke(5.0f));
		/** 設定移動步數邊框 */
		g.setColor(Color.darkGray);
		g.fillRect(350, 135, 378, 55);
		g.setColor(Color.cyan);
		g.setFont(font1);// 設定字型
		g.drawString("移動步數:" + N, 350, 180);

		/** 設定拼圖主體邊框 */
		g.setColor(Color.green);
		g.drawRect(200, 200, 600, 600);
		g.setColor(Color.cyan);
		g.drawRect(195, 195, 610, 610);
		/** 設定遊戲時間邊框 */
		g.setColor(Color.lightGray);
		g.fillRect(350, 80, 378, 55);
		g.setColor(Color.BLUE);
		T = Time.getT();
		g.setFont(font1);// 設定字型
		g.drawString("遊戲時間:" + T, 350, 125);

		repaint();

	}

	@Override
	public void mouseClicked(MouseEvent e) {
		if (flag == true)
			return; // 如果已經成功完成
		/* 得到行數和列數 圖片位置 */
		int x = e.getX();
		int y = e.getY();
		xx = y / 200 - 1;
		yy = x / 200 - 1;
		move();// 圖片交換
		int count = 0;// 用於判斷拼圖是否完成
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++) {
				if (tu[i][j] == i * 3 + j + 1)
					count++;
			}
		if (count == 9)
			flag = true;
	}

	private void move() {
		/** 交換規則:圖片周圍為空白圖片時,圖片與空白位置交換 */
		/* 如果圖片左邊為空白(圖片不在最左側) */
		if (xx != 0 && tu[xx - 1][yy] == 9) {
			/** 將圖片與空白處交換位置 */
			tu[xx - 1][yy] = tu[xx][yy];
			tu[xx][yy] = 9;
			N++;// 當圖片移動時步數加一
		}
		/* 如果圖片右邊為空白(圖片不在最右側) */
		else if (xx != 2 && tu[xx + 1][yy] == 9) {
			/* 將圖片與空白處交換位置 */
			tu[xx + 1][yy] = tu[xx][yy];
			tu[xx][yy] = 9;
			N++;
		}
		/* 如果圖片下邊為空白(圖片不在最下側) */
		else if (yy != 0 && tu[xx][yy - 1] == 9) {
			/** 將圖片與空白處交換位置 */
			tu[xx][yy - 1] = tu[xx][yy];
			tu[xx][yy] = 9;
			N++;
		}
		/* 如果圖片上邊為空白(圖片不在最上側) */
		else if (yy != 2 && tu[xx][yy + 1] == 9) {
			/** 將圖片與空白處交換位置 */
			tu[xx][yy + 1] = tu[xx][yy];
			tu[xx][yy] = 9;
			N++;
		}
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	public static boolean getFlag() {
		if (flag == false)
			return false;
		else
			return true;
	}

}

Time.java

class Time extends Thread {
	static int t = 0;// 計時

	public void run() {
		try {
			while (true) {
				Thread.sleep(1000);// 暫停一秒
				t++;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static int getT() {
		return t;
	}

	public void setT(int t) {
		this.t = t;
	}
}

Audio.java

import java.applet.*;

public class Audio extends Applet {
	AudioClip music1;

	public void init() {
		music1 = newAudioClip(Audio.class.getResource("1.wav"));
	}

	public void start() {
		music1.loop();
	}

	public void stop() {
		music1.stop();
	}
}

執行結果展示:


點選下載程式原始碼



相關文章