Java小游戏GUI 进制大冒险

 

下载地址

https://download.csdn.net/download/qq_38733890/10934881

联系方式QQ:572739652

安装向导


开发环境:JDK 8   小版本:151

使用插件:windowBuilder 

项目导入:

方法1:
首先,在本地磁盘D盘下新建一个文件夹,叫   WorkSpace

启动eclipse,更换工作空间,换成 新建的WorkSpace

导入项目,运行Start.java

方法2:
直接导入项目,把Util包下Music  11行的        String path="D:\\WorkSpace\\BinaryGame\\music\\"
改成你自己电脑上对应的路径 X:\\XXXXXXXX\\BinaryGame\\music\\"


注意事项:
跳跃8下之后,任意按  0   或   1 进入下一关的大门

全部通关,到了彩蛋这关时,必须先按一下   0 或  1,背景音乐才可以播放。

每一次按压键盘,时间间隔必须大于0.1s ,不然键盘监听反应不过来。


五关的答案:

0 0 0 0 1 0 0 1

0 0 0 1 0 0 1 0

0 1 1 0 0 1 0 0

0 0 1 0 0 0 0 0

1 1 0 0 1 0 0 1

Java小游戏GUI 进制大冒险_第1张图片

 

Java小游戏GUI 进制大冒险_第2张图片

 

失败显示这个

Java小游戏GUI 进制大冒险_第3张图片

 

成功显示彩蛋和音乐

共5关

开始

package com.game;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JPanel;
import javax.swing.JTextField;

import com.util.Music;

import javax.swing.JLabel;
import java.awt.Canvas;
import java.awt.Font;

public class Start {

	private JFrame frame;
	MyJFrame myJFrame;
	Help help;
	private JFrame extraSceneFrame; 
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Start window = new Start();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		
	}

	/**
	 * Create the application.
	 */
	public Start() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setTitle("进制大冒险");// 设置标题
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel = new JPanel();//JPanel默认是流式布局 
		frame.getContentPane().add(panel, BorderLayout.CENTER);//边界布局
		panel.setLayout(null);
		JButton btnNewButton = new JButton("开始游戏");
		// 添加点击事件监听器(你可以使用任何其他监听,看你想在什么情况下创建新的窗口了)
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				frame.dispose();// 关闭此窗体
				// 创建新的窗口
				 myJFrame = new MyJFrame();
			}
		});
		btnNewButton.setBounds(295, 40, 103, 46);
		panel.add(btnNewButton);
		
		JButton btnNewButton_2 = new JButton("帮助");
		btnNewButton_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				frame.dispose();// 关闭主界面窗体
				help = new Help(frame); //调用帮助界面
				
			}
		});
		btnNewButton_2.setBounds(295, 118, 103, 29);
		panel.add(btnNewButton_2);
		
		JButton btnNewButton_1 = new JButton("退出游戏");
		btnNewButton_1.setBounds(295, 179, 103, 29);
		panel.add(btnNewButton_1);
		
		//添加背景画
		JLabel jLabel=new JLabel();
		Icon icon=new ImageIcon("D:\\WorkSpace\\BinaryGame\\bin\\img\\pig.jpg"); //在此直接创建对象
		jLabel.setIcon(icon);
		jLabel.setBounds(0, 0, 450, 300);
		panel.add(jLabel);
		
		
		
		// 添加点击事件监听器(你可以使用任何其他监听,看你想在什么情况下创建新的窗口了)
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(1);   //退出程序
			}
		});
	}
	
	public void showExtraScene(MyJFrame myJFrame) {
		myJFrame.dispose();
		extraSceneFrame = new JFrame();
		extraSceneFrame.setTitle("彩蛋");// 设置标题
		extraSceneFrame.setLocation(400,350); //设置启动显示位置
		extraSceneFrame.setSize(850, 400);// 窗口大小
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel = new JPanel();//JPanel默认是流式布局 
		//添加彩蛋
		JLabel jLabel=new JLabel();
		Icon icon=new ImageIcon("D:\\WorkSpace\\BinaryGame\\bin\\img\\extraSceneImage.jpg"); //在此直接创建对象
		jLabel.setIcon(icon);
		jLabel.setBounds(0, 0, 850, 400);
		panel.add(jLabel);
		frame.getContentPane().add(panel, BorderLayout.CENTER);//边界布局
		panel.setLayout(null);
		extraSceneFrame.setVisible(true);
		Music.play("extraSceneMusic.mp3");//播放彩蛋的音乐
	}
}

