主頁 >  其他 > 新設計 智能 坦克大戰 初學者案例

新設計 智能 坦克大戰 初學者案例

2021-12-28 09:18:06 其他

經典坦克大戰,我學習的一個案例,案例實作功能比較簡單,我做了大幅改進,

1所有元素坦克,炮彈,圍墻,心形 都是利用函式畫出來的,沒有使用圖片

2 加入游戲編輯關卡功能,可以自己編輯關卡,保存讀取

3 加入a*演算法實作自動尋路殺敵,加入躲避炮彈演算法實習自動躲避炮彈功能

4 加入跟蹤彈演算法,實作跟蹤彈追蹤敵人

exe程式下載地址

下載地址 提取碼:iz9y

需要原始碼聯系下

編輯關卡模式,設計自己的關卡

實作自動尋路規劃路線,自動打堵住的黃色圍墻

紅色跟蹤彈鎖定敵人,加入攻擊狀態,被攻擊隨機進入各種狀態

package 坦克大戰;
import java.util.Random;
import java.util.Vector;

public class DnTank extends Tank implements Runnable{//繼承坦克,執行緒介面
    ZiDan zd=null;//子彈
    MyTank mt=null;//我的坦克
    int gzbh = 0;//跟蹤編號(用于跟蹤彈鎖定,碰撞檢測區分)
    int xljg=0;//尋路間隔(-1 被鎖定 >0自動模式電腦坦克被堵,不可到達再次被檢測間隔時間)
	
	public DnTank(int x, int y, int suD, int fangX, int leiX, int xuel, int zdSd) {
		super(x, y, suD, fangX, leiX, xuel, zdSd);
	}

	public void run() {
		while(true) {
            if(this.TankXs==false) {//檢測電腦坦克被消滅,結束執行緒
            	break;
            }           
			try {
				Thread.sleep(50);//改變電腦運動重繪速度
			} catch (Exception e) {
				e.printStackTrace();
			}
			if(StartGame.yxzt) {	//檢測是否游戲暫停
	            if(ShiJ>0) { //狀態時間        	
            		ShiJ--;  	
	            }else {
            		Zuangt=0;
	            }
	            mt=MyPanel.mt;//復制我的坦克
				this.wbjz();//呼叫我的坦克可被擊中				
				int sd=SuD;
				if(Zuangt==1) {//1減速,2慢射 3定身  4禁彈 5封禁
	      			sd=1;
	      		}else if(Zuangt==3 || Zuangt==5) {
	      			sd=0;
	      		}
				boolean dz=true;//是否被擋住
			    for(int i=0;i<JiLu.wq.size();i++) {//碰墻檢測
					Qiang q=JiLu.wq.get(i);
					boolean[] pq={(q.X>=X-40 && q.X<=X+57 && Y<=q.Y+40+sd && Y>=q.Y && q.qxs),
						       	  (q.Y>=Y-40 && q.Y<=Y+57 && q.X<=X+57+sd && q.X>=X && q.qxs),
						          (q.X>=X-40 && q.X<=X+57 && Y>=q.Y-57-sd && Y<=q.Y && q.qxs),
						       	  (q.Y>=Y-40 && q.Y<=Y+57 && q.X>=X-40-sd && q.X<=X && q.qxs)};
	        		if(pq[FangX-1] && q.leiX!=2 && q.leiX!=4){//緊靠墻磚時移動
	        			int[][] sf= {{X,q.Y+41},{q.X-61,Y},{X,q.Y-61},{q.X+41,Y}};
			        	X=sf[FangX-1][0];  
			        	Y=sf[FangX-1][1];
			        	dz=false;
	        		    break;
	        		}
				}
			    if(dz) {//坦克碰撞檢測
					for(int i=0;i<MyPanel.dntk.size();i++) {//檢測電腦坦克周圍是否有其他坦克阻擋
						DnTank dt=MyPanel.dntk.get(i);
						int cx,cy;
						if(this.gzbh==dt.gzbh) {//如果是敵人自己就檢測我的坦克
							cx=mt.X;
							cy=mt.Y;
						}else {
							cx=dt.X;//電腦坦克坐標x
							cy=dt.Y;//電腦坦克坐標y
						}
						boolean[] pt={(cx>X-57 && cx<X+57 && Y<cy+57+sd && Y>cy),
								      (cy>Y-57 && cy<Y+57 && cx<X+57+sd && cx>X),
								      (cx>X-57 && cx<X+57 && Y>cy-57-sd && Y<cy),
								      (cy>Y-57 && cy<Y+57 && cx>X-57-sd && cx<X)};
						if(pt[FangX-1]) {
							 boolean[] zx= {Y>cy+61,X<cx-61,Y<cy-61,X>cx+61};
			        		    if(zx[FangX-1]) {//緊靠坦克時移動
				        		    int[][] sf= {{X,cy+61},{cx-61,Y},{X,cy-61},{cx+61,Y}};
				    		        X=sf[FangX-1][0];  
				    		        Y=sf[FangX-1][1];
			        		    }
							dz=false;
							break;
						}
					}
			    }
				if(dz) {//無阻擋移動
					boolean[] zx= {Y-sd>0,X+sd<740,Y+sd<504,X-sd>0};
			    	if(zx[FangX-1]) {
			    		int[][] sf= {{X,Y-sd},{X+sd,Y},{X,Y+sd},{X-sd,Y}};
			    		    X=sf[FangX-1][0];  
		    		        Y=sf[FangX-1][1];
			    	}else{//靠近邊界是移動
			    		int[][] sf= {{X,2},{738,Y},{X,502},{2,Y}};
			    		    X=sf[FangX-1][0];  
		    		        Y=sf[FangX-1][1];
			    	}
				}
				Random a=new Random();//此類的實體用于生成偽亂數流
				int s=new Random().nextInt(22);//	
				if(this.leiX>9) {//型別大于10是boss重繪方向子彈
					if (s>17) {//BOSS坦克改變方向幾率
						this.FangX=a.nextInt(4)+1; //獲取1-4亂數
					}			
					if(s>15 && this.zdlf.size()<10) {//BOSS坦克子彈發射幾率,子彈發射數量限制
						if(Zuangt<4 || Zuangt==6) {//1減速,2慢射 3定身  4禁彈 5封禁
							this.Fszd();
						}
					}
				}else {//普通坦克重繪方向子彈
					if (s>18) {//電腦坦克改變方向幾率
						this.FangX=a.nextInt(4)+1; //獲取1-4亂數
					}			
					if(s>17 && this.zdlf.size()<4) {//電腦坦克子彈發射幾率,子彈發射數量限制
						if(Zuangt<4 || Zuangt==6) {//1減速,2慢射 3定身  4禁彈 5封禁
							this.Fszd();
						}
					}
				}
			}
		}
	}
	
