KI-Problem

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

KI-Problem

Beitragvon Imperator » Sonntag 20. Januar 2008, 19:42

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

Beitragvon fred.reichbier » Sonntag 20. Januar 2008, 19:47

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:

Beitragvon Imperator » Sonntag 20. Januar 2008, 19:49

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

Beitragvon fred.reichbier » Montag 21. Januar 2008, 16:39

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:

Beitragvon Imperator » Montag 21. Januar 2008, 16:55

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

Beitragvon fred.reichbier » Montag 21. Januar 2008, 17:57

*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:

Beitragvon Imperator » Montag 21. Januar 2008, 18:25

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

Beitragvon Nikolas » Montag 21. Januar 2008, 19:10

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:

Beitragvon Imperator » Dienstag 22. Januar 2008, 16:11

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:

Beitragvon rayo » Dienstag 22. Januar 2008, 16:51

Hi

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

Gruss
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 22. Januar 2008, 18:13

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 Modvoice
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Beitragvon Imperator » Dienstag 22. Januar 2008, 19:22

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:

Beitragvon Imperator » Mittwoch 23. Januar 2008, 18:17

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:

Beitragvon Imperator » Donnerstag 24. Januar 2008, 18:54

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

Beitragvon rayo » Donnerstag 24. Januar 2008, 19:01

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder