Seite 1 von 1
Turtleproblem amateur
Verfasst: Donnerstag 23. Januar 2014, 19:11
von 123gro
Hallo ich hab ein problem:
ich krieg es nicht nicht hin , dass zwei Turtles unabhängig voneinander per tastendruck
gesteuert werden können!
(ich bin dabei ein kleines spiel zu programmieren, wo man zu
zweit auf einer tastatur mit rittern kämpfen kann) aber wenn ich die taste drücke
die die eine turtle nach links "fahren" lässt, und dann die andere turtle auch bewege hört die erste auf:
also kann man die turtles nur mit ganz vielen tastendrücken nacheineander in kurzem abstand unabhängig voneinander bewegen
Meine Frage ist: kann man zwei Turtles unabhängig voneinander per tastendruck steuern also geht das mit python überhaupt
und wenn ja, wie
Mein Programmcode ist im Moment so:
Code: Alles auswählen
from turtle import*
import sys
sys.setrecursionlimit(20000)
setup(width=0.45, height=0.3)
tracer=False
bgpic("hintergrund.gif")
hideturtle()
pu();fd(500)
screen=Screen()
ritter1=Turtle(visible=False)
ritter2=Turtle(visible=False)
leben1=3
leben2=3
ritter1.pu()
ritter2.pu()
ritter2.fd(200)
ritter2.lt(90)
ritter2.fd(5)
ritter2.lt(90)
ritter1.bk(200)
ritter1.lt(90)
ritter1.fd(5)
ritter1.rt(90)
ritter1.showturtle()
ritter2.showturtle()
tracer=True
ritter1.speed(1)
def v():
ritter1.fd(1)
def r():
ritter1.bk(1)
def vor():
ritter2.fd(1)
def rück():
ritter2.bk(1)
def schlag1():
global leben2
leben2=leben2-1
def schlag2():
global leben1
leben1=leben1-1
onkeypress(schlag1,"space")
onkeypress(v,"d")
onkeypress(r,"a")
onkeypress(vor,"Left")
onkeypress(rück,"Right")
screen.listen()
Eine Antwort wäre sehr nett

Re: Turtleproblem amateur
Verfasst: Donnerstag 23. Januar 2014, 19:46
von BlackJack
@123gro: In Python geht das. Nur mit dem `turtle`-Modul geht das vielleicht. Aber wahrscheinlich nur auf eine Art bei der Programmierer Weinkrämpfe bekommen.

Also zum Beispiel wird man wohl nicht ohne ``global`` auskommen, beziehungsweise wenn man gut genug Programmieren kann ohne ``global`` verwenden zu müssen, dann braucht man `turtle` nicht mehr.
Was Du aber auf jeden Fall ganz schnell vergessen solltest ist `sys.setrecursionlimit()`. Das ist gefährlich und total unnötig.
Re: Turtleproblem amateur
Verfasst: Freitag 24. Januar 2014, 13:00
von 123gro
ist global ein modul?
Re: Turtleproblem amateur
Verfasst: Freitag 24. Januar 2014, 13:07
von BlackJack
@123gro: Nein das ist ein Schlüsselwort — welches Du zweimal in Deinem Quelltext verwendest. Schlüsselworte der Sprache kann man in Python nicht als Namen verwenden, also auch nicht um ein Modul zu benennen.
Re: Turtleproblem amateur
Verfasst: Freitag 24. Januar 2014, 13:23
von 123gro
ah ich hab grad gemerkt das du das global meinst was ich kenne
aber trotzdem... ich hab doch schon global verwendet und außerdem
verstehe ich nicht wo ich global einsetzen soll um zu erzielen das die Turtles
normal gesteuert werden können