MUSIC

package com.util;
import java.io.File;
import java.net.MalformedURLException;

import javafx.scene.media.AudioClip; // 导包
 
public class Music {//音乐播放的包
	  static AudioClip audioClip ;  //声明一个播放音频的接口
	
	public static void play(String music) {
		  String path="D:\\WorkSpace\\BinaryGame\\music\\";
		String musicPath = path.concat(music);//路径拼接
		try {
			audioClip=new AudioClip(new File(musicPath).toURI().toURL().toString());
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			System.out.println("===音乐播放出现异常===");
			e.printStackTrace();
		}
		 audioClip.play(0.6);//设置以60%的音量播放
		  // 设置一个循环,保证播放完了声音才退出程序
	        while(true) {
	            if(!audioClip.isPlaying()) {//如果停止了播放,就退出while循环
	                break;
	            }
	        }
		
	}
	
	public static void stop() {
		audioClip.stop();
	}
     
    public static void main(String[] args) {
    	//Music.play("backgroundMusic.mp3");
    	//Music.stop();
    	Music.play("trample.wav");
       
    }
}

 

package com.entity;

import java.util.Arrays;

public class Person {
	private String name;// 玩家姓名
	private int level;// 玩家到达的关卡数
	private boolean flag;// 是否过关
	int[] answer; // 答案5个
	int step; // 玩家走到第几步了
	int[] stepList; // 玩家每一关的足迹集合,每关8步

	public Person() {
		super();
		int[] stepList = new int[9];
		int[] answer = { 0, 9, 18, 100, 32, 201 };
		this.level = 1;
		this.flag = false;
		this.answer = answer;
		this.step = 0;
		this.stepList = stepList;

	}

	public Person(String name, int level, boolean flag, int[] answer, int step, int[] stepList) {
		super();
		this.name = name;
		this.level = level;
		this.flag = flag;
		this.answer = answer;
		this.step = step;
		this.stepList = stepList;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public void addLevel() {
		this.level += 1;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}

	public int[] getAnswer() {
		return answer;
	}

	public void setAnswer(int[] answer) {
		this.answer = answer;
	}

	public int getStep() {
		return step;
	}

	public void addStep() {
		this.step += 1;
	}

	public void setStep(int step) {
		this.step = step;
	}

	public int[] getStepList() {
		return stepList;
	}

	public void setStepList(int index,int value) {
		this.stepList[index] = value;
	}

	public boolean equalAnswer() {
		int sum = 0;
		for(int i:stepList) {
			System.out.println("=="+i);
		}
		for (int i = 1; i <= 8; i++) { // 把足迹组成二进制数
			if (this.stepList[i] == 1) {    //如果是1,就计数
				sum += Math.pow(2, 8 - i);
			}
		}
		if (answer[this.level] == sum) { // 对比与答案是否相等
			return true;
		}
		return false;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", level=" + level + ", flag=" + flag + ", answer=" + Arrays.toString(answer)
				+ ", step=" + step + ", stepList=" + Arrays.toString(stepList) + "]";
	}

}

 

package com.game;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.FlowLayout;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JTextPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

/**
 * @Auther: sunYong
 * @Date: 2019-01-20 15:49
 * @Description: com.game
 */
public class Help {

	private JPanel contentPane;
	private JFrame frame;

	/**
	 * Launch the application.
	 */

	/**
	 * Create the frame.
	 */
	public Help(JFrame jFrame) {
		frame = new JFrame("帮助");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		frame.setContentPane(contentPane);
		contentPane.setLayout(null);
		frame.setVisible(true);
		JTextPane textPane = new JTextPane();
		textPane.setText(
				"本游戏意在锻炼玩家的十进制 -> 二进制的转换能力。游戏共有5关,每关游戏共有8个管道,玩家需要输入0 或 1 来进行跳跃,0 1组成的二进制数同答案提示的二进制数相同则通过关卡,否则则提示失败。注意:管道从左向右为二进制高位到低位的顺序。最左边的管道代表2的7次幂,最右边的为2的0次幂,祝你好运!");
		textPane.setBounds(70, 43, 275, 137);
		contentPane.add(textPane);

		JButton btnNewButton = new JButton("返回主界面");
		// 点击返回主界面,关闭本窗体,显示主界面
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				frame.dispose();// 关闭窗体,释放资源
				jFrame.setVisible(true);
			}
		});
		btnNewButton.setBounds(139, 212, 115, 23);
		contentPane.add(btnNewButton);
	}

}

 

