📄 ai.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 + -