📄 antinitial.c
字号:
void AntInitial(void)
initial ant[AntNow]
{
int randnum;
int i;
ant[AntNow].xxx = home.xxx;
ant[AntNow].yyy = home.yyy;
randnum = random(100);
if(randnum25) ant[AntNow].dir = UP;
else if (randnum=25&&randnum50) ant[AntNow].dir = DOWN;
else if (randnum=50&&randnum75) ant[AntNow].dir = LEFT;
else ant[AntNow].dir = RIGHT;
ant[AntNow].speed = 2(random(INI_SPEED2)+1);
ant[AntNow].SpeedTimer = 0;
ant[AntNow].food = 0;
ant[AntNow].SmellAmount[SMELL_TYPE_FOOD] = 0;
ant[AntNow].SmellAmount[SMELL_TYPE_HOME] = MAX_SMELL;
ant[AntNow].IQ = 1;
for(i=0;iTRACE_REMEMBER;i++)
{
ant[AntNow].tracex[i] = 0;
ant[AntNow].tracey[i] = 0;
}
ant[AntNow].TracePtr = 0;
a sepecail ant
if(AntNow==0) ant[AntNow].speed = INI_SPEED;
}
void WorldChange(void)
{
int k,i,j;
int smelldisp;
SmellGoneTimer+=timer10ms;
if(SmellGoneTimer=SMELL_GONE_SPEED)
{
SmellGoneTimer = 0;
for(k=0;k=1;k++)
SMELL TYPE FOOD and HOME
for(i=1;i=MAXX;i++)
for(j=1;j=MAXY;j++)
{
if(Smell[k][i][j])
{
smelldisp = 1+((10Smell[k][i][j])(MAX_SMELLSMELL_DROP_RATE));
if(smelldisp=30000smelldisp0) smelldisp = 30000;
if(SmellDispFlag)
{
gotoxy(i,j);
if((i==food.xxx&&j==food.yyy)(i==home.xxx&&j==home.yyy))
don't over write Food and Home ;
else
{
if(smelldisp9) putch('#');
else putch(smelldisp+'0');
}
}
Smell[k][i][j]-= 1+(Smell[k][i][j]SMELL_GONE_RATE);
if(Smell[k][i][j]0) Smell[k][i][j] = 0;
if(SmellDispFlag)
{
if(Smell[k][i][j]=2)
{
gotoxy(i,j);
putch(SPACE);
}
}
}
} of one location
} of time to change the world
} of world change
void AntMove(void)
{
int antx,anty;
int smelltodrop,smellnow;
for(AntNow=0;AntNowMAX_ANT;AntNow++)
{
ant[AntNow].SpeedTimer+=timer10ms;
if(ant[AntNow].SpeedTimer=ant[AntNow].speed)
{
ant[AntNow].SpeedTimer = 0;
gotoxy(ant[AntNow].xxx,ant[AntNow].yyy);
putch(SPACE);
AntOneStep();
gotoxy(ant[AntNow].xxx,ant[AntNow].yyy);
ant0 is a sepecail ant, use different color
if(AntNow==0) textcolor(0xd);
if(ant[AntNow].food) putch(ANT_CHAR_FOOD);
else putch(ANT_CHAR_EMPTY);
if(AntNow==0) textcolor(0x7);
remember trace
ant[AntNow].tracex[ant[AntNow].TracePtr] = ant[AntNow].xxx;
ant[AntNow].tracey[ant[AntNow].TracePtr] = ant[AntNow].yyy;
if(++(ant[AntNow].TracePtr)=TRACE_REMEMBER) ant[AntNow].TracePtr = 0;
drop smell
antx = ant[AntNow].xxx;
anty = ant[AntNow].yyy;
if(ant[AntNow].food)
have food, looking for home
{
if(ant[AntNow].SmellAmount[SMELL_TYPE_FOOD])
{
smellnow = Smell[SMELL_TYPE_FOOD][antx][anty];
smelltodrop = ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]SMELL_DROP_RATE;
if(smelltodropsmellnow) Smell[SMELL_TYPE_FOOD][antx][anty] = smelltodrop;
else Smell[...] = smellnow
ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]-= smelltodrop;
if(ant[AntNow].SmellAmount[SMELL_TYPE_FOOD]0) ant[AntNow].SmellAmount[SMELL_TYPE_FOOD] = 0;
} of have smell to drop
} of have food
else
no food, looking for food
{
if(ant[AntNow].SmellAmount[SMELL_TYPE_HOME])
{
smellnow = Smell[SMELL_TYPE_HOME][antx][anty];
smelltodrop = ant[AntNow].SmellAmount[SMELL_TYPE_HOME]SMELL_DROP_RATE;
if(smelltodropsmellnow) Smell[SMELL_TYPE_HOME][antx][anty] = smelltodrop;
else Smell[...] = smellnow
ant[AntNow].SmellAmount[SMELL_TYPE_HOME]-= smelltodrop;
if(ant[AntNow].SmellAmount[SMELL_TYPE_HOME]0) ant[AntNow].SmellAmount[SMELL_TYPE_HOME] = 0;
} of have smell to drop
}
} of time to go
else not go
} of for AntNow
textcolor(FOOD_HOME_COLOR);
gotoxy(home.xxx,home.yyy); putch(HOME_CHAR);
gotoxy(food.xxx,food.yyy);
if(food.amount0) putch(FOOD_CHAR);
else putch(FOOD_CHAR2);
textcolor(7);
gotoxy(1,MAXY+1);
printf(Food %d, Home %d ,food.amount,home.amount);
}
void AntOneStep(void)
{
int ddir,tttx,ttty;
int i;
ddir = ant[AntNow].dir;
tttx = ant[AntNow].xxx;
ttty = ant[AntNow].yyy;
ddir = AntNextDir(tttx,ttty,ddir);
switch(ddir)
{
case UP ttty--;
break;
case DOWN ttty++;
break;
case LEFT tttx--;
break;
case RIGHT tttx++;
break;
default break;
} of switch dir
ant[AntNow].dir = ddir;
ant[AntNow].xxx = tttx;
ant[AntNow].yyy = ttty;
if(ant[AntNow].food)
this ant carry with food, search for home
{
if(tttx==home.xxx&&ttty==home.yyy)
{
home.amount++;
AntInitial();
}
if(tttx==food.xxx&&ttty==food.yyy)
ant[AntNow].SmellAmount[SMELL_TYPE_FOOD] = MAX_SMELL;
} of search for home
else
this ant is empty, search for food
{
if(tttx==food.xxx&&ttty==food.yyy)
{
if(food.amount0)
{
ant[AntNow].food = 1;
food.amount--;
ant[AntNow].SmellAmount[SMELL_TYPE_FOOD] = MAX_SMELL;
ant[AntNow].SmellAmount[SMELL_TYPE_HOME] = 0;
ant[AntNow].dir = TurnBack(ant[AntNow].dir);
for(i=0;iTRACE_REMEMBER;i++)
{
ant[AntNow].tracex[i] = 0;
ant[AntNow].tracey[i] = 0;
}
ant[AntNow].TracePtr = 0;
CanFindFood = 1;
} of still have food
}
if(tttx==home.xxx&&ttty==home.yyy)
ant[AntNow].SmellAmount[SMELL_TYPE_HOME] = MAX_SMELL;
} of search for food
}
void DealKey(char key)
{
int i;
switch(key)
{
case 'p' gettime(&endtime);
DispPlayTime();
getch();
gotoxy(1,MAXY+1);
for(i=1;i=MAXX-1;i++) putch(SPACE);
break;
case 't' if(SmellDispFlag)
{
SmellDispFlag=0;
ClearSmellDisp();
}
else SmellDispFlag = 1;
break;
case '1' DispSmell(SMELL_TYPE_FOOD);
getch();
ClearSmellDisp();
break;
case '2' DispSmell(SMELL_TYPE_HOME);
getch();
ClearSmellDisp();
break;
case '3' DispSmell(2);
getch();
ClearSmellDisp();
break;
case 's' SaveBlock();
break;
case 'l' LoadBlock();
break;
default gotoxy(1,MAXY+1);
for(i=1;i=MAXX-1;i++) putch(SPACE);
} of switch
}
void ClearSmellDisp(void)
{
int k,i,j;
for(k=0;k=1;k++)
SMELL TYPE FOOD and HOME
for(i=1;i=MAXX;i++)
for(j=1;j=MAXY;j++)
{
if(Smell[k][i][j])
{
gotoxy(i,j);
putch(SPACE);
}
} of one location
}
void DispSmell(int type)
input 0 -- Only display food smell
1 -- Only display home smell
2 -- Display both food and home smell
{
int k,i,j;
int fromk,tok;
int smelldisp;
switch(type)
{
case 0 fromk = 0;
tok = 0;
break;
case 1 fromk = 1;
tok = 1;
break;
case 2 fromk = 0;
tok = 1;
break;
defaultfromk = 0;
tok = 1;
break;
}
SmellGoneTimer = 0;
for(k=fromk;k=tok;k++)
SMELL TYPE FOOD and HOME
for(i=1;i=MAXX;i++)
for(j=1;j=MAXY;j++)
{
if(Smell[k][i][j])
{
smelldisp = 1+((10Smell[k][i][j])(MAX_SMELLSMELL_DROP_RATE));
if(smelldisp=30000smelldisp0) smelldisp = 30000;
gotoxy(i,j);
if(i!=food.xxxj!=food.yyy)
{
if((i==food.xxx&&j==food.yyy)(i==home.xxx&&j==home.yyy))
don't over write Food and Home ;
else
{
if(smelldisp9) putch('#');
else putch(smelldisp+'0');
}
}
}
} of one location
}
int AntNextDir(int xxx,int yyy,int ddir)
{
int randnum;
int testdir;
int CanGoState;
int cangof,cangol,cangor;
int msf,msl,msr,maxms;
int type;
CanGoState = CanGo(xxx,yyy,ddir);
if(CanGoState==0CanGoState==2CanGoState==3CanGoState==6) cangof = 1;
else cangof = 0;
if(CanGoState==0CanGoState==1CanGoState==3CanGoState==5) cangol = 1;
else cangol = 0;
if(CanGoState==0CanGoState==1CanGoState==2CanGoState==4) cangor = 1;
else cangor = 0;
if(ant[AntNow].food) type = SMELL_TYPE_HOME;
else type = SMELL_TYPE_FOOD;
msf = GetMaxSmell(type,xxx,yyy,ddir);
msl = GetMaxSmell(type,xxx,yyy,TurnLeft(ddir));
msr= GetMaxSmell(type,xxx,yyy,TurnRight(ddir));
maxms = MaxLocation(msf,msl,msr);
maxms - 1 - msf is MAX
2 - msl is MAX
3 - msr is MAX
0 - all 3 number is 0
testdir = NULL;
switch(maxms)
{
case 0 all is 0, keep testdir = NULL, random select dir
break;
case 1 if(cangof)
testdir = ddir;
else
if(mslmsr) if(cangol) testdir = TurnLeft(ddir);
else if(cangor) testdir = TurnRight(ddir);
break;
case 2 if(cangol)
testdir = TurnLeft(ddir);
else
if(msfmsr) if(cangof) testdir = ddir;
else if(cangor) testdir = TurnRight(ddir);
break;
case 3 if(cangor)
testdir = TurnRight(ddir);
else
if(msfmsl) if(cangof) testdir =ddir;
else if(cangol) testdir = TurnLeft(ddir);
break;
defaultbreak;
} of maxms
randnum = random(1000);
if(randnumSMELL_DROP_RATE1000testdir==NULL)
1. if testdir = NULL, means can not find the max smell or the dir to max smell can not go
then random select dir
2. if ant error, don't follow the smell, random select dir
{
randnum = random(100);
switch(CanGoState)
{
case 0 if(randnum90) testdir = ddir;
else if (randnum=90&&randnum95) testdir = TurnLeft(ddir);
else testdir = TurnRight(ddir);
break;
case 1 if(randnum50) testdir = TurnLeft(ddir);
else testdir = TurnRight(ddir);
break;
case 2 if(randnum90) testdir = ddir;
else testdir = TurnRight(ddir);
break;
case 3 if(randnum90) testdir = ddir;
else testdir = TurnLeft(ddir);
break;
case 4 testdir = TurnRight(ddir);
break;
case 5 testdir = TurnLeft(ddir);
break;
case 6 testdir = ddir;
break;
case 7 testdir = TurnBack(ddir);
break;
defaulttestdir = TurnBack(ddir);
} of can go state
}
return(testdir);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -