下载地址
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
失败显示这个
成功显示彩蛋和音乐
共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