Re: Turtleproblem amateur
Verfasst: Freitag 24. Januar 2014, 18:44
von BlackJack
@123gro: So konkret war das nicht gemeint, sondern eher allegemein das man ohne Klassen so etwas sehr wahrscheinlich nicht ohne den Einsatz von ``global`` hinbekommt. Wenn man aber Objektorientierung lernt, ist man weit über das `turtle`-Modul hinaus.
Letztendlich wird man das mit dem `turtle`-Modul wohl nicht hinbekommen weil die API so wie ich das sehe das *loslassen* von Tasten nicht als Ereignis anbietet auf das man reagieren könnte.
Re: Turtleproblem amateur
Verfasst: Freitag 24. Januar 2014, 21:10
von 123gro
Also ich habe jetzt eine Klasse Ritter definiert.
Aber was für ein Zeichenmodul außer turtle soll ich jetzt nehmen?
Re: Turtleproblem amateur
Verfasst: Freitag 24. Januar 2014, 21:11
von BlackJack
@123gro: `turtle` verwendet `Tkinter` (oder `tkinter`, je nach Python-Version).
Re: Turtleproblem amateur
Verfasst: Freitag 24. Januar 2014, 21:41
von 123gro
aber wie benutze ich tkinker
Re: Turtleproblem amateur
Verfasst: Freitag 24. Januar 2014, 22:01
von BlackJack
@123gro: Was erwartest Du denn jetzt auf diese Frage für eine Antwort? Programmieren lernen und dann die Dokumentation zu den verwendeten Modulen lesen. In der Dokumentation zur Tk-Anbindung gibt es auch Links zu weiterer Dokumentation im Netz.
Re: Turtleproblem amateur
Verfasst: Sonntag 26. Januar 2014, 14:49
von 123gro
BlackJack hat geschrieben:@123gro: So konkret war das nicht gemeint, sondern eher allegemein das man ohne Klassen so etwas sehr wahrscheinlich nicht ohne den Einsatz von ``global`` hinbekommt. Wenn man aber Objektorientierung lernt, ist man weit über das `turtle`-Modul hinaus.
Letztendlich wird man das mit dem `turtle`-Modul wohl nicht hinbekommen weil die API so wie ich das sehe das *loslassen* von Tasten nicht als Ereignis anbietet auf das man reagieren könnte.
Ich glaube onkeyrelease bemerkt das *loslassen* von Tasten oder?
wenn ja , wie muss ich es dann einbauen

Re: Turtleproblem amateur
Verfasst: Sonntag 26. Januar 2014, 15:08
von BlackJack
@123gro: Ah, die Funktion gibt es in Python 2.7 noch nicht. Die benutzt man genau wie die `onkey()`-Funktion, man kann damit ein Ereignis mit einer Funktion oder Methode verknüpfen. Du musst halt „Buch führen” welche Tasten der Benutzer gedrückt aber noch nicht losgelassen hat und regelmässig auf den aktuellen Zustand reagieren. Dafür kann man eine Funktion oder Methode mit der `ontimer()`-Funktion zeitverzögert ausführen lassen und das halt immer wieder tun, also am Ende der Funktion beispielsweise die Funktion selbst wieder zum Aufrufen nach einer gewissen Zeit. Der Docstring von `ontimer()` hat ein einfaches Beispiel dafür.
Re: Turtleproblem amateur
Verfasst: Sonntag 26. Januar 2014, 15:49
von 123gro
Also ganz viele if-Anweisungen...
Aber wieso soll man ein Ereignis einprogrammieren, dass erst eintritt wenn eine Taste
losgelassen wird, wenn es auch mit onkeypress geht? Soll ich eigentlich dann vor und nach jedem 'ritter1.bk(1)'-[Code Z.36]
einen 'ontimer(irgendwas)'-Aufruf machen?
Re: Turtleproblem amateur
Verfasst: Sonntag 26. Januar 2014, 16:52
von BlackJack
@123gro: So wirklich viele ``if``-Anweisungen sollten das nicht werden müssen. Wenn die sich nur vor und zurück bewegen können, dann sehe ich da jetzt erst einmal gar keine ``if``-Anweisung, es sei denn man möchte eine der beiden Tasten dafür priorisieren, was wohl Sinn machen würde.
Es geht ja nicht nur mit `onkeypress()` beziehungsweise nur wenn der Ritter nicht in ständiger Bewegung sein soll und es keinen anderen Tastendruck gibt, der den Ritter anhält.
Dein Ritter hört auch nicht auf sich zu bewegen weil Du eine Taste für den anderen Ritter betätigst, sondern weil ein Tastendruck halt immer nur eine Einheit weit läuft und man dann einen erneuten Tastendruck braucht um wieder eine Einheit zu laufen. So hast Du das programmiert.
Den `ontimer()`-Aufruf würde ich in *eine* Funktion stecken die regelmässig alles nötige Aufruft um einen „Spielschritt” zu machen.
Re: Turtleproblem Amateur
Verfasst: Freitag 31. Januar 2014, 14:36
von 123gro
Code: Alles auswählen
from turtle import*
title("knightfight")
class Ritter(Turtle):
def jump(t,distanz,winkel=None):
t.lt(winkel)
t.pu()
t.fd(distanz)
t.lt(winkel)
def tot1():
onkeypress(None,"w")
onkeypress(None,"a")
onkeypress(None,"d")
screen.listen()
def tot2():
onkeypress(None,"Up")
onkeypress(None,"Left")
onkeypress(None,"Right")
screen.listen()
def jump(t,distanz,winkel=None):
t.lt(winkel)
t.pu()
t.fd(distanz)
t.lt(winkel)
tracer=False
screen=Screen()
setup(width=0.45, height=0.3)
bgpic("hintergrund.gif")
ritter1=Ritter()
ritter2=Ritter()
l1=Turtle()
l2=Turtle()
leb1=3
leb2=3
for bn in("r1s0.gif","r1s1.gif","r1s2.gif","r1s3.gif",
"r2s0.gif","r2s1.gif","r2s2.gif","r2s3.gif","herz3.gif",
"herz2.gif","herz1.gif"):
screen.register_shape(bn)
ritter1.pu()
ritter2.pu()
ritter1.hideturtle()
ritter2.fd(200)
ritter2.lt(90)
ritter2.fd(18)
ritter2.lt(90)
ritter1.bk(200)
ritter1.lt(90)
ritter1.fd(18)
ritter1.rt(90)
l1.speed(0)
l2.speed(0)
jump(l1,200,135)
jump(l2,200,45)
ritter1.showturtle()
for i in((ritter1,"r1s0.gif"),(ritter2,"r2s0.gif"),
(l1,"herz3.gif"),(l2,"herz3.gif")):
objekt,bild=i
objekt.shape(bild)
tracer=True
def schlag1():
global leb2
leb2=leb2-1
if leb2==3:
l2.shape("herz3.gif")
if leb2==2:
l2.shape("herz2.gif")
if leb2==1:
l2.shape("herz1.gif")
if leb2==0:
l2.hideturtle()
tot2()
def schlag2():
global leb1
leb1=leb1-1
if leb1==3:
l1.shape("herz3.gif")
if leb1==2:
l1.shape("herz2.gif")
if leb1==1:
l1.shape("herz1.gif")
if leb1==0:
l1.hideturtle()
tot1()
ritter1.speed(1)
ritter2.speed(0)
z=0
def v():
for i in range(4):
global z
ritter1.fd(5)
ontimer(None,200)
if z<4:
z=z+1
if z>=4:
z=0
ritter1.shape("r1s{0}.gif".format(z))
def r():
tracer=False
ritter1.bk(3)
y=0
def vor():
for i in range(4):
global y
ritter2.fd(5)
ontimer(None,200)
if z<4:
y=y+1
if y>=4:
y=0
ritter2.shape("r2s{0}.gif".format(y))
def rück():
tracer=False
ritter2.bk(3)
tracer=True
onkeypress(schlag1,"w")
onkeypress(v,"d")
onkeypress(r,"a")
onkeypress(vor,"Left")
onkeypress(rück,"Right")
onkeypress(schlag2,"Up")
screen.listen()
(r1s0 z.B. bedeutet ritter1_schritt0 usw.)
bei einem tastendruck läuft der ritter jetzt einen schritt)
So...das ist der Code den ich zum Teil ohne deine Tipps erweitert habe
aber wenn ich jetzt den einen Ritter bewege und kurz nach dem 1. Tastendruck den 2.Ritter bewege stoppt erst der ritter1 dann läuft ritter2 und dann beendet riiter1 seinen schritt
das heißt ja dann schon , dass Ritter1 von Ritter2 bei der Fortbewegung aufgehalten wird oder?

Re: Turtleproblem amateur
Verfasst: Freitag 31. Januar 2014, 15:07
von 123gro
außerdem hab ich eine andere frage zu meinem ritterspiel :
wie kann man festellen wie weit zwei turtles (die ritter) voneinander entfernt sind?
Re: Turtleproblem amateur
Verfasst: Freitag 31. Januar 2014, 16:32
von 123gro
PS: kann man den abstand zwischen zwei turtles mit python feststellen?