Организатор конкурса - Форум программистов programmersforum.ru

20 Май 2010 | Автор: admin

В этой небольшой статье напишем бота который будет противостоять «рашу». Бота будем писать для демонстрации того что баланс игры теперь в норме, и тупой «раш» не прокатит. Будем писать на С++.

Что же нам будет нужно? Нам надо всего лишь 8 проектов
1. Нам нужен проект восстановления щита чтобы исключить возможность применения проекта (27) СпецАтака 5. Me 3, El 4 : Если вражеский щит равен 0, то Base-11, для восстановления щита будет пользоваться проектом (15) Ремонт 1. En 5 : SS+7
2. Чтобы восстанавливать базу будем пользоваться проектом (20) Ремонт 6. Me 8, El 5 : SB+12

3. Проекты 41 и 42 для похищения ресурсов в начале игры чтобы лишить «рашера» ресурсов. 42 менее важен
4. Проекты развития 33, 34, 35
5. Самый сильный проект атаки (14) Атака2 5. En 6, Me 12, El 3 : ->18. Так как «рашер» почти не чинится, то суть стратегии заключается в применении проекта номер 14 4-5 раз.
6. И напоследок 46 проект, но он не так важен
Остальные проекты могут быть любые, они всё равно не будут применяться.

В функции StartGame ничего нового


const int Projects[MaxProjectsToPlayer] = {5, 6, 8, 11, 14, 15, 18, 20, 28, 33, 34, 35, 41, 42, 46};

DLL_EXPORT int __stdcall StartGame(int aPlayerNumber, PAvailProjects aAvailProjects, PAdditionalGameInfo AGI)
{
    if (!aAvailProjects) return 0;
    for (int i=0; i

Итак, в первую очередь проекты починки и проекты похищения ресурсов


    if ((IsProjectAvail(20,aAvailProjects)) and
       (aGame[aPlayerNumber].Base+aGame[aPlayerNumber].Shield<20) and
        (AGI->TurnCount>2))
    return 20;

    if ((IsProjectAvail(15,aAvailProjects)) and
        (aGame[aPlayerNumber].Shield<3) and
        (AGI->TurnCount>2))
    return 15;

    if (IsProjectAvail(41,aAvailProjects) and
       (aGame[OPP].Metal>3) and
       (AGI->TurnCount<3))
    return 41;

    if (IsProjectAvail(42,aAvailProjects) and
       (aGame[OPP].Elements>3) and
       (AGI->TurnCount<3))
    return 42;

Главное здесь: не чиниться на первых двух ходах, вместо этого похищать металл, фактически 42 проект никогда не будет применён, но пусть будет условие "на всякий пожарный".
Следующее это развитие базы


    if (IsProjectAvail(34,aAvailProjects) and
       (aGame[aPlayerNumber].Mines<3) and
       (aGame[aPlayerNumber].Base+aGame[aPlayerNumber].Shield>20))
    return 34;

    if (IsProjectAvail(33,aAvailProjects) and
       (aGame[aPlayerNumber].Battery<4) and
       (aGame[aPlayerNumber].Base+aGame[aPlayerNumber].Shield>20))
    return 33;

    if (IsProjectAvail(35,aAvailProjects) and
       (aGame[aPlayerNumber].Labs<3) and
       (aGame[aPlayerNumber].Base+aGame[aPlayerNumber].Shield>20))
    return 35;

    //-----------усиленное развитие базы
    if (IsProjectAvail(34,aAvailProjects) and
       (aGame[aPlayerNumber].Mines<5) and
       (aGame[aPlayerNumber].Base>22))
    return 34;

    if (IsProjectAvail(33,aAvailProjects) and
       (aGame[aPlayerNumber].Battery<6) and
       (aGame[aPlayerNumber].Base>22))
    return 33;

    if (IsProjectAvail(35,aAvailProjects) and
       (aGame[aPlayerNumber].Labs<4) and
       (aGame[aPlayerNumber].Base>22))
    return 35;
    //-----------------------------

Следует отметить что развитие базы и усиленное развитие базы идёт даже не при очень хорошем состоянии базы, главное чтобы оно не было критическим (больше 20 единиц).
Ну и последний штрих это два проекта 46 и 14.


    if (IsProjectAvail(46,aAvailProjects) and
       (aGame[OPP].Shield>5))
    return 46;

    if (IsProjectAvail(14,aAvailProjects)) return 14;

    int res;
    do
    {
        res=aAvailProjects[rand()%10];
    } while (res==0);
    return res;
}

Далее на рисунке результат игры SimpleBot v1.3 против Alar_v55. Результат на лицо - 100% побед
SimpleBot v1.3 против Alar_v55

при помощи всего лишь восьми проектов, и нескольких простых правил бот смог на 100% противостоять "рашу".

Скачать исходники SimpleBot v1.3 AntiRUSH (C++) (CodeBlocks+MinGW)

Комментарии закрыты