Erste Schritte Problem mit einer bool-Variable in einem Bot-Programm

JavaAddict

Mitglied
Hallo ich erstelle gerade einen Starcraft-Bot für ein Projekt in meiner Ausbildung.
Die API, die ich benutze heißt BWAPI.

Mein Programm funktioniert so, dass ich ständig durch alle meine Einheiten iteriere.
Gebäude zählen auch als Einheiten.

Wenn ich gerade in dem Loop bei meinen Arbeitern bin (SCV) UND die Differenz zwischen totalSupply und actualSupply kleiner als 2 ist UND ich mehr als 100 Mineralien habe (self.getMinerals() >= 100) UND die Bool-Variable allowedToBuildSupplyDepot auf true gesetzt ist passiert folgendes:

Zuerst einmal setze ich die boolsche allowedToBuildSupplyDepot-Variable auf false, weil ich so verhindere, dass alle meine Arbeiter ein Gebäude bauen wollen.
Die Methode build() ist zuerst einmal ein Laufbefehl und erst wenn der Arbeiter neben der Zielposition des SupplyDepots ist wird gebaut.

Ich baue also das SupplyDepot. Jetzt aktiviert sich die OnUnitCreate-Methode.
Die OnUnitCreate()-Methode wird immer aktiviert wenn Einheiten erzeugt werden da muss aber zwischen Einheiten und Gebäuden unterschieden werden.

Bei Einheiten zählt die Einheit als erzeugt wenn sie aus der Produktionsstätte hinausläuft also der Zeitpunkt der Fertigstellung der Einheit.
Ein Gebäude hingegen zählt als erzeugt, wenn es angefangen wird zu bauen.

Ich habe das auch mit einem System.out.println() verifiziert.

Nun das Problem ist, dass meine Arbeiter nur 1 Depot bauen selbst wenn die Bedingung erfüllt ist und sie eigentlich mehrere Depots bauen müssten.

Für eure Hilfe wäre ich euch sehr dankbar

Hier ist der Code:

Java:
import bwapi.*;
import bwta.BWTA;
import bwta.BaseLocation;

public class TestBot1 extends DefaultBWListener {

    private Mirror mirror = new Mirror();

    private Game game;
   
    private Player self;
   
    private int totalSupply = 10;
   
    private int actualSupply = 4;
   
    private boolean allowedToBuildSupplyDepot = true;
   
    private enum typeOfUnit {
        scv,
        commandCenter,
        supplyDepot,
        marine,
        medic,
        vulture,
        siegeTank,
        siegeTankSieged,
        other
    }
   
