Denkproblem: Läufer

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

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)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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()
Das Leben ist wie ein Tennisball.
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

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:
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. ;-)
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

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
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

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
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.
Antworten