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

📄 antinitial.c

📁 根据觅食规则
💻 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 + -