PyGame

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Mittwoch 14. Januar 2009, 20:58

Hallo, ich hab mir ein Kleines PyGame spiel, wie worm mit Gegner programmiert, leider funktioniert das nicht richtig und ich bitte um eine kleine Hilfe:

Code: Alles auswählen

import pygame
import random
import thread
import time


class RanWorm:
    def __init__(self, surface, x, y, length):
        self.surface = surface
        self.x = x
        self.y = y
        self.length = length
        self.dir_x = 0
        self.dir_y = -1
        self.body = []
        self.crashed = False
        
        for event in pygame.event.get():
            self.key_event(event)

    def key_event(self, event):
        """ Tastatur-Ereignisse behandeln. """
        zahl=random.randint(1,15)
        if zahl == 1:
            self.dir_x = 0
            self.dir_y = -1
        elif zahl == 2:
            self.dir_x = 0
            self.dir_y = 1
        elif zahl == 3:
            self.dir_x = -1
            self.dir_y = 0
        elif zahl == 4:
            self.dir_x = 1
            self.dir_y = 0

    def move(self):
        """ Wurm bewegen. """
        self.x += self.dir_x
        self.y += self.dir_y

        if (self.x, self.y) in self.body:
            self.crashed = True

        self.body.insert(0, (self.x, self.y))

        if len(self.body) > self.length:
            self.body.pop()
        
    def draw(self):
        for x, y in self.body:
            self.surface.set_at((x, y), (255, 255, 255))

class Worm:
    """ Ein Wurm. """

    def __init__(self, surface, x, y, length):
        self.surface = surface
        self.x = x
        self.y = y
        self.length = length
        self.dir_x = 0
        self.dir_y = -1
        self.body = []
        self.crashed = False

    def key_event(self, event):
        """ Tastatur-Ereignisse behandeln. """
        if event.key == pygame.K_UP:
            self.dir_x = 0
            self.dir_y = -1
        elif event.key == pygame.K_DOWN:
            self.dir_x = 0
            self.dir_y = 1
        elif event.key == pygame.K_LEFT:
            self.dir_x = -1
            self.dir_y = 0
        elif event.key == pygame.K_RIGHT:
            self.dir_x = 1
            self.dir_y = 0

    def move(self):
        """ Wurm bewegen. """
        self.x += self.dir_x
        self.y += self.dir_y

        if (self.x, self.y) in self.body:
            self.crashed = True

        self.body.insert(0, (self.x, self.y))

        if len(self.body) > self.length:
            self.body.pop()
        
    def draw(self):
        for x, y in self.body:
            self.surface.set_at((x, y), (255, 255, 255))

# Spielfeld-Abmessungen
width = 640 
height = 400

screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
running = True

# Unser Wurm ;-).
w = Worm(screen, width/2, height/2, 200)
r=RanWorm(screen, width/2, height/2, 200)

while running:
    screen.fill((0, 0, 0))
    w.move()
    r.move()
    w.draw()
    def gegner():
        while 1:
            w.move()
            w.draw()
            time.sleep(0.1)
    thread.start_new_thread(gegner,())

    if w.crashed or w.x <= 0 or w.x >= width-1 or w.y <= 0 or w.y >= height-1:
        print "Crash!"
        running = False

    if r.crashed or r.x <= 0 or r.x >= width-1 or r.y <= 0 or r.y >= height-1:
        print "Win!"
        running = False

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            w.key_event(event)
        

    pygame.display.flip()
    clock.tick(240)


Da kommt immer der Fehler raus, es startet nur die eine schlange und man kann einmal die richtung wechseln. Bei zweiten Mal steht dann immer Crash da.

Danke für Hilfe!
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Py19917062
User
Beiträge: 113
Registriert: Freitag 30. Januar 2009, 00:53
Wohnort: Dortmund
Kontaktdaten:

Dienstag 10. Februar 2009, 02:58

also wenn du noch probleme mit dem spiel hast dann kann ich dir was flüstern

ich habe dein spiel getestet und ich glaube es liegt an der zeile 116 bis 121
als ich diese zeilen entfern hab lief das spiel ohne probleme nur man hatte keinen gegner mehr

also hab ich noch r.draw eingesetzt
der gegner hat sich aber nur noch für eine richtung entschieden und das spiel lief langsamer(vlt wegen time.sleep)

also ich weiß nicht genau obs an der definition lag aber eclipse spukte den fehler aus dass es am thread befehl lag
außerdem hast du bei der definition deinen eigenen wurm als gegener definiert

und ich rate dir ab die bewegungen eines gegnerischen wurms dem zufall zu überlassen und entweder versuchen den wurm intiligenter zu machen oder ihn für einen 2ten spieler ersetzen

du könntest vlt auch das spiel prinzip etwas zu verändern, das man sich zB gegenseitig auffressen muss oder den gegenspieler in 2 hälften zerhacken muss dann wär das spiel auch lustiger

die lösung für dein problem könnte auch simpler sein und zwar durch die dummheit des gegnerischen wurms

wenn man nach links läuft und dann sofort nach rechts läuft ohne einen bogen zu machen crasht man auch in sich selbst was dein gegnerischer wurm anscheinend macht weil es nur 4 richtungen gibt, das heißt der gegnerische wurm hat eine 25% chance ins sich selber zu crashen und das bei jeder neuen bewegung...deswegen rate ich ab die bewegungen dem zufall zu überlassen

also ich glaube es liegt einzig und allein an der random funktion
dadurch bewegt sich der gegner wurm auch viel langsamer als der spieler selber weil die range in zeile 23 von 1-15 ist....ist die zahl 14 bewegt sich der gegner nicht aber der spieler selbst schon ist im nächsten ablauf die zahl nicht 1,2,3 oder 4 bewegt sich der gegner wieder nicht

also mit der random funktion solltest du dein wurm nicht steuern
wie gesagt die beste möglichkeit wär ein 2ter spieler
Antworten