最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

《泡泡堂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使用POI從Excel讀取數據并存入數據庫(解決讀取到空行問題)

    有時候需要在java中讀取excel文件的內容,專業(yè)的方式是使用java POI對excel進行讀取,這篇文章主要給大家介紹了關于Java使用POI從Excel讀取數據并存入數據庫,文中介紹的辦法可以解決讀取到空行問題,需要的朋友可以參考下
    2023-12-12
  • Java行為型設計模式之外觀設計模式詳解

    Java行為型設計模式之外觀設計模式詳解

    外觀模式為多個復雜的子系統(tǒng),提供了一個一致的界面,使得調用端只和這個接口發(fā)生調用,而無須關系這個子系統(tǒng)內部的細節(jié)。本文將通過示例詳細為大家講解一下外觀模式,需要的可以參考一下
    2022-11-11
  • 一篇文章帶你入門Java字面量和常量

    一篇文章帶你入門Java字面量和常量

    這篇文章主要介紹了探究Java的常量,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • Java程序員必須知道的5個JVM命令行標志

    Java程序員必須知道的5個JVM命令行標志

    這篇文章主要介紹了每個Java程序員必須知道的5個JVM命令行標志,需要的朋友可以參考下
    2015-03-03
  • Java基礎面試題之volatile詳解

    Java基礎面試題之volatile詳解

    Volatile可以看做是輕量級的 Synchronized,它只保證了共享變量的可見性,下面這篇文章主要給大家介紹了關于Java基礎面試題之volatile的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • idea遠程debug調試部署在tomcat上項目

    idea遠程debug調試部署在tomcat上項目

    本文主要介紹了idea遠程debug調試部署在tomcat上項目,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Springboot3整合Mybatis-plus3.5.3報錯問題解決

    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)控的簡單使用方法示例代碼詳解

    這篇文章主要介紹了Spring Boot Actuator監(jiān)控的簡單使用,本文通過實例代碼圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Java中數字黑洞實現(xiàn)代碼

    Java中數字黑洞實現(xiàn)代碼

    這篇文章主要介紹了Java編程中如何實現(xiàn)數字黑洞算法游戲,其中涉及到了數組、scanner、if語句等Java編程的基礎知識,需要的朋友可以參考下
    2017-09-09
  • Springboot Websocket Stomp 消息訂閱推送

    Springboot Websocket Stomp 消息訂閱推送

    本文主要介紹了Springboot Websocket Stomp 消息訂閱推送,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07

最新評論

重庆市| 托克托县| 秭归县| 岑溪市| 高安市| 花莲市| 临颍县| 肃北| 五大连池市| 元氏县| 福安市| 密云县| 汉川市| 宜兰市| 阳城县| 炉霍县| 工布江达县| 德格县| 习水县| 巴中市| 双桥区| 江门市| 长葛市| 沾益县| 万宁市| 张家界市| 全椒县| 图片| 大宁县| 富平县| 岳阳县| 遂平县| 涞源县| 汉源县| 延寿县| 民乐县| 浏阳市| 师宗县| 桓台县| 甘谷县| 莱西市|