Python für Kinder

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
Python-Anfänger
User
Beiträge: 4
Registriert: Samstag 5. Januar 2019, 20:41

Samstag 5. Januar 2019, 20:55

Hallo, mein Sohn (11) sitzt seit zwei Tagen am Rechner und versucht mithilfe eines Python-Buches ein Spiel nachzuprogrammieren. Obwohl er alles abgeschrieben hat, bekommt er trotzdem Fehlmeldungen. Druckfehler sehe ich nicht, und anders kann ich ihm leider nicht helfen. Er möchte so gerne das Ergebnis sehen und ist langsam am Verzweifeln. Kann uns vielleicht jemand helfen? Was übersehen wir?
...Jetzt wollte ich noch ein Screenshot anhängen, sehe aber keine Option :/
__deets__
User
Beiträge: 4209
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 5. Januar 2019, 21:15

Besser als ein Screenshot sind der Code und die Fehlermeldung als Text. Dabei wichtig: Code-Tags benutzen! Das ist der </> Button im Editor.
Python-Anfänger
User
Beiträge: 4
Registriert: Samstag 5. Januar 2019, 20:41

Samstag 5. Januar 2019, 22:07

Hallo deets,

danke erst mal für die Rückmeldung!

Im Buch lauten die Zeilen:
...
entf_bubbles()
score += kollision()
print(score)
...
Und in der Fehlermeldung steht:
NameError: name ‚entf_bubbles‘ ist not defined.
Das gleiche auch mit der kollision

Mir ist klar, dass es nicht viel ist, aber mehr ist da auch nicht. Ich hab nur gehofft, dass man so eine Art Fehlermeldung kennt und eine schnelle Lösung hat. Ansonsten einfach ignorieren :)
Bei uns gibt es leider keine Programmierkurse für dieses Alter, daher greift mein Sohn zu den Büchern und zum Internet. Aber was trotzdem fehlt ist ein Ansprechpartner, falls man doch nicht weiterkommt.

Viele Grüße und ein schönes Wochenende
Marina
Benutzeravatar
sparrow
User
Beiträge: 874
Registriert: Freitag 17. April 2009, 10:28

Samstag 5. Januar 2019, 22:20

Hallo Marina,

über dem Textfeld, in dem du hier schreibst ist ein Button mit einem </> Symbol. Wenn du darauf drückst, erscheinen code-Tags. Dazwischen kopiere bitte den gesamten Quellcode des Spiels.
Die Tags sind wichtig, weil nur dann die Leerzeichen am Anfang einer Zeile erhalten bleiben, und dein Sohn wird dir sagen, dass die bei Python sehr wichtig sind.

Grundlegend heißt die Fehlermeldung ziemlich genau das, was sie auf Englisch aussagt: "entf_bubbles" wurde nicht definiert.
Der Fehler tritt auf, wenn man eine Funktion aufruft und diese nicht gefunden wird. Der Grund dafür ist vielfältig. Es könnte an ein Tippfehler sein. Oder die Funktion befindet sich zum Beispiel auf der falschen Ebene, sprich die Einrückung stimmt nicht.

Um das zu sagen, müsste man aber den Quelltext entsprechend sehen.
Sirius3
User
Beiträge: 9017
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 5. Januar 2019, 22:34

Das Buch tauchte hier schon öfter auf:
viewtopic.php?t=43297
viewtopic.php?f=1&t=41105#p314099

Jedesmal mit der Aussage, dass das nicht viel taugt. Leider lernt man beim bloßen abtippen, ohne zu verstehen, was man da schreibt, nicht wirklich was.
Benutzeravatar
ThomasL
User
Beiträge: 468
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Sonntag 6. Januar 2019, 10:31