	public void wbjz() {//電腦坦克擊中我或墻
		for(int j=0;j<zdlf.size();j++) {
			ZiDan dd=zdlf.get(j);//電腦子彈坐標xy
			if(dd.zdxs) {
				for(int n=0;n<JiLu.wq.size();n++) {//比對墻與子彈坐標
					Qiang q=JiLu.wq.get(n);//
					if(dd.x>=q.X-6 && dd.x<=q.X+34 && dd.y>=q.Y-6 && dd.y<=q.Y+34 && q.qxs && dd.zdxs) {//如果坦克是長方形,需要判斷橫向縱向兩個方向子彈與坦克坐標比對)
						if(q.leiX!=0 && q.leiX!=2 ){//0不可穿墻不可擊碎可穿子彈,1不可穿墻不可擊碎不可穿子彈,2可穿墻不可擊碎可穿子彈,35不可穿墻可擊碎不可穿子彈 4可穿墻不可擊碎不可穿子彈
							dd.zdxs=false;//子彈消失
							if(q.leiX==3 || q.leiX==5) {
								q.qxs=false;
								JiLu.wq.remove(q);
								Music qs=new Music(".//YinXiao/qiangsui.wav");//爆炸音樂
								qs.start();
								if(mt.TankXs && mt.Zuangt!=6 && q.leiX==5 && mt.Xuel>1) {
									mt.Xuel=1;
								}
							}
						}
					}
				}	
				if(dd.x>=mt.X-6 && dd.x<=mt.X+53 && dd.y>=mt.Y-6 && dd.y<=mt.Y+53 && dd.zdxs) {//如果坦克是長方形,需要判斷橫向縱向兩個方向子彈與坦克坐標比對)				
					if(mt.TankXs) {
						if(mt.Zuangt!=6) {
							Bjz();//被擊中
							if(fyzt==1 || fyzt==3) {
								jzzt(leiX);//賦予擊中狀態	
							}
						}	
						dd.zdxs=false;//消失擊中我的電腦坦克子彈
					}
				}			
			}	
		}
    }
	public void Bjz() {//我的坦克被擊中
		if(mt.Xuel>1) {
			mt.Xuel--;
			Music bd=new Music(".//YinXiao/wobeida.wav");
			bd.start();				
		}else {
			mt.Xuel=0;
			mt.Zuangt=7;//戰敗,
			mt.ShiJ=0;
			mt.TankXs=false;
			Music wz=new Music(".//YinXiao/wozha.wav");//爆炸音樂
			wz.start();
		}
	}
	
	public void jzzt(int lex) {//被電腦坦克擊中進入狀態
		int s=0;
		if(lex>9) {
			s=new Random().nextInt(10);//被boss擊中不良狀態幾率
		}else if(lex>0){
			s=new Random().nextInt(30);//被普通坦克擊中不良狀態幾率
		}
		if(s==0 && mt.TankXs && mt.Zuangt==0 ) {
			mt.ShiJ=150;//3秒狀態
			mt.Zuangt=new Random().nextInt(5)+1;//隨機獲得狀態
			Music wt=new Music(".//YinXiao/wozhongte.wav");//射擊音效
			wt.start();			
		}	
	}
	
	public void Fszd() {
		int n;
		Random a=new Random();//此類的實體用于生成偽亂數流
		if(this.leiX>9) {
			n=a.nextInt(6)+1;//	BOSS子彈隨機個數
		}else {
			n=a.nextInt(this.leiX)+1;//普通坦克子彈隨機個數
		}
		for(int i=1;i<n+1;i++) {//生成子彈
			int [][] zzd= {{X+23*i,Y-27},{X+77,Y+22*i},{X+23*i,Y+77},{X-27,Y+22*i}};
	        zd=new ZiDan(zzd[FangX-1][0],zzd[FangX-1][1],FangX);
	        if(Zuangt==2) {//
	        	zd.suDu=3;//1減速,2慢射 3定身  4禁彈 5封禁
	        }else {
	        	zd.suDu=this.ZdSd;//子彈速度
	        }
	        if(this.leiX>9 && a.nextInt(50)==0) {//boss生成追蹤彈幾率
	        	zd.Lei=2;
	        }
	        zdlf.add(zd);
	        Thread t=new Thread(zd);//子彈物件添加到執行緒(不能用上面zd物件呼叫start方法,把介面類創建物件作為引數加到thread物件中)
	        t.start();//啟動子彈位置改變執行緒
		}
	}
}


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/395250.html

標籤:其他

上一篇:自動尋路之A星演算法+Qt開發圖形界面

下一篇:從寫作到演講,蝦米君不斷嘗試的 2021|年侄訓顧

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more