Java實現(xiàn)經典游戲泡泡堂的示例代碼
前言
《泡泡堂I》是一個基于java的自制游戲,游戲設計為雙人pk積分賽模式,在這個模式里面,玩家只要率先達到一定分數既可以贏得比賽。玩家可以通過炸箱子可以得到少量的分數,也可以通過炸掉對手然后戳破包圍對手的水泡得到大量分數。而玩家如果被泡泡爆炸擊中,會被泡泡包裹一段時間,在這段時間內不可以移動和放泡泡,需要等時間過去或者被對手戳破水泡才能獲得自由。但如果玩家被自己放的泡泡炸中,會扣一定的分數。
主要設計
- 設計游戲界面,用swing實現(xiàn)
- 繪制游戲啟動界面、結束界面、地圖、主角、道具
- 實現(xiàn)泡泡爆炸
- 實現(xiàn)雙主角PK(積分制)
- 實現(xiàn)道具掉落和相應屬性加成
- 實現(xiàn)游戲音效和背景音樂
功能截圖
游戲啟動界面:

游戲開始界面:

移動效果:

釋放泡泡

泡泡爆炸效果:

代碼實現(xiàn)
游戲啟動類
public class GameStart {
public static void main(String[] args) {
//整個程序的入口 啟動
StartFrame startFrame = new StartFrame();
startFrame.setVisible(true);
}
}核心監(jiān)聽類
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() {
//這個循環(huán)控制游戲整體進度
// while(flag){
// 死循環(huán) 狀態(tài)變量進行控制
//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(){
//這個循環(huán)控制每個關卡 地圖中玩的狀態(tài)
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();
}
//死亡 通關狀態(tài) 結束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();
}
//敵機的創(chuàng)建
}總結
通過此次的《泡泡堂I》實現(xiàn),讓我對JAVA的相關知識有了進一步的了解,對java這門語言也有了比以前更深刻的認識。
java的一些基本語法,比如數據類型、運算符、程序流程控制和數組等,理解更加透徹。java最核心的核心就是面向對象思想,對于這一個概念,終于悟到了一些。
到此這篇關于Java實現(xiàn)經典游戲泡泡堂的示例代碼的文章就介紹到這了,更多相關Java泡泡堂內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java使用POI從Excel讀取數據并存入數據庫(解決讀取到空行問題)
有時候需要在java中讀取excel文件的內容,專業(yè)的方式是使用java POI對excel進行讀取,這篇文章主要給大家介紹了關于Java使用POI從Excel讀取數據并存入數據庫,文中介紹的辦法可以解決讀取到空行問題,需要的朋友可以參考下2023-12-12
Springboot3整合Mybatis-plus3.5.3報錯問題解決
在日常學習springboot3相關的代碼時,在使用 SpringBoot3 整合 MyBatisplus 時出現(xiàn)了一些問題,花了不少時間處理,這篇文章主要介紹了Springboot3整合Mybatis-plus3.5.3報錯問題解決,需要的朋友可以參考下2023-11-11
Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解
這篇文章主要介紹了Spring Boot Actuator監(jiān)控的簡單使用,本文通過實例代碼圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
Springboot Websocket Stomp 消息訂閱推送
本文主要介紹了Springboot Websocket Stomp 消息訂閱推送,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07

