⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 npcai.java

📁 小游戏--淘金者 主要用到了双缓冲平面作图
💻 JAVA
字号:
/**
 *	怪物AI类
 *	实现怪物AI
 **/
package bin;
 
 
public class NpcAI implements Runnable
{
	//	声明变量
	int gameBoyX, gameBoyY;
	int npcX, npcY;
	String switchImage;
	Thread thr;
	Gameboy game;
	int over = 0;
	
	/**
	 *	获得玩家、怪物的坐标和怪物的左右图片的控制变量char变量swithImage
	 **/
	public NpcAI(Gameboy game)
	{
		//把获得的参数付给本类变量
		this.game = game;
		
		thr = new Thread(this);
		thr.start();
		
		
		//调用下面的判断方法,把玩家坐标和怪物坐标传给判断方法
		//judge(gameBoyX, gameBoyY, npcX, npcY);
	}
	
	public void run()
	{
		while (true)
		{
			this.gameBoyX    = game.GameboyX;
			this.gameBoyY    = game.GameboyY;
			try
			{
				thr.sleep(100);
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			judge(gameBoyX, gameBoyY, npcX, npcY);
		}
	}
		
	/**
	 *	判断玩家坐标和怪物坐标的差别
	 **/
	public void judge(int gameBoyX, int gameBoyY, int npcX, int npcY)
	{
		//临时变量,用于接收怪物和玩家相遇的返回值
		boolean  temp = false;
		
		/**
		 *	分别判断玩家坐标的X和怪物坐标的X,玩家坐标的Y和怪物坐标的Y的大小比,然后进入不同的移动方法。
		 *	路线方法返回值付给临时变量temp,由temp来判断是否相遇。true = 相遇,false = 没有相遇
		 **/
		if (npcX < gameBoyX && npcY < gameBoyY)
		{
			//判断之后,把坐标作为参数传给移动方法,以下同这个,只是路线不同
			move1(gameBoyX, gameBoyY, npcX, npcY);
		}
		else if (npcX < gameBoyX && npcY == gameBoyY)
		{
			move2(gameBoyX, gameBoyY, npcX, npcY);
		}
		else if (npcX < gameBoyX && npcY > gameBoyY)
		{
			move3(gameBoyX, gameBoyY, npcX, npcY);
		}
		else if (npcX > gameBoyX && npcY < gameBoyY)
		{
			move4(gameBoyX, gameBoyY, npcX, npcY);
		}
		else if (npcX > gameBoyX && npcY == gameBoyY)
		{
			move5(gameBoyX, gameBoyY, npcX, npcY);
		}
		else if (npcX > gameBoyX && npcY > gameBoyY)
		{
			move6(gameBoyX, gameBoyY, npcX, npcY);
		}
		else if (npcX == gameBoyX && npcY < gameBoyY)
		{
			move7(gameBoyX, gameBoyY, npcX, npcY);
		}
		else if (npcX == gameBoyX && npcY > gameBoyY)
		{
			move8(gameBoyX, gameBoyY, npcX, npcY);
		}
		else if (npcX == gameBoyX && npcY == gameBoyY)
		{
			temp = true;
		}
		else
		{
			temp = false;
		}
		
		//如果临时变量temp为ture,证明玩家和怪物相遇,就调用give()
		if(temp == true)
		{
			give();
		}	
	}
	
	/**
	 *	实现怪物到玩家的基本路线 move1 - move8
	 **/
	public void move1(int gameBoyX, int gameBoyY, int npcx, int npcy)
	{
		//向右移动的图片标识
		switchImage = "Right";

		//怪物路线循环体
		//先移动怪物的X坐标点,直到达到玩家的X坐标点
		for (int k = npcX; k <= gameBoyX;k = k + 20)
		{
			//k的值最后就是玩家的X坐标
			npcX = k;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
				
		}
		//再移动怪物的Y坐标点,这时怪物的X坐标就为玩家的X坐标,直到达到玩家的Y坐标点
		//这样的话,怪物就移动到了玩家的坐标
		for (int l = npcY; l <= gameBoyY; l = l + 24)
		{
			//l的值最后也就是玩家的Y坐标
			npcY = l;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
	}
	
	/**
	 *	怪物移动路线都差不多,主要是判断完后,X和Y,哪个少了就+,哪个多了就-,相等不就变
	 **/
	public void move2(int gameBoyX, int gameBoyY, int npcx, int npcy)
	{
		//向右移动的图片标识
		switchImage = "Right";
		
		//因为玩家的Y坐标点和怪物的Y坐标点是相等的,所以之移动怪物的X坐标
		for (int k = npcX; k <= gameBoyX; k = k + 20)
		{
			npcX = k;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
	}
	
	public void move3(int gameBoyX, int gameBoyY, int npcx, int npcy)
	{
		//向右移动的图片标识
		switchImage = "Right";
		
		for (int k = npcX; k <= gameBoyX; k = k + 20)
		{
			npcX = k;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
		for (int l = npcY; l >= gameBoyY; l = l - 24)
		{
			npcY = l;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
	}
	
	public void move4(int gameBoyX, int gameBoyY, int npcx, int npcy)
	{
		//向左移动的图片标识
		switchImage = "Left";
			
		for (int k = npcX; k >= gameBoyX; k = k - 20)
		{	
			npcX = k;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
		for (int l = npcY; l <= gameBoyY; l = l + 24)
		{
			npcY = l;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
	}
	
	public void move5(int gameBoyX, int gameBoyY, int npcx, int npcy)
	{
		//向左移动的图片标识
		switchImage = "Left";
		
		for (int k = npcX; k >= gameBoyX; k = k -20)
		{
			npcX = k;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
	}
	
	public void move6(int gameBoyX, int gameBoyY, int npcx, int npcy)
	{
		//向左移动的图片标识
		switchImage = "Left";
		
		for (int k = npcX; k >= gameBoyX; k = k - 20)
		{
			npcX = k;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
		for (int l = npcY; l >= gameBoyY; l = l - 24)
		{
			npcY = l;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
	}
	
	public void move7(int gameBoyX, int gameBoyY, int npcx, int npcy)
	{
		//向右移动的图片标识
		switchImage = "Right";
		
		for (int k = npcY; k <= gameBoyY; k = k + 24)
		{
			npcY = k;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
	}
	
	public void move8(int gameBoyX, int gameBoyY, int npcx, int npcy)
	{
		//向左移动的图片标识
		switchImage = "Left";
		
		for (int k = npcY; k >= gameBoyY; k = k - 24)
		{
			npcY = k;

			try
			{
				Thread.sleep(250);
			}
			catch(Exception e)
			{
				e.getMessage();
			}
		}
	}
	
	/**
	 *	玩家和怪物相遇后,调用此方法,返回true,让玩家类处理
	 **/
	public boolean give()
	{
		over = 1;
		npcX = 0;
		npcY = 0;
		return true;
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -