Künstliche Intelligenz

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Hey Leute,
Ich moechte als angehender Spieleprogrammierer lernen wie man eine gute Künstliche Intelligenz programmiert, bzw. wo man das am besten lernen kann, da es eein sehr schweres Thema ist. Kennt ihr gute einsteigerfreundliche Onlinelehrkurse zu dem Thema? Wenn ihr gute Bücher zum Thema kennt sagt sie mir ebenfalls!
LG Henry
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich habe vor Ewigkeiten Artificial Intelligence: A Modern Approach gelesen, aber da ich zu dem Zeitpunkt OOP überhaupt nicht beherrschte, hat mir die Lektüre kaum etwas gebracht. Allgemeine Umsetzungen der im Buch vorgestellten Algorithmen gibt es hier.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Über die Feiertage habe ich eine kleine Bibliothek zur Logik-Programmierung in Python geschrieben. Es ist erst die erste Version und ist alles noch ziemlich durcheinander, weil ich es gewissermaßen "explorativ" programmiert habe, da mir von Anfang an noch nicht klar war, wie alles ausehen sollte. Es ist also im jetzigen Zustand keine unmittelbar verwendbare Bibliothek, sondern nur eine Art ausführbarer Snapshot meiner Gedanken zum Thema. Der Teil mit den Expression Trees (expressions.py) sollte eigentlich unabhängig sein von der Prolog-Engine (resolver.py), und umgekehrt. Leider gibt es zwischen beiden Teilen noch gegenseitige Abhängigkeiten, weswegen ich gerade expressions.py komplett neu schreibe.

Die Prolog-Engine ist semi-naiv programmiert, aber für kleinere Probleme, sofern Performance nicht das wesentliche Ziel ist, sollte sie einsetzbar sein, oder zumindest sollte daraus ersichtlich werden, wie man so etwas in Python implementieren könnte. Immerhin versteht die Engine Fakten, Regeln, Listen (insb. Differenzlisten) und den Cut fürs Branch Pruning. Vielleicht hilft dir das ja.

Ich beantworte gerne auch Fragen dazu, allerdings bin ich erst morgen wieder am Rechner.

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Außerdem gibt es die Vorlesung von Thrun und Norvig auf Udacity als CS271.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Da jetzt jeder Materialien zu "klassischer" AI auspackt: AI in Spielen hat damit meist wenig zu tun, da dafuer zu wenig Leistung frei bleibt.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich denke, du wirst da letztlich etwas spezifischer werden müssen. Geht es dir z.B. darum, wie sich Computergegner auf einem Spielfeld bewegen sollen, dann könntest du z.B. nach "echtzeit wegfindung" suchen. Dort bin ich z.B. auf eine zumindest beim Überfliegen recht vielversprechend erscheinende Praktikumsarbeit von Studenten gestoßen, die noch halbwegs anfängerfreundlich in die besagte Thematik einführt. Ein paar Grundkenntnisse in der Graphentheorie sollten aber zwecks besserem Verständnis schon vorhanden sein.

Ansonsten sag halt mal, wofür du dich speziell interessierst...
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Ich moechte künstliche intelligenz in richtung aufbauspiel entwickeln.
Ein gegner baut gebäude und verbessert sie, rekrutiert truppen und greift einen gelegentlich an.
eine billige ki die genau das macht kann ich bereits programmieren, allerdings ist diese sehr schlecht und leicht zu besiegen.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Auch große Studios haben Probleme mit schweren KI's. Bei Spielen wo die Reflexe entscheiden, wie bei Shootern, ist das kein Problem, aber bei Aufbauspielen.

Die "Irrsinnig" KI bei Warcraft III unterscheidet sich "Normal" KI das sie "cheatet". Sie bekommt 2x so viele Rohstoffe wie ein Spieler pro Aktion. Nutzt diese auch und ist dann schwerer.

Auch unter Starcraft II scheint die Truppenstärke mehr oder weniger linear mit der Rohstoffsammelrate zusammen zuhängen. Und insgesamt von der KI stärke.

Was alle Spiele gemeinsam haben ist glaube ich:
Werde ich angegriffen, verteidige ich das mit allem was ich habe.
Greife ich an ziehe ich mich zurück, wenn ich unterlegen bin.

Versuches doch mal mit zwei, drei oder vier festen Bauplänen die eine KI einschlägt und regulier über ihr Rohstoffeinkommen wie schnell sie diese abarbeitet.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Ich bin jetzt dabei einen KI-Gegner für ein Spiel zu programmieren, das ich auch selbst gemacht habe(naja, es ist kein richtiges Spiel)

Das Spiel ist rundenbasiert. Man muss seine Waffen und Rohstoffproduktion verbessern und Schwertkaempfer und Berserker ausbilden. Das Kampfsystem wird es dann programmiert, wenn ich entschieden habe, ob es wie eine Art Tower Defense Spiel werden wird, oder ob der KI-Gegner sein eigenes "Dorf" haben darf. (ähnlich wie in Stronghold, AoE oder Warcraft)
Dann stellt sich noch die Frage ob ich eine neue Klasse extra für die KI erstelle, oder ob ich einfach alles in die Spielschleife reinprogrammiere und eine Instanz der Klasse Spielmechanik erstelle.Ich denke ihr könnt euch nun besser vorstellen welche Art von künstlicher Intelligenz ich erlernen moechte, und falls ihr Vorschläge habt wie man diese KI am besten erstellt und in das Spiel einbaut, lasst es mich wissen!

Code: Alles auswählen

# -*- coding: cp1252 -*-
import random, time

class Spielmechanik:
    
    def __init__(self):
        self.Aktionspunkte = 3
        self.Rohstoffe = 3
        self.Waffen = 10
        self.Rohstoffproduktion = 1
        self.Waffenproduktion = 1
        self.Turm = 100
        self.Schwertkrieger = 0
        self.Berserker = 0
        # Anforderungen_ Ausbau - Ausbildung
        self.Ausbau_Rohstoff = 2
        self.Ausbau_Waffen = 2
        self.Ausbau_Kaserne = 2
        
    def __str__(self):
        nachricht = "Rohstoffproduktion: " + str(self.Rohstoffproduktion) + " Waffenprod.: " +\
                    str(self.Waffenproduktion) + " Rohstoffe: " + str(self.Rohstoffe) + " Waffen: " +\
                    str(self.Waffen) + " Turm HP: " + str(self.Turm) + "\nSchwertkrieger: " +\
                    str(self.Schwertkrieger) + " Berserker: " + str(self.Berserker)
        return nachricht

    def naechste_Runde(self):
        if self.Aktionspunkte == 0:
            self.Rohstoffe += self.Rohstoffproduktion
            self.Waffen += self.Waffenproduktion
            self.Aktionspunkte += 5
            print "Eine neue Runde beginnt!"
            time.sleep(1)
            print

    def Runde_beenden(self):
        self.Aktionspunkte = 0

    def Rohstoffproduktion_ausbauen(self):
        if self.Ausbau_Rohstoff <= self.Rohstoffe:
            self.Rohstoffe -= self.Ausbau_Rohstoff
            self.Rohstoffproduktion *= 1.5
            self.Ausbau_Rohstoff *= 1.5
            self.Aktionspunkte -= 1
            print "Rohstoffproduktion erfolgreich erhoeht!"
        else: print "Du hast nicht genug Rohstoffe um das Gebaeude auszubauen!"
        time.sleep(2)
            
    def Waffenproduktion_ausbauen(self):
        if self.Ausbau_Waffen <= self.Rohstoffe:
            self.Waffenproduktion *= 2
            self.Rohstoffe -= self.Ausbau_Waffen
            self.Ausbau_Waffen *= 1.5
            self.Aktionspunkte -= 1
            print "Waffenproduktion erfolgreich erhoeht!"
        else: print "Du hast nicht genug Rohstoffe um die Produktion zu verbessern!"
        time.sleep(2)

    def Truppen_ausbilden(self):
        print "[1] Schwertkrieger [2] Berker ausbilden (1 Waffe pro)"
        eingabe = int(raw_input("Was willst du ausbilden?"))
        if eingabe == 1:
            eingabe = int(raw_input("Wie viele Schwertkrieger moechtest du ausbliden?"))
            if eingabe <= self.Waffen:
                self.Waffen -= eingabe
                self.Schwertkrieger += eingabe
                self.Aktionspunkte -= 1
                print "Du hast " + str(eingabe) + " Schwertkaempfer ausgebildet!"
            else: print "Du hast nicht genug Waffen!"
        if eingabe == 2:
            eingabe = int(raw_input("Wie viele Berserker moechtest du ausbilden?"))
            if eingabe <= self.Waffen:
                self.Waffen -= eingabe
                self.Berserker += eingabe
                self.Aktionspunkte -= 1
                print "Du hast " + str(eingabe) + " Berserker ausgebildet!"
            else: "Du hast nicht genug Waffen!"
        time.sleep(2)

Spieler = Spielmechanik()

while True:
    print Spieler
    print "[1] Rohstoff-/Waffenproduktion erhoehen [2] Soldaten ausbilden"
    time.sleep(1)
    Eingabe = int(raw_input("Was willst du tun? ([3] Runde beenden)"))
    if Eingabe == 1:
        print "[1] Rohstoffproduktion erhoehen [2] Waffenproduktion erhoehen"
        Eingabe = int(raw_input("Was willst du tun?"))
        if Eingabe == 1:
            Spieler.Rohstoffproduktion_ausbauen()
        elif eingabe == 2:
            Spieler.Waffenproduktion_ausbauen()
    elif Eingabe == 2:
        Spieler.Truppen_ausbilden()
    elif Eingabe == 3:
        Spieler.Runde_beenden()
    Spieler.naechste_Runde()
input()
    
Antworten