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

📄 ai.h

📁 gamecode 很不错的小游戏源代码
💻 H
字号:
//*********************************************************
//电脑购买、存钱策略
//作者:雷雨、曾铮
//时间:2004年6月
//说明:电脑在商店、银行进行合理的操作选择
//*********************************************************
#ifndef AI_h_
#define AI_h_

int  East = 3;
int	 West = 1;
int	 North = 0;
int	 South = 2;
int	 NoOwner = 0;
int	 IsMine = 1;
int	 NotMine = -1;

int	 Nothing = 0;
int	 IsBank	= 1;
int	 IsShop	= 2;
int	 IsFactory = 3;
int	 IsHouse = 4;
int	 IsSmallHouse = 5;
int	 IsBigHouse	= 6;

extern int RoadState(int i,int j,int& isMine,const int index);

//Turtle,Stop,Purchase,Pass,RemoteControl,Car,Governor
extern bool HasTurtle(int index);

extern bool HasStop(int index);

extern bool HasPurchase(int index);

extern bool HasPass(int index);

extern bool HasRemoteControl(int index);

extern bool HasCar(int index);

extern bool IsRoad(int i,int j);

extern long getfactorycost(int kind);

//不能实例化
class ComputerAI
{
private: 
	//物价系数
	 int Index;
	 int HousePurchasePrice ;
	 int HouseLevelUpPrice ;
	 int FactoryAvgPrice;
public:
	ComputerAI()
	{
		Index = 1;//用于以后版本扩展
		HousePurchasePrice = 10;
		HouseLevelUpPrice = 50;
		FactoryAvgPrice = 250;
	}
	//每次走之前调用(调用)
public :
	int UseToolOrCardBefore(const int i,const int j,int oldDir,int currentMoney,int index,int& steps)
	{
		//1.是否使用收购卡2.是否使用停留卡,3.是否使用乌龟卡,4.是否使用遥控色子,.
		//5.是否使用高级汽车,6.是否使用通行证,0:什么都不用
		//先确定是否有银行或商店或
/*		if(IfUsePurchaseCard(i,j,oldDir,currentMoney,index))
		{
			return 1;
		}
*/
		int step=0;
		step = IfUseRemoteControl(i,j,oldDir,currentMoney,index);
		if(step != 0)
		{
			steps = step;
			return 4;
		}
		if(IfUseStopCard(i,j,oldDir,currentMoney,index))
		{
			return 2;
		}
		if(IfUseTurtleCard(i,j,oldDir,currentMoney,index))
		{
			return 3;
		}
		if(IfUseCar(i,j,oldDir,currentMoney,index))
		{
			return 5;
		}
		return 0;
	}

	//如果返回值为负,表示存钱,如果为正,表示取钱,为0,表示离开未做任何操作
	int BankOperation(long currentMoney,long bankMoney)
	{
		//if less money,load all from bank
		if((currentMoney+bankMoney) <= 200)
		{
			int i = bankMoney;
			return i;
		}
		//if currentmoney < all money * 25 %,get bankmoney's 30%
		else if(currentMoney <= (currentMoney+bankMoney)*3/10)
		{
			int i=bankMoney*30/100;
			return i;
		}
		//if more money ,save it in bank
		else if(currentMoney >= (currentMoney+bankMoney)*70/100)
		{
			int i=currentMoney*30/-100;
			return i;
		}
		//left else
		else
		{
			return 0;
		}
		return 0;
	}
/*	void ShopOperation()
	{
		//如果停留处是商店(只买不卖)
		//先买没有的卡片,次序为:收购卡 > 遥控色子 〉其他(在有Money和Exp情况下)
		//如果都有了,就不买了
		//if()
	}
	void FactoryOperation()
	{
		//如果停留处是工厂,且:(总金钱 >= 2 * 购价),且:(现金 >= 购价),则购买之			
	}
	void HouseOperation()
	{
		//如果停留处是房地,且:(总金钱 >= 2 * 购价),且:(现金 >= 购价),则购买之
	}
	 void HouseLevelUpOperation()
	{
		//如果停留处是待升级的房子,且:(总金钱 >= 1.5 * 升级价),且:(现金 >= 1.5 * 升级价),则升级之
	}
*/
	
