Wenn es keine Klasse ist, hat man nur ein PingPong Spiel. Aber bei einer Klasse kann man auch das machen:
Code: Alles auswählen
Spielfeld(self).pack()
Spielfeld(self).pack()
Code: Alles auswählen
Spielfeld(self).pack()
Spielfeld(self).pack()
Ist klar, dass er sich nicht mehr meldete. Es kommt ein neuer User in das Forum. Man sollte ihn doch herzlich willkommen heißen. Und man sollte ihm doch helfen, den Fehler zu finden, deshalb fragt er ja hier an. Und was tust Du?Melewo hat geschrieben:Hier ist gar keiner an der Reihe, mit Ausnahme des Fragestellers. Der Fragesteller ist der einzige hier, der an der Reihe wäre und zwar damit, sich in den nächsten Wochen und Monaten erst einmal tiefgehender mit Python zu beschäftigen, bevor er dieses oder ein anderes Spiel erneut programmieren möchte. Wobei darauf zu achten wäre, hatte Sirius3 ihm in seiner ersten Antwort erklärt. Wenn er dazu weitere Fragen gehabt hätte, hätte er sich melden können. Doch das tat er nicht.Alfons Mittelmeyer hat geschrieben:aber ich habe schon genug getan und würde sagen, dass Du jetzt auch mal an der Reihe bist.
Also ein freundliches Willkommen ist das nicht. Und was Du dann bringst, ist ja der absolute Hammer.Melewo hat geschrieben:Irgendwie habe ich den Eindruck, Du könntest den ersten Preis gewonnen haben, in Bezug auf die Anzahl von globalen Variablen, deren Verwendung man eigentlich vermeiden sollte.
Der Code war vollkommen in Ordnung, bis auf den Fehler, dass etwas nicht eingerückt war. Und geklärt sollte jetzt auch sein, dass eine KLasse im vorliegenden Fall auch gar nichts bringtMelewo hat geschrieben:Tue Dir selbst einen Gefallen und fange noch einmal von vorne an
Wenn Dir BlackJack und Sirius3 wertvolle Antworten gegeben hatten, das gibt Dir lange nicht das Recht, Dich hier als Richter aufzuspielen, was bei einem Programm in Ordnung ist oder nicht. Und so etwas, wie dem User den Eindruck zu vermitteln, dass sein Kode Kacke sei, er sich hier nicht mehr blicken lassen solle, bis er es besser kann und er seinen Code wegwerfen und neu anfangen soll, schadet dem Forum extrem. Der User wird sich wahrscheinlich hier nicht mehr blicken lassen.Melewo hat geschrieben:Als ich hier Anfang Mai einen ersten Entwurf von einem Script vorstellte, hatten mir BlackJack und Sirius3 Antworten gegeben, mit denen konnte man etwas anfangen, auch wenn man nicht alles gleich so umgesetzt, verstanden oder eingesehen hat. Aber man hat es im Hinterkopf behalten, um einen Teil davon zukünftig mit einfließen zu lassen.
Wer veranstaltet hier einen Zirkus? Und wenn es um solche Programme geht, dann bin ich kein Prinzipienreiter, wie manch andere im Forum. Ich kann beurteilen, ob bei so einem Programm die Verwendung einer Klasse einen Vorteil bringt oder nicht. Und in diesem Fall bringt sie keinen, außer wenn man mehrere PingPong Spiele gerne gleichzeitig hätte.Melewo hat geschrieben:Wenn da einer so einen Zirkus wie Du veranstaltet hätte, dabei dann noch diese laufenden Streitereien, um nicht zu sagen fragwürdige Besserwisserei, dann hätte ich mich sicherlich auch so schnell nicht mehr in diesem Forum blicken lassen.
Das war 1a Top Code, wie man ihn bei einem Top Down Entwurf schreibt. Meinst Du ich soll solche Äußerungen einfach hinnehmen? Natürlich nicht. Also entgegne ich etwas. Aber hört es damit auf? Nein, es geht weiter und weiter und weiter und immer kommen neue solche Sachen wie:Sirius3 hat geschrieben:@phbrue: bitte schnell vergessen, was Alfons da schreibt, es sei denn Du willst bleibende Schäden beim Programmieren behalten.
Ich hatte lediglich für den bestehenden Code einen Teil verbessert, damit er lesbarer wird. Warum wird das jetzt als Quatsch bezeichnet, nur weil ich nicht das ganze Programm umgeschrieben habe? Ich kann doch dem TO zeigen, wie er sein Programm lesbarer gestaltet. Wieso soll ich da sein ganzes Programm umschreiben, damit Sirius3 das nicht als Quatsch bezeichet. Soll er es doch selber umschreiben.Sirius3 hat geschrieben:Wenn Du keine guten Programme postest, sondern nur Quatsch, dann lass das bitte sein.
Ein Einsteiger kann nicht viel von jemanden lernen, der versucht Pfuscharbeit auszubügeln, sondern nur vor von demjenigen, der ihm sagt, wenn etwas blanke Pfuscharbeit ist. Und bei über ein Dutzend globale Variablen in einem Code von unter 100 Zeilen, da war es halt nichts weiter als Pfusch und der Fragesteller muss sich halt überlegen, ob er Python lernen möchte oder nicht. Doch wenn er es lernen möchte, muss er noch einmal von vorn mit so einem Script beginnen.Alfons Mittelmeyer hat geschrieben:Ist klar, dass er sich nicht mehr meldete. Es kommt ein neuer User in das Forum. Man sollte ihn doch herzlich willkommen heißen. Und man sollte ihm doch helfen, den Fehler zu finden, deshalb fragt er ja hier an. Und was tust Du?
Also ein freundliches Willkommen ist das nicht. Und was Du dann bringst, ist ja der absolute Hammer.Melewo hat geschrieben:Irgendwie habe ich den Eindruck, Du könntest den ersten Preis gewonnen haben, in Bezug auf die Anzahl von globalen Variablen, deren Verwendung man eigentlich vermeiden sollte.Der Code war vollkommen in Ordnung, bis auf den Fehler, dass etwas nicht eingerückt war. Und geklärt sollte jetzt auch sein, dass eine KLasse im vorliegenden Fall auch gar nichts bringtMelewo hat geschrieben:Tue Dir selbst einen Gefallen und fange noch einmal von vorne an
Wenn Du mit Pfuscharbeit daherkommst, dann mußt Du Dich vorher selbst aufs Korn nehmen. Hier hast Du nämlich bereits selber bei nur 15 Zeilen Code schon drei globale Variablen: viewtopic.php?f=1&t=41196#p314791Melewo hat geschrieben:Ein Einsteiger kann nicht viel von jemanden lernen, der versucht Pfuscharbeit auszubügeln, sondern nur vor von demjenigen, der ihm sagt, wenn etwas blanke Pfuscharbeit ist. Und bei über ein Dutzend globale Variablen in einem Code von unter 100 Zeilen, da war es halt nichts weiter als Pfusch und der Fragesteller muss sich halt überlegen, ob er Python lernen möchte oder nicht. Doch wenn er es lernen möchte, muss er noch einmal von vorn mit so einem Script beginnen.
Dieser Code vom TO war kein Beispiel für Code, den man präsentiert, damit sich andere ein Beispiel nehmen. Es war Code wie man ihn für sich selber schreibt. Und da will man nicht so viel tippen.Melewo hat geschrieben:Und wenn Du hier allen Ernstes behaupten möchtest, dass der Code bis auf einen Fehler völlig in Ordnung war, na dann kann wohl von Dir auch kaum einer etwas lernen.
Code: Alles auswählen
class Var: pass
def main():
# constants ====================
FIELD_WIDTH = 800
FIELD_HEIGHT = 400
BALL_SIZE = 20
RACKET_SPEEED = 20
RACKET_HEIGHT = 60
RACKET_WIDTH = 20
# variables =====================
score = Var()
racket_ypos = Var()
# es geht auch
def ball(): pass
score.left = score.right = 0
racket_ypos.left = racket_ypos.right = (FIELD_HEIGHT - RACKET_HEIGHT)/2
ball.x , ball.y = RACKET_WIDTH , (FIELD_HEIGHT - BALL_SIZE)/2
ball.dx = ball.dy = 15
ball.playing = 0
# sonstiger Code würde folgen
main()
Code: Alles auswählen
import tkinter as tk
class Var: pass
def main():
# constants ====================
FIELD_WIDTH = 800
FIELD_HEIGHT = 400
BALL_SIZE = 20
RACKET_SPEEED = 20
RACKET_HEIGHT = 60
RACKET_WIDTH = 20
# variables =====================
score = Var()
racket_ypos = Var()
ball = Var()
score.left = score.right = 0
racket_ypos.left = racket_ypos.right = (FIELD_HEIGHT - RACKET_HEIGHT)/2
ball.x , ball.y = RACKET_WIDTH , (FIELD_HEIGHT - BALL_SIZE)/2
ball.dx = ball.dy = 15
ball.playing = 0
# widgets =======================
win = tk.Tk();
win.title("Pong")
playing_field = tk.Canvas(win, bg='black',height=FIELD_HEIGHT, width=FIELD_WIDTH)
playing_field.pack()
ping_pong_ball = playing_field.create_oval(ball.x, ball.y, ball.x+BALL_SIZE, ball.y+BALL_SIZE, width=2, fill='white')
line = playing_field.create_line(FIELD_WIDTH/2, 0, FIELD_WIDTH/2, FIELD_HEIGHT, width=4, fill="white", dash=(4, 8 ))
left_racket = playing_field.create_line(RACKET_WIDTH, racket_ypos.left, RACKET_WIDTH, racket_ypos.left+RACKET_HEIGHT, width=10, fill="white")
right_racket = playing_field.create_line(FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right, FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right+RACKET_HEIGHT, width=10, fill="white")
# Create the score text
counter=playing_field.create_text(FIELD_WIDTH/2, 20, text='0:0', font=('courier', 20), fill="white")
# bindings ======================
def lup(event):
if racket_ypos.left > RACKET_SPEEED:
racket_ypos.left=racket_ypos.left-RACKET_SPEEED
def ldown(event):
if racket_ypos.left < (FIELD_HEIGHT-RACKET_HEIGHT-RACKET_SPEEED):
racket_ypos.left=racket_ypos.left+RACKET_SPEEED
def rmove(event):
ypos = event.y
if ypos > 0 and ypos < (FIELD_HEIGHT-RACKET_HEIGHT): # if in range
racket_ypos.right = ypos
def startit(event):
ball.playing = 1
# Use the following keys to move the racket
win.bind('q', lup)
win.bind('a', ldown)
win.bind('<B1-Motion>', rmove)
win.bind('<space>', startit) # start game by hitting space
# game sequence ===============================================
def move():
if wenn_die_runde_nicht_zu_ende_ist():
bewegt_sich_der_ball_ueber_das_spielfeld()
if wenn_der_ball_am_oberen_rand_anstoesst():
dann_soll_der_ball_sich_wieder_nach_unten_bewegen()
elif wenn_der_ball_am_unteren_rand_anstoesst():
dann_soll_der_ball_sich_wieder_nach_oben_bewegen()
if wenn_der_ball_auf_den_linken_schlaeger_knallt():
dann_soll_er_vom_linken_schlaeger_zurueckprallen()
elif wenn_der_ball_auf_den_rechten_schlaeger_knallt():
dann_soll_er_vom_rechten_schlaeger_zurueckprallen()
if wenn_der_ball_ins_rechte_aus_geht():
dann_erhoehe_die_trefferzahl_fuer_den_linken_spieler()
positioniere_den_ball_auf_der_startposition_fuer_den_rechten_spieler()
und_die_runde_ist_zu_ende()
elif wenn_der_ball_ins_linke_aus_geht():
dann_erhoehe_die_trefferzahl_fuer_den_rechten_spieler()
positioniere_den_ball_auf_der_startposition_fuer_den_linken_spieler()
und_die_runde_ist_zu_ende()
schlaeger_ball_und_treffer_darstellen()
win.after(50, move)
def wenn_die_runde_nicht_zu_ende_ist():
return ball.playing
def bewegt_sich_der_ball_ueber_das_spielfeld():
ball.x, ball.y = ball.x +ball.dx, (ball.y+ball.dy)
def positioniere_den_ball_auf_der_startposition_fuer_den_linken_spieler():
ball.x,ball.y,ball.dx = RACKET_WIDTH+10, racket_ypos.left+(RACKET_HEIGHT-BALL_SIZE)/2, abs(ball.dx)
def positioniere_den_ball_auf_der_startposition_fuer_den_rechten_spieler():
ball.x,ball.y,ball.dx = FIELD_WIDTH-RACKET_WIDTH-10, racket_ypos.right+(RACKET_HEIGHT-BALL_SIZE)/2,-abs(ball.dx)
def wenn_der_ball_am_oberen_rand_anstoesst():
return ball.y > (FIELD_HEIGHT-BALL_SIZE)
def dann_soll_der_ball_sich_wieder_nach_unten_bewegen():
ball.y, ball.dy = FIELD_HEIGHT-BALL_SIZE, -ball.dy
def wenn_der_ball_am_unteren_rand_anstoesst():
return ball.y < 0
def dann_soll_der_ball_sich_wieder_nach_oben_bewegen():
ball.y, ball.dy= 0, -ball.dy
def wenn_der_ball_ins_rechte_aus_geht():
return ball.x > (FIELD_WIDTH-BALL_SIZE)
def wenn_der_ball_ins_linke_aus_geht():
return ball.x < 0
def dann_erhoehe_die_trefferzahl_fuer_den_linken_spieler():
score.left=score.left+1 # increment score for left player
def dann_erhoehe_die_trefferzahl_fuer_den_rechten_spieler():
score.right=score.right+1 # increment score for right player
def wenn_der_ball_auf_den_linken_schlaeger_knallt():
return ball.x <= RACKET_WIDTH and ball.y>racket_ypos.left and ball.y < (racket_ypos.left+RACKET_HEIGHT)
def dann_soll_er_vom_linken_schlaeger_zurueckprallen():
ball.x, ball.dx = RACKET_WIDTH+5, -ball.dx
def und_die_runde_ist_zu_ende():
ball.playing = 0 # stop the game
def wenn_der_ball_auf_den_rechten_schlaeger_knallt():
return ball.x >= (FIELD_WIDTH-RACKET_WIDTH-BALL_SIZE) and ball.y >= racket_ypos.right and ball.y <= (racket_ypos.right+RACKET_HEIGHT)
def dann_soll_er_vom_rechten_schlaeger_zurueckprallen():
ball.x, ball.dx = (FIELD_WIDTH-RACKET_WIDTH-BALL_SIZE-5), -ball.dx
def schlaeger_ball_und_treffer_darstellen():
playing_field.coords(ping_pong_ball, ball.x, ball.y, ball.x+BALL_SIZE, ball.y+BALL_SIZE)
# draw current score
playing_field.itemconfigure(counter, text=str(score.left) + ":" + str(score.right))
# Change the positon of the two rackets
playing_field.coords(right_racket, FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right, FIELD_WIDTH-RACKET_WIDTH, racket_ypos.right+RACKET_HEIGHT)
playing_field.coords(left_racket, RACKET_WIDTH, racket_ypos.left, RACKET_WIDTH, racket_ypos.left+RACKET_HEIGHT)
# == start game ======================
move() # draw next sequence
win.mainloop()
main()
Code: Alles auswählen
GRAVITY_CONSTANT = 9.81 # m/s^2
Mir ist nicht klar wovon du da redest. Niemand hat Alfons irgendwo rausgeworfen. Das mag mancher sich wuenschen, aber es ist ein grosser Schritt, und er ist schlicht nicht gegangen worden.stefanxfg hat geschrieben:Ich kann es nicht verstehen, warum man hier persönlich wird. Das Forum soll doch als Spielwiese für Diskussionen offen sein. Natürlich sollen und können verschiedenste Herangehensweisen diskutiert werden. Dabei können Vor- und Nachteile erörtert werden. Es gibt doch den Spruch: " Es führen viele Wege nach Rom.
Ihr könnt und dürft doch nicht über richtig und falsch urteilen, sondern darauf hinweisen, dass man mit der oder der Methodik durchaus unvorhergesehene Systemverhalten erzeugt. (z.B. globale Variablen definieren, obwohl es schön ist g=9,81 m/s^2 als global zu haben)
....
Im Übrigen appeliere ich an die Moderatoren auch mal an ihre Anfänge zu denken und Alfons wieder zuzulassen. Er zeigt euch , dass andere Wege, andere Gesichtspunkte, andere Hernagehensweisen möglich sind. Bitte verwerft nicth alles. Es geht auch anders, Wie gesagt, viele Wege führen ans Ziel.
Dafuer, das du ihn nicht verteidigen moechtest, springst du recht nachdruecklich in die Bresche fuer ihn.stefanxfg hat geschrieben:Hallo __deets__,
ich bin mit Alfons noch im Kontakt. Mir hat er mitgeteil, dass er sein Login gesperrt ist. Daher habe ich mich hier zu Wort gemeldet. Aber nicht um ihn zu verteidigen, sondern um zu sagen, dass ich mir die Art und Weise der Diskussionen nicht gefällt. Jedenfalls kann es nicht sein, dass man als Neuling für offentsichtliche Fehler an den Pranger gestellt wird.
Ich möchte und werde darüber nicht weiter diskutieren. Ich lese jedenfalls solche Kommentare mit großem Bedauern.
stefanxfg hat geschrieben:Hallo __deets__,
ich bin mit Alfons noch im Kontakt. Mir hat er mitgeteil, dass er sein Login gesperrt ist.