    private typeOfUnit getTypeOfUnit (Unit parUnit)
    {
        typeOfUnit result = typeOfUnit.other;
       
        if (parUnit.getType() == UnitType.Terran_SCV)
        {
            result = typeOfUnit.scv;
        }
        else if (parUnit.getType() == UnitType.Terran_Command_Center)
        {
            result = typeOfUnit.commandCenter;
        }
        else if (parUnit.getType() == UnitType.Terran_Supply_Depot)
        {
            result = typeOfUnit.supplyDepot;
        }
        else if (parUnit.getType() == UnitType.Terran_Marine)
        {
            result = typeOfUnit.marine;
        }
        else if (parUnit.getType() == UnitType.Terran_Medic)
        {
            result = typeOfUnit.medic;
        }
        else if (parUnit.getType() == UnitType.Terran_Vulture)
        {
            result = typeOfUnit.vulture;
        }
        else if (parUnit.getType() == UnitType.Terran_Siege_Tank_Tank_Mode)
        {
            result = typeOfUnit.siegeTank;
        }
        else if (parUnit.getType() == UnitType.Terran_Siege_Tank_Siege_Mode)
        {
            result = typeOfUnit.siegeTankSieged;
        }
        return result;
    }
// Returns a suitable TilePosition to build a given building type near
// specified TilePosition aroundTile, or null if not found. (builder parameter is our worker)
public TilePosition getBuildTile(Unit builder, UnitType buildingType, TilePosition aroundTile) {
     TilePosition ret = null;
     int maxDist = 3;
     int stopDist = 40;
    
     // Refinery, Assimilator, Extractor
     if (buildingType.isRefinery()) {
         for (Unit n : game.neutral().getUnits()) {
             if ((n.getType() == UnitType.Resource_Vespene_Geyser) &&
                     ( Math.abs(n.getTilePosition().getX() - aroundTile.getX()) < stopDist ) &&
                     ( Math.abs(n.getTilePosition().getY() - aroundTile.getY()) < stopDist )
                     ) return n.getTilePosition();
         }
     }
    
     while ((maxDist < stopDist) && (ret == null)) {
         for (int i=aroundTile.getX()-maxDist; i<=aroundTile.getX()+maxDist; i++) {
             for (int j=aroundTile.getY()-maxDist; j<=aroundTile.getY()+maxDist; j++) {
                 if (game.canBuildHere(new TilePosition(i,j), buildingType, builder, false)) {
                     // units that are blocking the tile
                     boolean unitsInWay = false;
                     for (Unit u : game.getAllUnits()) {
                         if (u.getID() == builder.getID()) continue;
                         if ((Math.abs(u.getTilePosition().getX()-i) < 4) && (Math.abs(u.getTilePosition().getY()-j) < 4)) unitsInWay = true;
                     }
                     if (!unitsInWay) {
                         return new TilePosition(i, j);
                     }
                     // creep for Zerg
                     if (buildingType.requiresCreep()) {
                         boolean creepMissing = false;
                         for (int k=i; k<=i+buildingType.tileWidth(); k++) {
                             for (int l=j; l<=j+buildingType.tileHeight(); l++) {
                                 if (!game.hasCreep(k, l)) creepMissing = true;
                                 break;
                             }
                         }
                         if (creepMissing) continue;
                     }
                 }
             }
         }
         maxDist += 2;
     }
    
     if (ret == null) game.printf("Unable to find suitable build position for "+buildingType.toString());
     return ret;
}
        
   
    public void run() {
        mirror.getModule().setEventListener(this);
        mirror.startGame();
    }

    @Override
    public void onUnitCreate(Unit unit) {
        if (unit.getType() == UnitType.Terran_Supply_Depot) {
            System.out.println("Supply Depot wird gebaut...");
            allowedToBuildSupplyDepot = true;
            }
        }
       
        @Override
        public void onUnitComplete(Unit unit) {
            if (unit.getType() == UnitType.Terran_Supply_Depot) {
                System.out.println("Supply Depot wurde gebaut...");
                totalSupply += 8;
            }
       
    }

    @Override
    public void onStart() {
        game = mirror.getGame();
        self = game.self();

        //Use BWTA to analyze map
        //This may take a few minutes if the map is processed first time!
        System.out.println("Analyzing map...");
        BWTA.readMap();
        BWTA.analyze();
        System.out.println("Map data ready");
       
        int i = 0;
        for(BaseLocation baseLocation : BWTA.getBaseLocations()){
            System.out.println("Base location #" + (++i) + ". Printing location's region polygon:");
            for(Position position : baseLocation.getRegion().getPolygon().getPoints()){
                System.out.print(position + ", ");
            }
            System.out.println();
        }

    }

    @Override
    public void onFrame() {
        //game.setTextSize(10);
        game.drawTextScreen(10, 10, "Playing as " + self.getName() + " - " + self.getRace());

        //StringBuilder units = new StringBuilder("My units:\n");

        //iterate through my units
        for (Unit myUnit : self.getUnits()) {
            //units.append(myUnit.getType()).append(" ").append(myUnit.getTilePosition()).append("\n");
           
            switch (getTypeOfUnit(myUnit)) {
          
            case scv:
                   
                   
                 if ((totalSupply - actualSupply) < 2 && (self.minerals() >= 100) && allowedToBuildSupplyDepot) {
                    
                    //Boolean allowedToBuild set on false so that not 10 SCV try to build SupplyDepot
                     allowedToBuildSupplyDepot = false;
                     //get a nice place to build a supply depot
                     TilePosition buildTile =
                         getBuildTile(myUnit, UnitType.Terran_Supply_Depot, self.getStartLocation());
                     //and, if found, send the worker to build it (and leave others alone - break;)
                     if (buildTile != null) {
                         myUnit.build(UnitType.Terran_Supply_Depot, buildTile);
                         break;
                     }
                 }
               
                //if it's a worker and it's idle, send it to the closest mineral patch
                 else if (myUnit.isIdle()) {
                    Unit closestMineral = null;

                    //find the closest mineral
                    for (Unit neutralUnit : game.neutral().getUnits()) {
                        if (neutralUnit.getType().isMineralField()) {
                            if (closestMineral == null || myUnit.getDistance(neutralUnit) < myUnit.getDistance(closestMineral)) {
                                closestMineral = neutralUnit;
                            }
                        }
                    }

                    //if a mineral patch was found, send the worker to gather it
                    if (closestMineral != null) {
                        myUnit.gather(closestMineral, false);
                    }
                  
                        }
                   
               
               
             break;
               
            case commandCenter:
            //if there's enough minerals, train an SCV
            if (self.minerals() >= 50 && (totalSupply - actualSupply) >1)  {
                myUnit.train(UnitType.Terran_SCV);
                actualSupply++;
            }
            break;
           
            case supplyDepot:
            {}
            break;
           
            case marine:
            {}
            break;
               
            case medic:
            {}
            break;
               
            case vulture:
            {}
            break;
               
            case siegeTank:
            {}
            break;   
               
            case siegeTankSieged:
            {}
            break;
           
            case other:
            {}
            break;
        }
    }


        //draw my units on screen
        //game.drawTextScreen(10, 25, units.toString());
    }



