KI-Problem

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Hallo,

ich könnte etwas Hilfe bei einer KI-programmierung für mein sich seit langem in arbeit befindenden Spiel gebrauchen.
Erst der code:

Code: Alles auswählen

class gegner():
    def __init__(self, x, y):
        self.image = pygame.image.load('Kunst.jpg')
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
    def KI(self):
        if stehen == False:
            if player.midright < self.rect.midright:
                self.rect = self.rect.move(-2, 0)
            if player.midleft < self.rect.midright:
                self.rect = self.rect.move(-2, 0)
            if player.midright > self.rect.midright:
                self.rect = self.rect.move(2, 0)
            if player.midleft > self.rect.midleft:
                self.rect = self.rect.move(2, 0)
            if player.midtop < self.rect.midtop:
                self.rect = self.rect.move(0, 2)
            if player.midbottom < self.rect.midbottom:
                self.rect = self.rect.move(0, 2)
            if player.midtop > self.rect.midtop:
                self.rect = self.rect.move(0, 2)
            if player.midbottom > self.rect.midbottom:
                self.rect = self.rect.move(0, 2)
        if stehen == True:
            x = player.centerx
            y = player.centery
            if x > self.rect.centerx:
                strecke = self.rect.centerx - x
                strecke = strecke / 2
                for i in range(strecke):
                    self.rect = self.rect.move(0, 2)
Nun, der Gegner verhält sich alles andere asls so wie er soll. Eigentlich müsste mit dem code ja jeweils doppelt sichergestellt sein, dass er die Bewegungen des Spielers nachahmt. Das macht er aber nicht, sondern verschwindet meist mit einer Zickzackroute aus dem bild. Ich hab die Zahlen auch schon entgegen jeder Logik umgedreht. Dann ist es halt ein anderer Zickzackkurs. Ach ja, für alle die es nicht mehr wissen. Ich verwende PyGame.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

kannst du uns vielleicht etwas mehr Code zeigen? Unter anderem wäre es nützlich zu wissen, wo `stehen` gesetzt wird.

Gruß Fred
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Ja klar, wollte nur nicht so einen riesen code hier reinpflanzen.
Also hier der ganze Code (achtung Chaos!):

Code: Alles auswählen

import pygame, os, sys
from pygame.locals import*
pygame.init()
class gegner():
    def __init__(self, x, y):
        self.image = pygame.image.load('Kunst.jpg')
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
    def KI(self):
        if stehen == False:
            if player.midright < self.rect.midright:
                self.rect = self.rect.move(-2, 0)
            if player.midleft < self.rect.midright:
                self.rect = self.rect.move(-2, 0)
            if player.midright > self.rect.midright:
                self.rect = self.rect.move(2, 0)
            if player.midleft > self.rect.midleft:
                self.rect = self.rect.move(2, 0)
            if player.midtop < self.rect.midtop:
                self.rect = self.rect.move(0, 2)
            if player.midbottom < self.rect.midbottom:
                self.rect = self.rect.move(0, 2)
            if player.midtop > self.rect.midtop:
                self.rect = self.rect.move(0, 2)
            if player.midbottom > self.rect.midbottom:
                self.rect = self.rect.move(0, 2)
        if stehen == True:
            x = player.centerx
            y = player.centery
            if x > self.rect.centerx:
                strecke = self.rect.centerx - x
                strecke = strecke / 2
                for i in range(strecke):
                    self.rect = self.rect.move(0, 2)
            
                
landschaft = pygame.image.load('Creek.jpg')
hintergrund = pygame.transform.scale(landschaft, (900, 700))
karte = hintergrund.get_rect()
spieler = pygame.image.load('Hopsy.bmp')
player = spieler.get_rect()
player.center = (450, 350)
black = 0, 0, 0
size = width, height = 900,700
screen = pygame.display.set_mode(size)
screen.fill(black)
move_up = False
move_down = False
move_right = False
move_left = False
stehen = False
munition = 5
bert = gegner(200, 200)
while True:
    screen.fill(black)
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()
            if event.key == K_w:
                move_down = False
                move_right = False
                move_left = False
                move_up = True
                stehen = False
            if event.key == K_s:
                move_up = False
                move_right = False
                move_left = False
                move_down = True
                stehen = False
            if event.key == K_a:
                move_down = False
                move_up = False
                move_right = False
                move_left = True
                stehen = False
            if event.key == K_d:
                move_down = False
                move_up = False
                move_left =False
                move_right = True
                stehen = False
            if event.key == K_SPACE:
                move_up = False
                move_down = False
                move_right = False
                move_left = False
                stehen = True
            if event.key == K_f:
                if stehen == True:
                    munition = 5
            
    if move_up:
        player = player.move(0, -2)
        
    if move_down:
        player = player.move(0, 2)
        
    if move_right:
        player = player.move(2, 0)
        
    if move_left:
        player = player.move(-2, 0)
     
    
    if event.type == MOUSEBUTTONDOWN:
        isplaying = pygame.mixer.music.get_busy()
        if isplaying == False:
            if stehen == True:
                if munition > 0:
                    pygame.mixer.music.load('shot1.wav')
                    pygame.mixer.music.play()
                    munition = munition - 1

    bert.KI()
    screen.blit(hintergrund, karte)
    screen.blit(spieler, player)
    screen.blit(bert.image, bert.rect)
    pygame.display.flip()  
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Hallo,