Hallo Marina,
wenn dein Sohn 11 Jahre alt ist, vermute ich mal, dass er schon Englisch in der Schule hat.
Englisch lernen bedingt aber auch, dass man sich die Sprache anhört und sich an sie gewöhnt.
Was gibt es Besseres als dies mit dem Interesse am Programmieren zu kombinieren.
Schau dir mal diesen Youtuber hier an: https://www.youtube.com/channel/UC4JX40 ... 4Sg/videos
Er hat eine Reihe von Folgen, die sich mit dem Erlernen von Python beschäftigen:
Folge 1: https://www.youtube.com/watch?v=OFrLs22MDAw und folgende
Dann hat er mehrere Playlists die sich mit der Grafik/Spielprogrammierung beschäftigen:
https://www.youtube.com/watch?v=i6xMBig-pP4
https://www.youtube.com/watch?v=PjgLeP0G5Yw
https://www.youtube.com/watch?v=5tvER0MT14s
https://www.youtube.com/watch?v=uoR4ilCWwKA
Ich könnte mir vorstellen, dass dein Sohn hier sehr schnell viel mehr lernt, als durch das abtippen aus einem Buch,
das mehr als schlecht zu sein scheint.
Viele Grüße, Thomas
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
Benutzeravatar
pixewakb
User
Beiträge: 1154
Registriert: Sonntag 24. April 2011, 19:43

Sonntag 6. Januar 2019, 14:48

Ich glaube, dass das der Mutter und dem Sohn nicht sehr weiterhilft, wenn wir daraufhinweisen, dass das gekaufte Buch nicht viel taugt. Eine Rezension zum Buch unter Amazon wäre hilfreicher für zukünftige Käufer.

@Python-Anfänger: Poste mal den kompletten Inhalt der Skript-Datei, damit man sich ansehen kann, wie die Funktion, die den Fehler wirft, programmiert ist. Dann kann man vielleicht auch rausfinden, was da konkret den Fehler verursacht (wie meine Vorredner). Nach dem Posting werden die Rückmeldungen wahrscheinlich auch hilfreicher bzw. konstruktiver.
Benutzeravatar
ThomasL
User
Beiträge: 468
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Sonntag 6. Januar 2019, 15:12

pixewakb hat geschrieben:
Sonntag 6. Januar 2019, 14:48
@Python-Anfänger: Poste mal den kompletten Inhalt der Skript-Datei, damit man sich ansehen kann, wie die Funktion, die den Fehler wirft, programmiert ist.
Wie bereits von Sirius erwähnt findest du den hier viewtopic.php?t=43297
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
Benutzeravatar
pixewakb
User
Beiträge: 1154
Registriert: Sonntag 24. April 2011, 19:43

Sonntag 6. Januar 2019, 15:18

Ohne es zu testen, denke ich mal, dass der Quellcode von BlackJack lauffähig ist und aus dem Forum kopiert werden kann. @Python-Anfänger: Damit sollte dein Sohn weiterkommen.
Python-Anfänger
User
Beiträge: 4
Registriert: Samstag 5. Januar 2019, 20:41

Sonntag 6. Januar 2019, 18:49

Hallo zusammen,

herzlichen Dank noch einmal für eure Rückmeldungen. Ich habe etwas schlechtes Gewissen, euch mit derartigen "Problemen" zu belästigen. Ich denke, solche Laien wie ich tauchen hier selten auf :). Aber was man alles nicht tut für seine Kinder.

Also ich habe eben das Ganze mit dem Code-Symbol kopiert, wie ihr mir empfohlen habt. Und so sieht es aus:

Code: Alles auswählen

HEIGHT = 500
WIDTH = 800
window = Tk()
window.title("Bubble Blaster(für die 5e)")
c = Canvas(window, width=WIDTH, height=HEIGHT, bg="darkblue")
c.pack()
schiff_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill="red")
SCHIFF_R = 15
MID_X = WIDTH / 2
MID_Y = HEIGHT / 2
c.move(schiff_id, MID_X, MID_Y)
SCHIFF_GESCHW = 10
def schiff_beweg(event):
    if event.keysym == "Up":
        c.move(schiff_id, 0, -SCHIFF_GESCHW)
    elif event.keysym == "Down":
        c.move(schiff_id, 0, SCHIFF_GESCHW)
    elif event.keysym == "Left":
        c.move(schiff_id, -SCHIFF_GESCHW, 0)
    elif event.keysym == "Right":
        c.move(schiff_id, SCHIFF_GESCHW, 0)