    public static void main(String[] args) {
        new TestBot1().run();
    }
}


LG JavaAddict
 

JavaAddict

Mitglied
Ich hab ja bei dem onUnitCreate() meine bool-Variable allowedToBuildSupplyDepot auf true gesetzt also müsste es eigentlich gehen :/

Hängt es mit dem Overwrite vielleicht zusammen?

Klar könnte man sich jetzt denken, dass es vielleicht auch mit der onUnitComplete() zusammenhängt, aber die wird bei Gebäuden erst aktiviert wenn das Gebäude fertigsgestellt wurde und erst dann mach ich das totalSupply+=8; .
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
D Break Sprungmarken Problem einer While True in While True Java Basics - Anfänger-Themen 6
J String Problem kann das einer erklären Java Basics - Anfänger-Themen 13
V Problem Aufruf einer Methode in einer Methode Java Basics - Anfänger-Themen 1
B Problem beim Angeben einer Eingabe Java Basics - Anfänger-Themen 12
J Encoding Problem beim Einlesen einer txt Datei mit Umlauten Java Basics - Anfänger-Themen 3
F Problem mit Tabulatoren bei Zeilen zählen einer Textdatei Java Basics - Anfänger-Themen 17
D Problem beim Lesen einer txt-Datei Java Basics - Anfänger-Themen 8
E Problem mit Arrays bei Benutzung einer GUI Java Basics - Anfänger-Themen 3
P Problem mit dem Auslesen einer Varible/Methode Java Basics - Anfänger-Themen 8
F Problem bei eshop -> Ausführen einer Methode über eine Shopverwaltung Java Basics - Anfänger-Themen 6
U Methoden Zugriff auf Array von weiterer Methode einer Klasse, Rückgabewert Problem Java Basics - Anfänger-Themen 5
Z Problem beim Lesen und Schreiben einer Datei Java Basics - Anfänger-Themen 10
O Methode in andere Klasse verlegt, "auslesen" einer HTML Seite verschnellert - Problem. Java Basics - Anfänger-Themen 4
T Problem bei einer Flugbahnberechnung. Java Basics - Anfänger-Themen 8
J Variablen Problem beim einlesen einer Zahl Java Basics - Anfänger-Themen 7
Killerjo96 Erste Schritte Problem mit dem Sichern einer If Schleife Java Basics - Anfänger-Themen 5
A Problem beim Ausführen einer .jar datei auf externen System Java Basics - Anfänger-Themen 5
L Problem beim Einlesen einer Datei in einen String Java Basics - Anfänger-Themen 12
B Problem beim Abspielen einer Videodatei Java Basics - Anfänger-Themen 4
B Problem bei dem erstellen einer Main Methode Java Basics - Anfänger-Themen 4
M Problem bei einer Java-Aufgabe (Fakultäten) Java Basics - Anfänger-Themen 5
B Problem mit double in einer Funktion Java Basics - Anfänger-Themen 4
V Problem mit einer While Schleife Java Basics - Anfänger-Themen 8
C Problem mit Überprüfen einer Eingabe Java Basics - Anfänger-Themen 5
P Problem mit: Vererbung , ADT und einer Funktion Java Basics - Anfänger-Themen 10
F Problem mit einer Schleife Java Basics - Anfänger-Themen 10
J Problem beim Löschen von elementen aus einer ArrayList Java Basics - Anfänger-Themen 5
O Methode - Problem mit Subtraktion in einer while-Schleife Java Basics - Anfänger-Themen 2
T Problem beim Returnwert einer Methode Java Basics - Anfänger-Themen 12
M line.separator: Problem beim Lesen einer Datei Java Basics - Anfänger-Themen 11
calzone Problem einer Gleichung mit Modulo Java Basics - Anfänger-Themen 5
T problem mit einer typ zeile Java Basics - Anfänger-Themen 8
G Problem beim Sortieren einer Liste Java Basics - Anfänger-Themen 20
JeromeM90 Problem bei einer Ausgabe von einem bestimmten Zeichen Java Basics - Anfänger-Themen 5
N Problem beim Durchsuchen einer LinkedList Java Basics - Anfänger-Themen 5
X Problem: Erben von einer abstrakten Klasse Java Basics - Anfänger-Themen 4
T Problem mit Implementierung von einer HashMap aufgabe Java Basics - Anfänger-Themen 2
K Ausgabe problem in einer Hausaufgabe Java Basics - Anfänger-Themen 5
D Problem bei einer Formel (Bin Java Neuling) Java Basics - Anfänger-Themen 3
F Problem mit auführen einer .bat Datei aus Java heraus Java Basics - Anfänger-Themen 24
M Problem beim Löschen des ersten Eintrags einer TreeSet Java Basics - Anfänger-Themen 3
H Problem beim Einlesen einer Datei (Endlosschleife ?) Java Basics - Anfänger-Themen 3
G problem beim überschreiben einer funktion Java Basics - Anfänger-Themen 2
D Problem bei einer Rekursiven Methode Java Basics - Anfänger-Themen 2
A Problem mit Ausgabe einer Liste über einen Client Java Basics - Anfänger-Themen 5
T Problem beim Einlesen einer Datei Java Basics - Anfänger-Themen 3
T Problem mit einer Klasse Java Basics - Anfänger-Themen 3
S Problem beim löschen einer Zeile aus einer Tabelle Java Basics - Anfänger-Themen 4
W Problem mit jar erstellung bei einer SWT-Applikation Java Basics - Anfänger-Themen 5
L Merkwürdiges Problem beim Speichern und Öffnen einer Datei Java Basics - Anfänger-Themen 3
B Problem beim einlesen einer Textdatei Java Basics - Anfänger-Themen 3
M Problem beim Aufruf einer Methode: Wo is der Fehler? Java Basics - Anfänger-Themen 12
G Problem bei der Angabe von Attributen in einer Objekt-Klasse Java Basics - Anfänger-Themen 3
G Problem beim erstellen einer .jar Datei Java Basics - Anfänger-Themen 9
L Aktual.problem einer Var. wenn ComboBox Element ausgewählt Java Basics - Anfänger-Themen 4
M Problem mit Exceptionausgabe in einer Logfile. Java Basics - Anfänger-Themen 3
B Problem mit einer static void Methode Java Basics - Anfänger-Themen 8
megachucky Kleines Problem mit dem "return" einer Methode. Java Basics - Anfänger-Themen 11
G Problem (oder Verständnisporblem) bei einer static method Java Basics - Anfänger-Themen 9
G Problem mit einer ganz einfachen Funktion Java Basics - Anfänger-Themen 8
megachucky kleines problem mit einer nullpointer exception Java Basics - Anfänger-Themen 2
V Problem mit der Anzeige einer paint-Methode in einem Panel Java Basics - Anfänger-Themen 2
M Problem mit einer List Java Basics - Anfänger-Themen 5
K Problem beim Auslesen einer Datei Java Basics - Anfänger-Themen 6
W Problem mit dem Aufruf einer Methode Java Basics - Anfänger-Themen 2
T Problem mit einer Java Hausaufgabe Java Basics - Anfänger-Themen 14
C Problem mit Zeichnen auf einer extends Canvas Class... Java Basics - Anfänger-Themen 2
G Problem mit einer Methode Java Basics - Anfänger-Themen 2
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben