Hallo Freunde,
Wer kennt es nicht, aus den alten Zeiten, wenn die KI einem eine Ressource wegschnappen will, baut man einfach was hin.
Wenn die Züge zu produktiv sind, baut man ein Depot ans Kopfende es Bahnhofs, und lässt eine Lok mit dem Zug zusammenstoßen.
Oder die gegnerischen Fahrzeuge welche mal wieder zu zahlreich unterwegs sind blockiert man mit einem Zug, und lässt die mit einem 2. Zug reihenweise zerstören.
Ich habe mir als Spaßprojekt es einfach mal vorgennommen und ausprobiert, eine KI zu schaffen die genau dieses Verhalten der menschlichen Spieler, mal selber umsetzt. Den Spieß also mal umdreht.
Ist nichts ernstgemeintes, aber vielleicht "just another AI..."
Viele Grüße, rechne mit einem Release in kommender Zeit
Ein kleiner Auszug.
Code:
function SabotageCompetitor() {
// 1) Irgendeinen Gegner auswählen
local companies = AICompanyList();
local target_companies = [];
foreach (company_id in companies) {
if (company_id != AIOwnCompany.GetCompanyID()) {
target_companies.append(company_id);
}
}
if (target_companies.len() == 0) {
// Keine Gegner vorhanden, nichts zu tun
return;
}
local victim = target_companies[AIUtility.RandomRange(0, target_companies.len())];
// 2) Finde eine Stadt, in der der Gegner aktiv ist
local towns = AITownList();
if (towns.len() == 0) return;
local random_town = towns[AIUtility.RandomRange(0, towns.len())];
// 3) Versuche z. B. in der Nähe der Stadt Gleise zu bauen, die den Gegner blockieren
// Wir versuchen rund um dieses Feld ein paar Gleiskacheln zu setzen,
// um den Gegner zu ärgern.
local tile_list = AIRail.GetNearbyTiles(pos, 6);
// tile_list enthält Kacheln rund um pos in einem Radius von 6 Feldern (nur Beispiel).
// Baue Gleise auf einigen zufälligen Feldern in diesem Umkreis
foreach (tile in tile_list) {
// Prüfe, ob wir hier bauen können
if (AIRail.CanBuildRail(tile, RAILTYPE_RAIL, AIMap.GetTileSlope(tile), 0)) {
// Versuche zu bauen (Bridges/Tunnel ignorieren wir hier)
// Hier nur 0x0-Layout (gerade Kachel)
try {
AIRail.BuildRail(tile, RAILTYPE_RAIL, AIMap.GetTileSlope(tile), 0);
} catch (e) {
AILog.Warning("Konnte Gleis nicht bauen: " + e);
}
}
}
// 4) Depots bauen, um evtl. gegnerische Züge zu crashen, wenn sie sich verbinden
// Dazu brauchen wir ein Gleis-Layout, das in den Schienen des Gegners mündet.
this.RandomlyPlaceDepots(tile_list);
// 5) Ähnlich kann man Straßen bauen, um gegnerische Fahrzeuge zu behindern.
// Ggf. Depots mitten auf Straßen, etc.
// Hier nur ein Dummy:
this.RandomlyPlaceRoads(pos, 4);
}