package com.game;

import javax.swing.JFrame;

import com.util.Music;

public class MyJFrame extends JFrame {
	private int level;

	public MyJFrame() {
		MyPanel panel = new MyPanel();
		this.getContentPane().add(panel);
		this.setTitle("进制大冒险");// 设置标题
		this.setLocation(400, 350); // 设置启动显示位置
		setSize(850, 400);// 窗口大小
		setVisible(true);// 可视化
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 可以关闭
		addKeyListener(panel);// 添加键盘监听器
	}

	public static void main(String[] args) {
		MyJFrame game = new MyJFrame(); // 仅做测试用途

	}
}

 

package com.game;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import com.entity.Person;
import com.util.Music;

class MyPanel extends JPanel implements KeyListener {
	Person person;
	Image personImage1 = null;// 人物图片
	Image personImage2 = null;
	Image personImage3 = null;
	Image personImage4 = null;
	Image personImage5 = null;
	Image personImage6 = null;
	Image personImage7 = null;
	Image backgroundImage = null; // 背景图片
	Image doorImage = null;// 门的图片
	Image mapImage3 = null;// 草地图片
	Image pumpImage = null;// 管道图片
	Image questionImage1 = null;// 问题图片
	Image questionImage2 = null;
	Image questionImage3 = null;
	Image questionImage4 = null;
	Image questionImage5 = null;
	Image extraSceneImage = null;
	int x = 0;
	int cnt = 1;// 计数器,记录人物动作

	public MyPanel() {
		person = new Person();
		// System.out.println(Panel.class.getResource("/")); 路径测试
		// 初始化图片,使用gif格式图片,因为gif支持背景色透明显示
		personImage1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/mario_R_run0.gif"));
		personImage2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/mario_R_jump1.gif"));
		personImage3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/mario_R_jump2.gif"));
		personImage4 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/mario_R_jump3.gif"));
		personImage5 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/mario_R_jump4.gif"));
		backgroundImage = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/background.gif"));
		doorImage = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/door.gif"));
		pumpImage = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/pump.gif"));
		questionImage1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/questionImage1.jpg"));
		questionImage2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/questionImage2.jpg"));
		questionImage3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/questionImage3.jpg"));
		questionImage4 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/questionImage4.jpg"));
		questionImage5 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/questionImage5.jpg"));
		extraSceneImage = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img/extraSceneImage.jpg"));
		// setBackground(Color.white);设置背景
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (person.getLevel() == 6) { // 如果已经通关
			drawExtraScene(g); // 绘制彩蛋
		} else {// 还没有通关
			if (cnt == 1) {
				this.drawPerson(g, personImage1, x);// 调用人物绘制函数
			} else if (cnt == 2) {
				this.drawPerson(g, personImage2, x);// 调用人物绘制函数
			} else if (cnt == 3) {
				this.drawPerson(g, personImage3, x);// 调用人物绘制函数
			} else if (cnt == 4) {
				this.drawPerson(g, personImage4, x);// 调用人物绘制函数
			}

			else if (cnt == 5) {
				this.drawPerson(g, personImage5, x);// 调用人物绘制函数
			}

			else if (cnt == 6) {
				this.drawPerson(g, personImage1, x);// 调用人物绘制函数
			}
			this.drawMap(g);
		}
	}

	// 绘制人物
	public void drawPerson(Graphics g, Image image, int x) {
		g.drawImage(image, x, 260, 50, 50, this);
	}