ich glaube, der Fehler liegt bei den If-Abfragen. Richtig müssten die letzten zwei lauten:

Code: Alles auswählen

            if player.midtop > self.rect.midtop:
                self.rect = self.rect.move(0, 2)
            if player.midbottom > self.rect.midbottom:
                self.rect = self.rect.move(0, 2)
Dann entfernt sich der Gegner wenigstens bei mir nicht mehr zick-zack-artig.
So richtig funktionieren tuts danach allerdings bei mir auch nicht, du solltest einfach mal die (etwas hakeligen :p) Ifs durchsehen.

Gruß Fred
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Hä? genau so habe ich die if-Abfragen doch auh geschrieben. Und ich habe sie schon mehrmals durchgeschaut bevor ich mich ans Forum gewandt habe.
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

*urgh* Natürlich das Falsche rauskopiert :roll: Ich meinte folgendes:

Code: Alles auswählen

            if player.midtop < self.rect.midtop:
                self.rect = self.rect.move(0, -2)
            if player.midbottom < self.rect.midbottom:
                self.rect = self.rect.move(0, -2)
            if player.midtop > self.rect.midtop:
                self.rect = self.rect.move(0, 2)
            if player.midbottom > self.rect.midbottom:
                self.rect = self.rect.move(0, 2)
Da ist allerdings wie gesagt noch ein Fehler drin, den ich gerade nicht finde.

Gruß Fred
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Oh, ich Dussel! :x Den Fehler hab ich doch glatt reingehauen als ich die Zahlen versuchsweise umkehrte. :oops:
Nun ja, Statusbericht: Es ist wie vor der Verschlimmbesserung. Wenn ich nach links laufe geht der gegner hoch. Laufe ich nach rechts läuft er runter.
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

Kennst du eigentlich die Ausdrücke 'and' oder 'or' ?

Code: Alles auswählen

   if stehen == False:

            if player.midtop < self.rect.midtop:
                self.rect = self.rect.move(0, 2)
            if player.midbottom < self.rect.midbottom:
                self.rect = self.rect.move(0, 2)
            if player.midtop > self.rect.midtop:
                self.rect = self.rect.move(0, 2)
            if player.midbottom > self.rect.midbottom:
                self.rect = self.rect.move(0, 2)
macht das gleiche wie

Code: Alles auswählen

if (not stehen) and (player.mittop != rect.mittop) and (player.botton != rect.Midbottom
Schreib dir erstmal genau auf, was du machen willst, bevor du nur per Trial and Error rumhackst. :wink:
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Hallo Nikolas,

ich finde mehrere if-Abfragen übersichtlicher, aber das ist sicherlich geschmackssache. Leider hilft das aber eben auch nicht weiter. Und wie meinst du das mit Trial & Error?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Was soll denn genau der Gegner machen? Immer Richtung Spieler fahren oder die gleiche Bewegung wie der Spieler?

Gruss
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Imperator hat geschrieben:ich finde mehrere if-Abfragen übersichtlicher, aber das ist sicherlich geschmackssache.
Nein, weil dein Code zu Copy-Paste-Problemen führt, da mehrmals das gleiche ausgeführt wird. Stell dir vor, du vergisst bei einer Änderung in einem der Zweige was zu ändern, dann hast du erstmal einen Bug, den du anders komplett vermieden hättest.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

rayo hat geschrieben:Hi

Was soll denn genau der Gegner machen? Immer Richtung Spieler fahren oder die gleiche Bewegung wie der Spieler?

Gruss
Er soll solange der Spieler läuft seine Bewegungen nachmachen, und wenn er stehen bleibt um zu schießen in seine richtung laufen.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

oh, verdammt. Ich habe genau das Falsche geschrieben. Natürlich solll sich der gegner immer auf den spieler zubewegen. Sorry! War wohl schon etwas zu müde :oops:
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

*push*
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also ehrlich gesagt weiss ich nicht was der Gegner nun machen soll:
  • * Spieler nachmachen und auf Spieler zugehen wenn er steht
    * immer auf Spieler zugehen
Welches von beiden soll es nun werden?

Ach ja:
Um den Spieler nachzumachen, reicht es nicht einfach seine Position zu überprüfen, da brauchst du auch seine Bewegung.

Gruss

PS: mach dein Avatar weg, bei mir ist es ein riesiges NichtKlauenBild
BlackJack

Ist Dir eigentlich noch nicht aufgefallen, das "Dein" Avatar ein bisschen zu gross geraten ist!?
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Was ist denn ein NichtKlauenBild?
Und wie ich mich vorhin verbessert habe: Der Gegner soll immer auf den Spieler zulaufen.
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

@Imperator:
Ich hab mir mal erlaubt dein Avatar Bild aus deinem Profil zu löschen.

Warscheinlich ist es dir nicht aufgefallen das anstatt des von dir gewählten Bildes ein sogennantes "nicht klauen Bild" angezeigt wurde. Liegt am Browser Cache :).

Gruß
Damaskus
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Ne, ist mir wirklich nicht aufgefallen. Bei mir war es ganz normal.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Problem nun Zum Teil gelöst, ich hatte einmal einen wert falsch gestezt. Aber der blöder Gegner reagiert immer nur dann auf meinen neuen y Wert, wenn ich (also der Spieler) auch den x Wert ändere.

Edit: problem jetzt ganz gelöst.
Antworten