欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)經(jīng)典游戲泡泡堂的示例代碼

 更新時間:2022年04月04日 08:57:41   作者:小虛竹and掘金  
這篇文章將利用Java制作經(jīng)典游戲——泡泡堂,游戲設(shè)計為雙人pk積分賽模式,在這個模式里面,玩家只要率先達(dá)到一定分?jǐn)?shù)既可以贏得比賽。感興趣的可以了解一下

前言

《泡泡堂I》是一個基于java的自制游戲,游戲設(shè)計為雙人pk積分賽模式,在這個模式里面,玩家只要率先達(dá)到一定分?jǐn)?shù)既可以贏得比賽。玩家可以通過炸箱子可以得到少量的分?jǐn)?shù),也可以通過炸掉對手然后戳破包圍對手的水泡得到大量分?jǐn)?shù)。而玩家如果被泡泡爆炸擊中,會被泡泡包裹一段時間,在這段時間內(nèi)不可以移動和放泡泡,需要等時間過去或者被對手戳破水泡才能獲得自由。但如果玩家被自己放的泡泡炸中,會扣一定的分?jǐn)?shù)。

主要設(shè)計

  • 設(shè)計游戲界面,用swing實現(xiàn)
  • 繪制游戲啟動界面、結(jié)束界面、地圖、主角、道具
  • 實現(xiàn)泡泡爆炸
  • 實現(xiàn)雙主角PK(積分制)
  • 實現(xiàn)道具掉落和相應(yīng)屬性加成
  • 實現(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{
	//計時數(shù)據(jù)
	private static int time ;
	private boolean flag=true;
	//重構(gòu)老項目
	@Override
	public void run() {
		//這個循環(huán)控制游戲整體進度
//		while(flag){
			// 死循環(huán) 狀態(tài)變量進行控制
			//1.加載地圖 人物
			loadElement();
			//2.顯示地圖人物(流程 自動化(移動,碰撞))
			time = 0;
			loadBGM();
			runGame();
			//3.結(jié)束地圖



			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)控制每個關(guā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();
			}
			//死亡 通關(guān)狀態(tài) 結(jié)束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)建
	
	
}

總結(jié)

通過此次的《泡泡堂I》實現(xiàn),讓我對JAVA的相關(guān)知識有了進一步的了解,對java這門語言也有了比以前更深刻的認(rèn)識。

java的一些基本語法,比如數(shù)據(jù)類型、運算符、程序流程控制和數(shù)組等,理解更加透徹。java最核心的核心就是面向?qū)ο笏枷?,對于這一個概念,終于悟到了一些。

到此這篇關(guān)于Java實現(xiàn)經(jīng)典游戲泡泡堂的示例代碼的文章就介紹到這了,更多相關(guān)Java泡泡堂內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaWeb如何發(fā)送狀態(tài)碼方法解析

    JavaWeb如何發(fā)送狀態(tài)碼方法解析

    這篇文章主要介紹了JavaWeb如何發(fā)送狀態(tài)碼方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot實現(xiàn)接口版本控制的示例代碼

    SpringBoot實現(xiàn)接口版本控制的示例代碼

    這篇文章主要介紹了springboot如何實現(xiàn)接口版本控制,接口版本控制,比如微服務(wù)請求中某個接口需要升級,正常做法是升級我們的版本,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下
    2024-03-03
  • Java使用poi將word轉(zhuǎn)換為html

    Java使用poi將word轉(zhuǎn)換為html

    這篇文章主要為大家詳細(xì)介紹了Java使用poi將word轉(zhuǎn)換為html的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 構(gòu)建springboot自動生成mapper文件和dao接口項目的步驟和配置方法

    構(gòu)建springboot自動生成mapper文件和dao接口項目的步驟和配置方法

    這篇文章主要介紹了構(gòu)建springboot自動生成mapper文件和dao接口項目的步驟和配置方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Mybatis的Mapper代理對象生成及調(diào)用過程示例詳解

    Mybatis的Mapper代理對象生成及調(diào)用過程示例詳解

    這篇文章主要為大家介紹了Mybatis的Mapper代理對象生成及調(diào)用過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 使用AbstractRoutingDataSource實現(xiàn)數(shù)據(jù)源動態(tài)切換的實例

    使用AbstractRoutingDataSource實現(xiàn)數(shù)據(jù)源動態(tài)切換的實例

    AbstractRoutingDataSource 是 Spring 框架提供的一個抽象類,用于實現(xiàn)動態(tài)數(shù)據(jù)源路由,這個類主要用于多數(shù)據(jù)源場景,其中可以根據(jù)不同的條件動態(tài)地切換到不同的數(shù)據(jù)源,本文給大家介紹了如何使用AbstractRoutingDataSource實現(xiàn)數(shù)據(jù)源動態(tài)切換,需要的朋友可以參考下
    2024-03-03
  • 關(guān)于Java中反射的作用義及使用方法

    關(guān)于Java中反射的作用義及使用方法

    這篇文章主要介紹了關(guān)于Java中反射的作用義及使用方法,反射使得程序可以在運行時對類進行檢查和操作,而不需要在編譯時知道類的完整信息,需要的朋友可以參考下
    2023-07-07
  • 分析xxljob登入功能集成OIDC的統(tǒng)一認(rèn)證

    分析xxljob登入功能集成OIDC的統(tǒng)一認(rèn)證

    這篇文章主要為大家介紹分析xxljob登入功能集成OIDC的統(tǒng)一認(rèn)證的詳解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • 手把手帶你理解java線程池之工作隊列workQueue

    手把手帶你理解java線程池之工作隊列workQueue

    這篇文章主要介紹了java線程池之工作隊列workQueue,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Java實現(xiàn)簡易提款機

    Java實現(xiàn)簡易提款機

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡易提款機,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論