	// 绘制地图
	public void drawMap(Graphics g) {
		g.setFont(new Font("Tahoma", Font.BOLD, 16));// 设置字体(字体、样式、大小)
		g.drawImage(backgroundImage, 0, 310, 850, 35, this);// 绘制草地背景
		g.drawImage(doorImage, 780, 260, 50, 50, this);// 绘制大门
		int startPost = 60;// 管道的起始位置
		int width = 90;// 管道间隔距离
		g.drawImage(pumpImage, startPost, 300, 60, 60, this);// 绘制管道
		g.drawImage(pumpImage, startPost + 1 * width, 300, 60, 60, this);
		g.drawImage(pumpImage, startPost + 2 * width, 300, 60, 60, this);
		g.drawImage(pumpImage, startPost + 3 * width, 300, 60, 60, this);
		g.drawImage(pumpImage, startPost + 4 * width, 300, 60, 60, this);
		g.drawImage(pumpImage, startPost + 5 * width, 300, 60, 60, this);
		g.drawImage(pumpImage, startPost + 6 * width, 300, 60, 60, this);
		g.drawImage(pumpImage, startPost + 7 * width, 300, 60, 60, this);
		drawNum(g);
		int level = person.getLevel();
		switch (level) {
		case 0:

			break;
		case 1:
			g.drawImage(questionImage1, 30, 30, 760, 200, this);
			break;
		case 2:
			g.drawImage(questionImage2, 30, 30, 760, 200, this);
			break;
		case 3:
			g.drawImage(questionImage3, 30, 30, 760, 200, this);
			break;
		case 4:
			g.drawImage(questionImage4, 30, 30, 760, 200, this);
			break;
		case 5:
			g.drawImage(questionImage5, 30, 30, 760, 200, this);
			break;

		}
	}

	public void drawNum(Graphics g) {// 绘制管道中的数字
		if (person.getStep() >= 1 && person.getStep() <= 8) {
			for (int i = 1; i <= person.getStep(); i++) {
				int[] stepList = person.getStepList();
				String num = Integer.toString(stepList[i]);
				g.drawString(num, 90 * i, 350);
			}
		}

	}

	public void drawExtraScene(Graphics g) {// 绘制彩蛋
		g.drawImage(extraSceneImage, 0, 0, 850, 400, this);
		// 音乐不能放到这里,Graphics和Music会产生线程冲突
		// Music.play("extraSceneMusic.mp3"); //播放彩蛋的音乐
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
	}

//重写键盘按压方法
	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_0) {
			Timer timer = new Timer();
			Music.play("trample.wav"); // 播放踩踏的音乐
			timer.schedule(new TimerTask() {
				@Override
				public void run() {
					if (cnt <= 6) {

						repaint();
						cnt += 1;
						x += 14;
					} else {
						cnt = 1;
						person.addStep();// 记录走了一步
						if (person.getStep() == 9) {// 走到门口时
							if (person.equalAnswer() == true) {
								person.addLevel();// 进入下一关
								person.setStep(0);// 归零
								x = 0;
							} else {// 弹出提示框
								JOptionPane.showMessageDialog(null, "你也太菜了吧,二进制都不会!");
								System.exit(0);
							}
						} else {
							int index = person.getStep();// 查看这一步是第几步
							person.setStepList(index, 0); // 赋值
						}
						repaint();
						timer.cancel();// 停止定时器

					}
				}
			}, 0, 100);
		} else if (e.getKeyCode() == KeyEvent.VK_1) {
			Timer timer = new Timer();
			Music.play("trample.wav"); // 播放踩踏的音乐
			timer.schedule(new TimerTask() {
				@Override
				public void run() {
					if (cnt <= 6) {
						cnt += 1;
						x += 14;
						repaint();

					} else {
						cnt = 1;
						person.addStep();// 记录走了一步
						if (person.getStep() == 9) {// 走到门口时
							if (person.equalAnswer() == true) {
								person.addLevel(); // 进入下一关
								person.setStep(0); // 归零
								x = 0;
							} else {// 弹出提示框
								JOptionPane.showMessageDialog(null, "你也太菜了吧,二进制都不会!");
								System.exit(0);
							}
						} else {
							int index = person.getStep();// 查看这一步是第几步
							person.setStepList(index, 1); // 赋值
						}
						repaint();
						timer.cancel();// 停止定时器
					}
				}
			}, 0, 100);
		}
		// repaint();
		if (person.getLevel() == 6) {
			Music.play("extraSceneMusic.mp3"); // 播放彩蛋的音乐
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub

	}
}

下载地址

https://download.csdn.net/download/qq_38733890/10934881

 

你可能感兴趣的:(java)