c.bind_all("<Key>", schiff_beweg)
from random import randint
bub_id = list()
bub_r = list()
bub_geschw = list()
MIN_BUB_R = 10
MAX_BUB_R = 30
MAX_BUB_GESCHW = 10
GAP =100
def erstelle_bubble():
    x = WIDHT + GAP
    y = randint(0, HEIGHT)
    r = randint(MIN_BUB_R, MAX_BUB_R)
    id1 = c.create_oval(x - r, y - r, x + r, y + r, outline="white")
    bub_id.append(id1)
    bub_r.append(r)
    bub_geschw.append(randint(1, MAX_BUB_GESCHW))
def bewege_bubbles():
    for i in range(len(bub_id)):
        c.move(bub_id[i], -bub_geschw[i], 0)
from time import sleep, time
BUB_CHANCE = 10
TIME_LIMIT = 30
BONUS_SCORE = 1000
score = 0
bonus = 0
ende = time() + TIME_LIMIT
#HAUPTSCHLEIFE
while time() < ende:
    if randint(1, BUB_CHANCE) == 1:
        erstelle_bubble()
    bewege_bubbles()
    entf_bubbles()
    score += kollision()
    if (int(score / BONUS_SCORE)) > bonus:
        bonus += 1
        ende += TIME_LIMIT
    zeige_punkte(score)
    zeige_zeit(int(ende - time()))
    print(score)
    window.update()
    sleep(0.01)
def hole_koord(id_num):
    pos = c.coords(id_num)
    x = (pos[0] + pos[2])/2
    y = (pos[1] + pos[3])/2
    return x, y
def lösche_bubble(i):
    del bub_r[i]
    del bub_geschw[i]
    c.delete(bub_id[i])
    del bub_id[i]
def entf_bubbles():
    for i in range(len(bub_id)-1, -1, -1):
        x, y = hole_koord(bub_id[i])
        if x < -GAP:
            lösche_bubble(i)
from math import sqrt
def distanz(id1, id2):
    x1, y1 = hole_koord(id1)
    x2, y2 = hole_koord(id2)
    return sqrt((x2 - x1)**2 + (y2 - y1)**2)
def kollision():
    points = 0
    for bub in range(len(bub_id)-1, -1, -1):
        if distanz(schiff_id, bub_id[bub]) < (SCHIFF_R + bub_r[bub]):
            points += (bub_r[bub] + bub_geschw[bub])
            lösche_bubble(bub)
    return points
c.create_text(50, 30, text="ZEIT", fill="white" )
c.create_text(150, 30, text="PUNKTE", fill="white" )
time_text = c.create_text(50, 50, fill="white" )
score_text = c.create_text(150, 50, fill="white" )
def zeige_punkte(score):
    c.itemconfig(score_text, text=str(score))
def zeige_zeit(time_left):
    c.itemconfig(time_text, text=str(time_left))
c.create_text(MID_X, MID_Y, \
    text="GAME OVER", fill="white", font=("Helvetica",30))
c.create_text(MID_X, MID_Y, + 30, \
    text="Punkte: "+ str(score), fill="white")
c.create_text(MID_X, MID_Y, + 45, \
    text="Bonus-Zeit: "+ str(bonus*TIME_LIMIT), fill="white")

@ Thomas: vielen Dank für die Links, ich habe diese an meinen Sohn weitergeleitet. Er arbeitet viel mit Youtube-Videos/Tutorials, daher bin ich mir sicher, dass es ihm weiterhilft.

Und was die Bücher für dieses Alter angeht, da haben wir leider nicht die Qual der Wahl auf dem Markt. Mein Sohn lebt gerade in dieser Welt, möchte so viel lernen, tun, und ich bin eine große 0 in dem Gebiet. Deshalb muss er sich wohl alleine durchfuchsen. Aber solange es ihm Spaß macht, ist alles gut :)

Beste Grüße

Marina
Benutzeravatar
__blackjack__
User
Beiträge: 1865
Registriert: Samstag 2. Juni 2018, 10:21

Sonntag 6. Januar 2019, 19:39

