Seite 1 von 1
KI-Problem
Verfasst: Sonntag 20. Januar 2008, 19:42
von Imperator
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.
Verfasst: Sonntag 20. Januar 2008, 19:47
von fred.reichbier
Hallo,
kannst du uns vielleicht etwas mehr Code zeigen? Unter anderem wäre es nützlich zu wissen, wo `stehen` gesetzt wird.
Gruß Fred
Verfasst: Sonntag 20. Januar 2008, 19:49
von Imperator
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()
Verfasst: Montag 21. Januar 2008, 16:39
von fred.reichbier
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
Verfasst: Montag 21. Januar 2008, 16:55
von Imperator
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.
Verfasst: Montag 21. Januar 2008, 17:57
von fred.reichbier
*urgh* Natürlich das Falsche rauskopiert

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
Verfasst: Montag 21. Januar 2008, 18:25
von Imperator
Oh, ich Dussel!

Den Fehler hab ich doch glatt reingehauen als ich die Zahlen versuchsweise umkehrte.
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.
Verfasst: Montag 21. Januar 2008, 19:10
von Nikolas
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.

Verfasst: Dienstag 22. Januar 2008, 16:11
von Imperator
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?
Verfasst: Dienstag 22. Januar 2008, 16:51
von rayo
Hi
Was soll denn genau der Gegner machen? Immer Richtung Spieler fahren oder die gleiche Bewegung wie der Spieler?
Gruss
Verfasst: Dienstag 22. Januar 2008, 18:13
von Leonidas
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.
Verfasst: Dienstag 22. Januar 2008, 19:22
von Imperator
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.
Verfasst: Mittwoch 23. Januar 2008, 18:17
von Imperator
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

Verfasst: Donnerstag 24. Januar 2008, 18:54
von Imperator
*push*
Verfasst: Donnerstag 24. Januar 2008, 19:01
von rayo
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
Verfasst: Donnerstag 24. Januar 2008, 19:04
von BlackJack
Ist Dir eigentlich noch nicht aufgefallen, das "Dein" Avatar ein bisschen zu gross geraten ist!?
Verfasst: Donnerstag 24. Januar 2008, 19:20
von Imperator
Was ist denn ein NichtKlauenBild?
Und wie ich mich vorhin verbessert habe: Der Gegner soll immer auf den Spieler zulaufen.
Verfasst: Freitag 25. Januar 2008, 07:44
von Damaskus
@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
Verfasst: Freitag 25. Januar 2008, 14:26
von Imperator
Ne, ist mir wirklich nicht aufgefallen. Bei mir war es ganz normal.
Verfasst: Samstag 26. Januar 2008, 12:56
von Imperator
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.