前言
《泡泡堂I》是一个基于java的自制游戏,游戏设计为双人pk积分赛模式,在这个模式里面,玩家只要率先达到一定分数既可以赢得比赛。玩家可以通过炸箱子可以得到少量的分数,也可以通过炸掉对手然后戳破包围对手的水泡得到大量分数。而玩家如果被泡泡爆炸击中,会被泡泡包裹一段时间,在这段时间内不可以移动和放泡泡,需要等时间过去或者被对手戳破水泡才能获得自由。但如果玩家被自己放的泡泡炸中,会扣一定的分数。
主要设计
- 设计游戏界面,用swing实现
- 绘制游戏启动界面、结束界面、地图、主角、道具
- 实现泡泡爆炸
- 实现双主角PK(积分制)
- 实现道具掉落和相应属性加成
- 实现游戏音效和背景音乐
功能截图
游戏启动界面:
游戏开始界面:
移动效果:
释放泡泡
泡泡爆炸效果:
代码实现
游戏启动类
public class GameStart {
public static void main(String[] args) {
//整个程序的入口 启动
StartFrame startFrame = new StartFrame();
startFrame.setVisible(true);
}
}
核心监听类
public class GameListener implements KeyListener {
private List<?> list;
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
//按下 左37 右39 下40 上38 w87 a65 s83 d68 空格32 enter10
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
//System.out.println("keypressed"+e.getKeyCode());
list = ElementManager.getInstance().getElementList("play");
Player oneplayer = (Player)list.get(0);
Player twoPlayer = (Player)list.get(1);
switch (e.getKeyCode()) {
case 65:
oneplayer.setLEFT(true);
// oneplayer.setStop(false);
break;
case 87:
oneplayer.setUP(true);
// oneplayer.setStop(false);
break;
case 68:
oneplayer.setRIGHT(true);
// oneplayer.setStop(false);
break;
case 83:
oneplayer.setDOWN(true);
// oneplayer.setStop(false);
break;
case 32:
oneplayer.setPk(true);
break;
case 37:
twoPlayer.setLEFT(true);
break;
case 38:
twoPlayer.setUP(true);
break;
case 39:
twoPlayer.setRIGHT(true);
break;
case 40:
twoPlayer.setDOWN(true);
break;
case 10:
twoPlayer.setPk(true);
break;
}
}
//松开
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
//System.out.println("keyreleased"+e.getKeyCode());
list = ElementManager.getInstance().getElementList("play");
Player oneplayer = (Player)list.get(0);
Player twoPlayer = (Player)list.get(1);
switch (e.getKeyCode()) {
case 65:
// if (oneplayer.isLEFT()) {
// oneplayer.setStop(true);
// }
oneplayer.setLEFT(false);
break;
case 87:
// if (oneplayer.isUP()) {
// oneplayer.setStop(true);
// }
oneplayer.setUP(false);
break;
case 68:
// if (oneplayer.isRIGHT()) {
// oneplayer.setStop(true);
// }
oneplayer.setRIGHT(false);
break;
case 83:
// if (oneplayer.isDOWN()) {
// oneplayer.setStop(true);
// }
oneplayer.setDOWN(false);
break;
case 32:
oneplayer.setPk(false);
break;
case 37:
twoPlayer.setLEFT(false);
break;
case 38:
twoPlayer.setUP(false);
break;
case 39:
twoPlayer.setRIGHT(false);
break;
case 40:
twoPlayer.setDOWN(false);
break;
case 10:
twoPlayer.setPk(false);
break;
}
}
}
核心线程类
public class GameThread extends Thread{
//计时数据
private static int time ;
private boolean flag=true;
//重构老项目
@Override
public void run() {
//这个循环控制游戏整体进度
// while(flag){
// 死循环 状态变量进行控制
//1.加载地图 人物
loadElement();
//2.显示地图人物(流程 自动化(移动,碰撞))
time = 0;
loadBGM();
runGame();
//3.结束地图
try {
TimeUnit.MILLISECONDS.sleep(150);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// }
}
//控制进度 但是作为控制 请不要接触load 只能通过元素管理器访问元素
public void loadElement(){
ElementManager.getInstance().load();
}
public void runGame(){
//这个循环控制每个关卡 地图中玩的状态
ElementManager manager = ElementManager.getInstance();
while(flag){
Map<String, List<SuperElement> > map = manager.getMap();
Set<String> set = map.keySet();
List<String> temp = new ArrayList<>();
temp.addAll(set);
//迭代器在遍历的过程中,迭代器中的元素不可以变化(增加或减少)
for (int i=temp.size()-1; i>=0 ; i--) {
List<SuperElement> list = map.get(temp.get(i));
for (int j = 0; j < list.size(); j++) {
SuperElement superElement = list.get(j);
superElement.update();
if (!superElement.isVisible()) {
manager.removeElementByPx(superElement.getY(), superElement.getX());
list.remove(j);
}
}
}
//使用一个独立的方法来进行判定
PK();
//游戏的流程控制
linkGame();
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//死亡 通关状态 结束runGame方法
overGame();
time++; //一秒钟增加10
}
}
public void PK() {
// TODO Auto-generated method stub
List<SuperElement> players = ElementManager.getInstance().getElementList("play");
List<SuperElement> enemys = ElementManager.getInstance().getElementList("enemylist");
//进行比较
listPK(players, enemys);
}
public void listPK(List<SuperElement> list1,List<SuperElement> list2){
for (int i = 0; i < list1.size(); i++) {
for (int j = 0; j < list2.size(); j++) {
if (list1.get(i).gamePK(list2.get(j))) {
list2.get(j).setVisible(false);
}
}
}
}
public void overGame(){
Player player1 = (Player)(ElementManager.getInstance().getElementList("play").get(0));
Player player2 = (Player)(ElementManager.getInstance().getElementList("play").get(1));
if(player1.getNum()>=1000||player2.getNum()>=1000) {
flag = false;
new Thread() {
public void run() {
new audioPlay(Audio.OVER).player();
}
}.start();
}
}
//游戏的流程控制
public void linkGame(){
// Map< String , List<SuperElement> > map =
// ElementManager.getInstance().getMap();
// List<SuperElement> enemys = map.get("enemylist");
// //一秒钟增加一个敌机
// if (time%10 == 0) {
// enemys.add(Enemy.createEnemy(""));
// }
ElementManager.getInstance().linkGame(time);
}
public static int getTime() {
return time;
}
public static void setTime(int time) {
GameThread.time = time;
}
private void loadBGM() {
new Thread() {
public void run() {
while(flag) {
audioPlay play = new audioPlay(Audio.BGM);
play.player();
if(!flag) {
play.stop();
}
}
}
}.start();
}
//敌机的创建
}
总结
通过此次的《泡泡堂I》实现,让我对JAVA的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。
java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。
到此这篇关于Java实现经典游戏泡泡堂的示例代码的文章就介绍到这了,更多相关Java泡泡堂内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!