@Python-Anfänger: Ich hatte ja schon in einem der verlinkten Themen zum Buch die Vermutung geäussert, dass das Buch das ganze Programm nicht auf einmal präsentiert, sondern nach und nach Funktionen und Code hinzu kommt, der an den richtigen Stellen im Gesamtprogramm eingefügt werden müssen. Das Problem ist das versucht wird die Funktion `entf_bubbles()` zu verwenden, bevor sie definiert wurde. Die ``def``-Anweisung mit der diese Funktion definiert wird, muss also passieren bevor sie aufgerufen wird. Python arbeitet den Code in einem Modul beim importieren von oben nach unten ab.

Das hier funktioniert:

Code: Alles auswählen

def greet(name):
    print('Hallo', name)

greet('Alice')
Das hier gibt einen `NameError` weil `greet` nicht definiert ist an der Stelle wo versucht wird die Funktion zu verwenden:

Code: Alles auswählen

greet('Alice')

def greet(name):
    print('Hallo', name)
Einfache Aufräummassnahme wäre also erst einmal alle ``import``-Zeilen an den Anfang des Quelltextes zu verschieben, danach dann alle Konstanten (das sind die Namen die komplett gross geschreiben sind), dann alle Funktionsdefinitionen, und zum Schluss dann erst der ganze Code der das Hauptprogramm ausmacht und momentan auch zwischen den Funktionsdefinitionen verteilt ist.

Wobei das Vorgehen, so verdammt viel Code runterzuschreiben ohne die einzelnen Zwischenschritte schon mal ausgetestet zu haben, nicht gut ist. Und zwar nicht nur für Anfänger sondern generell. Erfahrene Programmierer schreiben schon mal etwas mehr Code am Stück bevor sie es testen, weil sie aus Erfahrung ein Gefühl dafür und eine Vorstellung davon haben was für Code sie schreiben können der keine gravierenden Fehler hat, wo man dann kleinschrittiger vorgehen müsste. Aber ein ganzes Spiel komplett runterhacken und dann erst überprüfen ob es funktioniert, macht keiner. Vor allem weil es nicht funktionieren wird. Irgendwelche kleinen Fehler hat man bei so einer Menge Code eigentlich fast immer. Und wenn man im Grunde den ganzen Code schon hat, und dann nur noch mit der Fehlersuche beschäftigt ist, kann das auch sehr frustrierend sein, weil man immer im Hinterkopf hat, dass es ja eigentlich fertig ist, und man sich nur noch mit Fehlern herumschlägt, ohne wirkliche Erfolgserlebnisse zu haben.

Edit: Der erste Fehler sollte beim gezeigten Quelltext übrigens schon in der dritten Zeile kommen, weil `Tk` nicht definiert ist.
Having more money does not insure happiness. People with ten million dollars are no happier than people with nine million dollars. – Hobart Brown
Sirius3
User
Beiträge: 9017
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 6. Januar 2019, 19:47

Neben einigen Tippfehlern ist die Reihenfolge des Codes furchtbar durcheinander. Funktionen müssen erst definiert werden, bevor man sie benutzen kann. Es ist üblich alle Importe an den Anfang zu schreiben, danach kommen die Konstanten, Funktionsdefinitionen und erst zum Schluß das Hauptprogramm:

Code: Alles auswählen

from tkinter import Tk, Canvas
from random import randint
from time import sleep, time
from math import sqrt

HEIGHT = 500
WIDTH = 800
SCHIFF_R = 15
MID_X = WIDTH / 2
MID_Y = HEIGHT / 2
SCHIFF_GESCHW = 10
MIN_BUB_R = 10
MAX_BUB_R = 30
MAX_BUB_GESCHW = 10
GAP =100
BUB_CHANCE = 10
TIME_LIMIT = 30
BONUS_SCORE = 1000

def schiff_beweg(event):
    if event.keysym == "Up":
        c.move(schiff_id, 0, -SCHIFF_GESCHW)
    elif event.keysym == "Down":
        c.move(schiff_id, 0, SCHIFF_GESCHW)
    elif event.keysym == "Left":
        c.move(schiff_id, -SCHIFF_GESCHW, 0)
    elif event.keysym == "Right":
        c.move(schiff_id, SCHIFF_GESCHW, 0)

def erstelle_bubble():
    x = WIDTH + GAP
    y = randint(0, HEIGHT)
    r = randint(MIN_BUB_R, MAX_BUB_R)
    id1 = c.create_oval(x - r, y - r, x + r, y + r, outline="white")
    bub_id.append(id1)
    bub_r.append(r)
    bub_geschw.append(randint(1, MAX_BUB_GESCHW))

