Edytor map

Wprowadzenie do programowania

Data publikacji : 05.04.2010
unit AIEarlyDefScoutZerg (int player, unit prev) {
    unit obs;
   
    if (!AIGetFlag(player, e_flagsEarlyDefScout)) {
        return c_nullUnit;
    }
    if (UnitGetType(prev) == c_ZU_Overseer) {
        return prev;
    }
    obs = AIGrabUnit(player, c_ZU_Overseer, c_prioScout, null);
    if (obs) {
        return obs;
    }
    if (UnitGetType(prev) == c_ZU_Zergling) {
        return prev;
    }
    obs = AIGrabUnit(player, c_ZU_Zergling, c_prioScout, null);
    if (obs) {
        return obs;
    }
    if (prev) {
        return prev;
    }
    return AIGrabUnit(player, c_ZU_Drone, c_prioScout, null);
}

Omówienie:

Funkcja opisana poniżej jest częścią AI, pozwala ona na wyznaczenie jednostki do wczesnego zwiadu i jest napisana dla rasy Zergów.

unit AIEarlyDefScoutZerg (int player, unit prev) {

Tutaj mamy początek funkcji, która się nazywa AIEarlyDefScoutZerg, funkcja zwraca wartość typu unit, z tego co można wywnioskować z dalszej części kodu jest to jakiś numer jednej konkretnej jednostki znajdującej się na mapie. Do funkcji można przekazać dwie wartości: player znanego z c++ typu int, oraz prev, typu unit wspomnianego wcześniej. Jak łatwo się domyśleć zmienna player określa nr gracza.

Zmienna prev, może przekazywać sądząc po nazwie, która jest prawdopodobnie skrótem od ang. previous czyli wcześniejszy, przekazuje nr jednostki która uprzednio była wyznaczona, czy wykorzystana do zwiadu.

unit obs;
Deklaracja zmiennej typu unit o nazwie obs.

if (!AIGetFlag(player, e_flagsEarlyDefScout)) {
Instrukcja warunkowa "if" czyli "jeżeli" warunkiem wykonania kodu zawartego pomiędzy klamrami "{ }" jest spełnienie warunku "!AIGetFlag(player, e_flagsEarlyDefScout)". Warunek ten jest zaprzeczeniem funkcji AIGetFlag, funkcja ta zwraca zapewne wartość typu boolean czyli binarną 1 / 0, zaprzeczenie "!" sprawia, że jeżeli funkcja przykładowo zwróci wartość 1 to instrukcja "if" otrzyma wartość 0. Do funkcji AIGetFlag przekazywany jest nr gracza (player) oraz wartość e_flagsEarlyDefScout, która nie mam pojęcia co dokładnie oznacza, ale jest związana ze zwiadem, prawdopodobnie określa czy zwiad został wykonany, albo czy ma być wykonany.

return c_nullUnit;
Jeżeli funkcja AIGetFlag zwróci wartość 0, więc instrokcja "if" otrzyma wartość 1 zostanie wykonane powyższe polecenie. Instrukcja return kończy wykonywanie funkcji i zwraca wartość c_nullUnit. Wynika z tego tyle, że zwiad nie zostanie wykonany.

}
if (UnitGetType(prev) == c_ZU_Overseer) {
Kolejna instrukcja warunkowa, tym razem wywołuje funkcje UnitGetType i przekazuje do niej numer jednostki wprowadzony do funkcji w zmiennej prev. Funkcja UnitGetType jak łatwo się domyśleć zwraca wartość bliżej nieznanego typu, która odpowiada rodzajowi jednostki. Zwrócona wartość jest porównywana z prawdopodobnie stałą c_ZU_Overseer. Jeżeli te dwie wartości są sobie równe, oznacza to, że jednostka o nr prev jest Overseer'em.

return prev;
Kolejna instrukcja kończąca funkcje, tym razem jeżeli instrukcja "if" została spełniona, czyli jednostka o nr prev jest Overseer'em to funkcja zwróci wartość prev. Oznacza to że do zwiadu zostaniewykorzystany Overseer.
}

obs = AIGrabUnit(player, c_ZU_Overseer, c_prioScout, null);
Tutaj do wcześniej zdeklarowanej zmiennej obs zostaje przypisana wartość zwrócona przez funkcję AIGrabUnit. Funkcja ta zwraca nr jednostki znajdującej się na mapie, która należy do gracza o nr player, jest Overseer'em, też jest w jakiś sposób odnajdywana najlepsza do zwiadu jednostka tego typu, prawdopodobnie ta która jest najbliżej bazy wroga (wartość c_prioScout).

if (obs) {
Instrukcja "if" zostanie wykonana gdy wartość obs jest różna od zera, czyli gdy funkcja AIGrabUnit zwróciła nr jednostki. Widać że funkcja AIGrabUnit zwraca wartość 0 gdy nie znajdzie jednostki spełniającej wyżej wymienione warunki.

return obs;
Funkcja główna jest kończona i zwraca wartość obs, czyli gdy zostanie odnaleziony Overseer, to on zostanie wykorzystany do zwiadu.
}

if (UnitGetType(prev) == c_ZU_Zergling) {
return prev;
}
obs = AIGrabUnit(player, c_ZU_Zergling, c_prioScout, null);
if (obs) {
return obs;
}


Dwie powyższe instrukcje warunkowe są analogiczne do wcześniejszych dwóch instrukcji, tym razem dla jednostki typu zergling.

if (prev) {
return prev;
}


Powyższa instrukcja warunkowa sprawdza czy w zmiennej prev został przekazany jakiś nr jednostki, czyli czy prev > 0. Oznacza to, że jeżeli nie zostaną odnalezione jednoski typu Overseer i Zergling to do zwiadu zostanie wykorzystana jednostka o nr prev.

return AIGrabUnit(player, c_ZU_Drone, c_prioScout, null);
Ostatnia instrukcja w funkcji, jeżeli żadna ze wcześniejszych instrukcji warunkowych nie została spełniona, to do zwiadu funkcja AIGrabUnit szuka jednostki typu Drone, a następnie kończy funkcję zwracając nr Drona.
}

Jak widać nie ma tu nic skomplikowanego, Zergowie do wczesnego zwiadu będą wykorzystywać Overseery, Zerglingi albo Drony.


Powrót
Drukuj
Poleć stronę znajomemu



Autor: Przemysław Miernik
Data publikacji : 05.04.2010
Liczba wyświetleń tekstu: 8552