	//别的玩家的房子数(6步以内)
	int EnemyHouseNumber(int i,int j,int oldDir,int index)
	{
		int x = i;
		int y = j;
		int dir = oldDir;
		int isMine = 0;
		int enemyHouseNumber=0;
		int count = 0;
		while(GetNextPos(x,y,dir))
		{
			isMine = 0;
			count++;
			if(count >= 7)
			{
				break;
			}
			if(RoadState(x,y,isMine,index) == IsHouse)
			{
				if(isMine == NotMine)
				{
					enemyHouseNumber++;
				}
			}
			
		}
		return enemyHouseNumber;
	}
	//有无空的工厂,返回有时所须的步数或0(6步以内)
	int HasFactory(int i,int j,int oldDir,int index)
	{
		int x = i;
		int y = j;
		int dir = oldDir;
		int isMine = 0;
		int count = 0;
		while(GetNextPos(x,y,dir))
		{
		//	isMine = 0;
			count++;
			if(count >= 7)
			{
				break;
			}
			if(RoadState(x,y,isMine,index) == IsFactory)
			{
				if(isMine == NoOwner)
				{
					return count;
				}
			}
		}
		return 0;
	}
	//有无银行,返回有时所须的步数或0(6步以内)
	int HasBank(int i,int j,int oldDir,int index)
	{
		int x = i;
		int y = j;
		int dir = oldDir;
		int isMine = 0;
		int count = 0;
		while(GetNextPos(x,y,dir))
		{
			isMine = 0;
			count++;
			if(count >= 7)
			{
				break;
			}
			if(RoadState(x,y,isMine,index) == IsBank)
			{
				return count;
			}
		}
		return 0;
	}
	//有无自己的小房子,返回有时所须的步数或0(6步以内)
	int HasSmallHouse(int i,int j,int oldDir,int index)
	{
		int x = i;
		int y = j;
		int dir = oldDir;
		int isMine = 0;
		int count = 0;
		while(GetNextPos(x,y,dir))
		{
		//	isMine = 0;
			count++;
			if(count >= 7)
			{
				break;
			}
			if(RoadState(x,y,isMine,index) == IsSmallHouse)
			{
				if(isMine == IsMine)
				{
					return count;
				}
			}
		}
		return 0;
	}
	int HasHouse(int i,int j,int oldDir,int index)
	{
		int x = i;
		int y = j;
		int dir = oldDir;
		int isMine = 0;
		int count = 0;
		while(GetNextPos(x,y,dir))
		{
			count++;
			if(count >= 7)
			{
				break;
			}
			if(RoadState(x,y,isMine,index) == IsHouse)
			{
				if(isMine == NoOwner)
				{
					return count;
					break;
				}
			}
		}
		return 0;
	}
	//下面7个函数包括是否使用卡片或道具,以及怎样使用
	//(note:如果没有该种卡片或道具,则无法使用,直接返回false)
	