def bewege_bubbles():
    for i in range(len(bub_id)):
        c.move(bub_id[i], -bub_geschw[i], 0)

def hole_koord(id_num):
    pos = c.coords(id_num)
    x = (pos[0] + pos[2])/2
    y = (pos[1] + pos[3])/2
    return x, y

def lösche_bubble(i):
    del bub_r[i]
    del bub_geschw[i]
    c.delete(bub_id[i])
    del bub_id[i]

def entf_bubbles():
    for i in range(len(bub_id)-1, -1, -1):
        x, y = hole_koord(bub_id[i])
        if x < -GAP:
            lösche_bubble(i)

def distanz(id1, id2):
    x1, y1 = hole_koord(id1)
    x2, y2 = hole_koord(id2)
    return sqrt((x2 - x1)**2 + (y2 - y1)**2)

def kollision():
    points = 0
    for bub in range(len(bub_id)-1, -1, -1):
        if distanz(schiff_id, bub_id[bub]) < (SCHIFF_R + bub_r[bub]):
            points += (bub_r[bub] + bub_geschw[bub])
            lösche_bubble(bub)
    return points

def zeige_punkte(score):
    c.itemconfig(score_text, text=str(score))

def zeige_zeit(time_left):
    c.itemconfig(time_text, text=str(time_left))

window = Tk()
window.title("Bubble Blaster(für die 5e)")
c = Canvas(window, width=WIDTH, height=HEIGHT, bg="darkblue")
c.pack()
schiff_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill="red")
c.move(schiff_id, MID_X, MID_Y)
c.bind_all("<Key>", schiff_beweg)
c.create_text(50, 30, text="ZEIT", fill="white" )
c.create_text(150, 30, text="PUNKTE", fill="white" )
time_text = c.create_text(50, 50, fill="white" )
score_text = c.create_text(150, 50, fill="white" )

score = 0
bonus = 0

bub_id = list()
bub_r = list()
bub_geschw = list()
ende = time() + TIME_LIMIT
#HAUPTSCHLEIFE
while time() < ende:
    if randint(1, BUB_CHANCE) == 1:
        erstelle_bubble()
    bewege_bubbles()
    entf_bubbles()
    score += kollision()
    if (int(score / BONUS_SCORE)) > bonus:
        bonus += 1
        ende += TIME_LIMIT
    zeige_punkte(score)
    zeige_zeit(int(ende - time()))
    #print(score)
    window.update()
    sleep(0.01)

c.create_text(MID_X, MID_Y, \
    text="GAME OVER", fill="white", font=("Helvetica",30))
c.create_text(MID_X, MID_Y + 30, \
    text="Punkte: "+ str(score), fill="white")
c.create_text(MID_X, MID_Y + 45, \
    text="Bonus-Zeit: "+ str(bonus*TIME_LIMIT), fill="white")
window.update()
sleep(10)
Python-Anfänger
User
Beiträge: 4
Registriert: Samstag 5. Januar 2019, 20:41

Dienstag 8. Januar 2019, 12:31

Hallo blackjack, hallo Sirius3,

vielen Dank für die Aufklärung. Das mit dem def haben wir nun beide verstanden, angepasst und schon funktioniert das! :D
Wieso mein Sohn das ganze auf einmal eingetippt hat, hat mit dem Vertrauen an die Fachbücher zu tun. Ich hätte ja auch nicht gedacht, dass da so viel nicht richtig sein kann. Jetzt hat er sich ein anderes, hoffentlich ein zuverlässigeres, Buch aus der Bücherhalle ausgeliehen.

Eine schöne Woche noch und viele Grüße

Marina
Tholo
User
Beiträge: 98
Registriert: Sonntag 7. Januar 2018, 20:36

Dienstag 8. Januar 2019, 15:35

Falls du ihn weiter in Sachen Python unterstützen möchtest, kann ich dir einen Raspberry Pi samt Set für LEDs Motoren oder auch Lego, Oder noch besser Den Anki Cozmo Roboter nur empfehlen.. Falls der Geburtstag bald kommt ;)
Antworten