Seite 1 von 1

Denkproblem: Läufer

Verfasst: Samstag 13. Juni 2009, 19:17
von jonas
Hi Leute,
weiß gar nicht mehr wie ich darauf gekommen war
aber ich habe hier mal ein kleines Beispiel:

Code: Alles auswählen

import random

class Laeufer (object):

    def __init__ (self, pos, speedX, speedY):

        self.pos = pos
        self.speedX = speedX
        self.speedY = speedY

    def Schritt_machen (self):

        self.speedX = self.speedX * random.choice([1,-1])
        self.speedY = self.speedY * random.choice([1,-1])

        self.pos[0] += self.speedX
        self.pos[1] += self.speedY

if __name__ == "__main__":

    pos = [random.randint(0,100), random.randint(0,100)]
    speedX = random.randint(1,5)
    speedY = random.randint(1,5)

    L = Laeufer(pos,speedX,speedY)

    for i in range(100):

        print "Position (%i/%i)" % (L.pos[0], L.pos[1])
        L.Schritt_machen()
Jetzt bräuchte ich einen anderen Läufer der meinen
unterwegs einholt. Der andere Läufer soll sich meinem
anpassen, also wenn mein Läufer einen höheren x Wert
hat, als der andere muss dieser seinen x Speed bei
jedem Schritt dazuzählen bis er meinen eingeholt hat.
Und möglichst auch nicht über das Ziel hinausschiessen,
sonst muss er das ja wieder ausgleichen. (*******,
das klingt total verwirrend :( ) Hoffe ihr wisst was ich
meine... Ich habe mich schon ein paar Mal an dieser
Aufgabe versucht aber ich bekomme keine gescheite
Klasse hin, die was in die Richtung kann.... :cry:

Hoffe ihr könnt helfen.
Lg, Jonas 8)

Verfasst: Samstag 13. Juni 2009, 19:34
von EyDu
In den Code sind gleich ein paar Hinweise zu deinem Code eingebaut ;-)

Code: Alles auswählen

class Verfolger(Laeufer):
    def __init__(self, ziel, pos, speed):
        Laeufer._init__(pos, speed)
        self.ziel = ziel
    
    def schritt_machenn(self):
        #der andere macht den ersten Schritt
        self.ziel.schritt_machen()
        
        #ich laufe hinterher
        ...

laeufer = Laeufer(...)
verfolger = Verfolger(laeufer, ...)
verfolger.schritt_machen()

Verfasst: Samstag 13. Juni 2009, 19:39
von jonas
Danke für die Antwort EyDu!
Scheint als hätte ich mich zu doof ausgedrückt... :oops:
Ich wollte gerade wissen, wie er den anderen verfolgt um
ihn irgendwann zu erreichen...
Lg, Jonas :oops:

Verfasst: Samstag 13. Juni 2009, 20:46
von BlackJack
Beim Code von EyDu hat der Verfolger eine Referenz auf den Läufer, kann also dessen Position und Geschwindigkeit abfragen. Und kann sich dann halt selbst entsprechend in die Richtung mit einer angemessenen Geschwindigkeit bewegen.

*Das* müsstest Du nun aber schon selber machen, sonst hätte jemand anders die Hausaufgaben für Dich gelöst. ;-)

Verfasst: Samstag 13. Juni 2009, 20:50
von jonas
So hab ich das wohl noch nicht betrachtet, ich werde es mit EyDu's
Ansatz nochmal versuchen :D
btw: Sind keine Hausaufgaben, dient nur zu meinem Vergnügen :lol:
Lg, Jonas 8) Danke

Verfasst: Samstag 13. Juni 2009, 21:19
von jonas
Irgendwie schaff ich es nicht das sie sich näher kommen...
Mein Code sieht jetzt so aus:

Code: Alles auswählen

import random

class Laeufer (object):


    def __init__(self, pos, speedX, speedY):
        self.pos = pos
        self.speedX = speedX
        self.speedY = speedY

    def schritt_machen (self):
        self.speedX = self.speedX * random.choice([1,-1])
        self.speedY = self.speedY * random.choice([1,-1])
        self.pos[0] += self.speedX
        self.pos[1] += self.speedY

class Verfolger(Laeufer):

    
    def __init__(self, ziel, pos, speedX, speedY):
        Laeufer.__init__(self, pos, speedX, speedY)
        self.ziel = ziel
   
    def verfolgen(self):
        self.ziel.schritt_machen()
        if self.ziel.pos[0] > self.pos[0]:
            self.speedX = self.speedX * -1
        elif self.ziel.pos[0] == self.pos[0]:
            self.speedX = 0
        else:
            self.speedX = abs(self.speedX)
        if self.ziel.pos[1] > self.pos[1]:
            self.speedY = self.speedY * -1
        elif self.ziel.pos[1] == self.pos[1]:
            self.speedY = 0
        else:
            self.speedY = abs(self.speedY)
        self.pos[0] += self.speedX
        self.pos[1] += self.speedY

        

if __name__ == "__main__":

    pos1 = [random.randint(0,100), random.randint(0,100)]
    pos2 = [random.randint(0,100), random.randint(0,100)]
    speedX1 = random.randint(1,5)
    speedY1 = random.randint(1,5)
    speedX2 = random.randint(1,5)
    speedY2 = random.randint(1,5)

    L = Laeufer(pos1,speedX1,speedY1)
    V = Verfolger(L, pos2, speedX2, speedY2)

    steps = 0

    while L.pos != V.pos:
        #~ print "Position (%i/%i)" % (L.pos[0], L.pos[1])
        print 'Abstand x=%i;y=%i' % (L.pos[0]-V.pos[0], L.pos[1]-V.pos[1])
        V.verfolgen()
        steps += 1
    print steps
Die Abstände gehen häufig einfach extrem ins Negative...
Vllt. wisst ihr ja Rat. :(
Lg, Jonas

Verfasst: Samstag 13. Juni 2009, 22:02
von BlackJack
@jonas: Also wenn ich das jetzt richtig interpretiere, mal nur für den 1D-Raum, dann sagst Du, wenn der Verfolger weiter rechts ist, dann soll er die Richtung ändern. Dann überleg mal was passiert, wenn den anderen dabei nicht sofort einholt und im nächsten Schritt immer noch weiter rechts ist!

Edit: Beschränke das ganze doch erst einmal auf eine Dimension und auf einen Läufer der nicht läuft. Deine bisherige Implementierung dürfte nämlich nicht einmal jemanden fangen, der sich gar nicht bewegt.