	//judge to use stop
	bool IfUseStopCard(int i,int j,int oldDir,int currentMoney,int index)
	{
		if(!HasStop(index))
		{
			return false;
		}
		int isMine = 0;
		if(RoadState(i,j,isMine,index) == IsSmallHouse)
		{
			if(isMine == IsMine && currentMoney >= 100 * Index)
			{
				return true;
			}
		}
		return false;
	}
	//judge to use turtle
	bool IfUseTurtleCard(int i,int j,int oldDir,int currentMoney,int index)
	{
		if(!HasTurtle(index))
		{
			return false;
		}
		int x = i;//???????
		int y = j;
		int dir = oldDir;
		int steps = 0;
		int isMine = 0;
		if(GetNextPos( x,y,dir))
		{
			isMine = 0;
			
			int state = RoadState(x,y, isMine,index);
			if(state == IsSmallHouse
				&& isMine == IsMine
				&& currentMoney >= HouseLevelUpPrice * Index)
			{
				steps++;
			}
			else if(state == IsHouse
				&& isMine == IsMine
				&& currentMoney >= HousePurchasePrice * Index)
			{
				steps++;
			}
			else if(state == IsFactory
				&& isMine == NoOwner
				&& currentMoney >= FactoryAvgPrice * Index)
			{
				steps++;
			}
		}
		if(steps >= 1 )
		{
			return true;
		}
		return false;
	}
	//judge to use purchase
	bool IfUsePurchaseCard(int i,int j,int oldDir,int currentMoney,int index)
	{
		if(HasPurchase(index)
			&& currentMoney >= FactoryAvgPrice * Index)
		{
			return true;
		}
		return false;
	}
	bool IfUsePassCard(int i,int j,int oldDir,int currentMoney,int index)
	{//EnemyHouseNumber
		if(!HasPass(index))
		{
			return false;
		}
		if(EnemyHouseNumber(i,j,oldDir,index) >= 3
			&& currentMoney <= 100 * Index)
		{
			return true;
		}
		return false;
	}
	//??????????????
	int IfUseRemoteControl(int i,int j,int oldDir,int currentMoney,int index)
	{
		if(!HasRemoteControl(index))
		{
			return 0;
		}
		//test:
		int step=0;
		step = HasFactory(i,j,oldDir,index);
		if(step != 0)
		{
			return step;
		}

/*		step = HasHouse(i,j,oldDir,index);
		if(step != 0)
		{
			return step;
		}
		step = HasSmallHouse(i,j,oldDir,index);
		if(step != 0)
		//	&& currentMoney >= FactoryAvgPrice * Index)
		{
			return step;
		}
		step = HasBank(i,j,oldDir,index);
		if(step != 0
			&& currentMoney <= 50 * Index)
		{
			return step;
		}
*/
		return 0;
	}
	bool IfUseCar(int i,int j,int oldDir,int currentMoney,int index)
	{
		if(!HasCar(index))
		{
			return false;
		}
		if(EnemyHouseNumber(i,j,oldDir,index) >= 3
			&& currentMoney <= 100 * Index)
		{
			return true;
		}
		return false;
	}
	//返回可确定行走的最大步数
	int GetMaxCertainSteps(int i,int j,int oldDir)
	{
		int x = i;
		int y = j;
		int steps = 0;
		int dir = oldDir;
		while(GetNextPos( x, y,dir))
		{
			steps++;
			if(steps == 12)
			{
				break;
			}
		}
		return steps;
	}
	//返回下一步的确定行走路
	bool GetNextPos(int& x,int& y,int& oldDir)
	{
		int roads = 0;//可行走的路线
		if(IsRoad(x - 1,y))
		{
			roads++;
		}
		if(IsRoad(x + 1,y))
		{
			roads++;
		}
		if(IsRoad(x,y - 1))
		{
			roads++;
		}
		if(IsRoad(x,y + 1))
		{
			roads++;
		}
		if(roads == 1)
		{
			GetOnlyWay(x,y,oldDir);
			return true;
		}
		else if(roads == 2)
		{
			GetNextCertainStepPos(x,y,oldDir);
			return true;
		}
		else
		{
			return false;
		}
	}
	//如果只有1条路,返回相反的路
	void GetOnlyWay(int& i,int& j,int& oldDir)
	{
		if(IsRoad(i - 1,j))
		{
			i = i - 1;
			oldDir = East;
			return;
		}
		if(IsRoad(i + 1,j))
		{
			i = i + 1;
			oldDir = West;
			return;
		}
		if(IsRoad(i,j - 1))
		{
			j = j - 1;
			oldDir = North;
			return;
		}
		if(IsRoad(i,j + 1))
		{
			j = j + 1;
			oldDir = South;
			return;
		}
	}
	//如果有2条路,返回前方的那条
	void GetNextCertainStepPos(int& i,int& j,int& oldDir)
	{
		switch (oldDir)
		{
		case 1:
			if(IsRoad(i - 1,j))
			{
				i = i - 1;
				return;
			}
			break;
		case 3:
			if(IsRoad(i + 1,j))
			{
				i = i + 1;
				return;
			}
			break;
		case 2:
			if(IsRoad(i,j - 1))
			{
				j = j - 1;
				return;
			}
			break;
		case 0:
			if(IsRoad(i,j + 1))
			{
				j = j + 1;
				return;
			}
			break;
		}
		if(IsRoad(i - 1,j) && oldDir!=East)
		{
			i = i - 1;
			oldDir = West;			
			return;
		}
		if(IsRoad(i + 1,j)  && oldDir!=West)
		{
			i = i + 1;			
			oldDir = East;			
			return;
		}
		if(IsRoad(i,j - 1)  && oldDir!=South)
		{
			j = j - 1;			
			oldDir = North;
			return;			
		}
		if(IsRoad(i,j + 1)  && oldDir!=North)
		{
			j = j + 1;			
			oldDir = South;			
			return;
		}
	}
};

#endif

⌨️ 快捷键说明

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