Seite 1 von 2

Verfasst: Sonntag 16. September 2007, 17:48
von EnTeQuAk
Masaru hat geschrieben:Wenn es hier um eine Zielgruppe von Jungerwachsenen oder Studenten ginge, jo ... kein Ding ... aber 11 Jährige?

Einfach nur grausam, sorry ... die Synapsen der Kiddies sind noch lange nicht soweit mit einander vernetzt und das mathematische und räumliche Denken ist noch soweit unausgeprägt, als dass sie die Materie verstehen könnte.

*kopfschüttel*
Also da muss ich dir wiedersprechen. Ich selber bin 17 und habe selber viele Erfahrungen mit Schulen und IT-Unterricht machen dürfen/müssen.
Ohne jetzt die Jugend von heute groß zu loben,... aber das, was sie an Höflichkeit und Freundlichkeit nicht können, machen sie mit ordentlichem Denken in der IT-Welt (egal wo!) wieder wett. (viele, nicht alle!)
masaru hat geschrieben: Auch wenn es immer einige, wenige Ausnahmen bei den Schülern geben wird, so finde ich ist das Projekt mehr ein Aufladen von Frustrationen die sich einstellen werden, als das es wirklich eher auf eine IT-Welt von morgen vorbereiten würde.

Programmiersprachen bezogene OOP und PyGame ... für 11 Jährige!!! Finde das ist einfach noch ein paar Kapitel zu weit.

Die Wahrscheinlichkeit, dass aus Freude ein "in die Ecke werfen wird", ist ja fast schon vorprogrammiert
PyGame steht nicht zur diskussion. Es war nur eine Idee, nichts weiter.

Ich weiß zwar nicht, was HorstJens mit dem Projekt im höheren Sinne zu erreichen hat aber ich kann mir durchaus vorstellen, das das Programmieren für einige Schüler durchaus interessant sein kann.
Meine ersten Kontakte mit der Welt des Programmierens begann wie bei vermutlich vielen mit PHP und HTML zur Darstellung. Das dürfte so ungefair mit 13 angefangen haben. Mit 14, in der 7ten Klasse, gabs nen Kurs, der sich mit Programmieren befasst hat (leider nur ein Jahr). Dort habe ich Erfahrung mit Pascal gesammelt. Und ich muss sagen, ein derart früher Kontakt hat auch Vorteile. Man sieht, kann er entsprechend denken oder liegen die Interessen wirklich komplett woanders.

Und mal ehrlich: Ich denke fast jeder hier hat mit dem (richtigen) Programmieren sicherlich nicht einfach so aus Flux und langer Weile angefangen (belehrt mich eines besseren). Und solch ein Projekt, kann zur Volge haben, das die Kiddies nen neues Hobby finden, oder auch nicht.


Und ich denke kaum, das es der letzte Messias wird, der einem Vorschreibt, "Du hast zu Programmieren" -- oder HorstJens?


Ich persönlich begrüße derartige Projekte. Leider gibt es entsprechendes viel zu wenig, an Grund/Oberschulen in Deutschland. Die richtige Ausstattung fängt ja meißt wirklich erst entweder im Gymnasium oder erst in den Fachoberschulen/Berufsschulen/OSZs an. Und da ist es (meiner Meinung) nach schon zu spät. Denn da sollte man sich ja schon entschieden haben, in welche Richtung man sich (vorerst) entwickeln möchte.

Von daher: Nur weiter so!


MfG EnTeQuAk

Verfasst: Sonntag 16. September 2007, 19:02
von BlackJack
Was ist für Dich "richtiges" Programmieren? Ich habe auf 'nem C64 angefangen und weil das eingebaute BASIC auf der Kiste so langsam ist und keine richtigen Befehle bietet, die die Hardwarefähigkeiten der Kiste ausnutzen, bin ich relativ schnell auf Assembler umgestiegen als ich meinen eigenen Rechner bekommen habe.

Aber so ein Interesse an der Materie bringt halt nicht jeder mit. Auch bei mir war damals in der Informatik AG und später im regulären Informatikunterricht recht "gemischtes" Publikum. Das wird heute nicht anders sein, da werden sicher einige drinsitzen, die denken Computer sind cool, oder man muss das eben machen, weil Informatik heute wichtig ist, aber die nicht wirklich das Interesse haben. Oder auch die notwendigen Fähigkeiten nicht haben um "richtig" zu Programmieren. Der C64 war damals selbst in Assembler noch relativ übersichtlich. Heutige Systeme sind wesentlich komplexer und damit man damit arbeiten kann, die Herangehensweise abstrakter. Und dieses logische, abstrakte Denken fällt nicht jedem gleichermassen leicht.

Ich bin kein Pädagoge, darum ist meine Meinung wohl mit Vorsicht zu geniessen, aber ich würde den Kids ein komplettes Rahmenwerk für ein Spiel vorsetzen, mit einfachen Beispielimplementierungen, die sie dann einfach und nach Anleitung selber erweitern können. So á la `Guido van Robot`. Damit überfordert man die langsamen und lustlosen nicht (zu stark), und gibt denen die tiefer Einsteigen wollen, die Möglichkeit mit den Details bis runter zu `pygame` rumzuspielen. `pygame` selbst ist recht hardwarenah. Das erinnert mich fast an die alten C64- oder DOS-Zeiten.

Verfasst: Montag 17. September 2007, 10:21
von CM
Masaru hat geschrieben: Einfach nur grausam, sorry ... die Synapsen der Kiddies sind noch lange nicht soweit mit einander vernetzt und das mathematische und räumliche Denken ist noch soweit unausgeprägt, als dass sie die Materie verstehen könnte.
Wo hast Du das her? Kannst Du mir bitte die Referenz auf das entsprechende neurobiologische Paper (=Primärliteratur) geben?

Sorry, aber ich lese und höre oft so 'nen Kram und viele solcher "wissenschaftlichen Fakten" werden in der Presse und der Trivialliteratur wiederholt wie ein Mantra und so lange abgeschrieben bis die handelnden Akteure selber dran glauben. Ich möchte damit niemanden einen Vorwurf machen, aber manchmal kann ich den Reiz nicht unterdrücken doch wieder ein paar Takte dazu zu schreiben ...

Andererseits hatte HortJens vor einiger Zeit ein paar tolle Videos online gestellt, die zeigten, was er mit seiner Gruppe von Kindern so alles machen kann. Wenn er den Dreh raus hat und den Versuch unternehmen möchte, wünsche ich ihm jedenfalls viel Erfolg! (Ich jedenfalls fand es als Kind unendlich frustrierend nicht einmal ansatzweise die Möglicheit zu haben zu lernen wie man mehr aus seiner Kiste holen kann.)

@HorstJens: Toi, toi, toi!

Gruß,
Christian

Bericht: Klassen - Konzept beibringen

Verfasst: Dienstag 18. September 2007, 21:34
von HorstJENS
So, nach 2 Stunden Unterricht mit meinen "Python-Kids" bin ich ganz zufrieden.
Die Kinder hatten mit dem Klassenkonzept und

Code: Alles auswählen

def __init__(self, name):
soweit keine Probleme. Auch 2 Funktionen sind schon in der Klasse.
Derzeit schreiben wir eine Funktion damit sich die Diebe gegenseitig bestehlen können. (noch nicht ganz fertig).

Meine schöne Namensgenerator-Funktion wurde ignoriert, die Kinder erzeugten genau 3 Diebe mit ihren echten Vornamen.

Code: Alles auswählen

ganoven=[Dieb('Lexi'),Dieb('Chen'),Dieb('Leo')]
Die __init__ Funktion wurde von den Kindern selbstständig erweitert um ein beachtliches Waffenarsenal:

Code: Alles auswählen

self.Waffe = random.choice["Schwert", "MP", "Pistole", "Karate"]
sowie um eine Art Strafregisterauszug:

Code: Alles auswählen

self.Opfer=random.randint(0,200) # Anzahl der Opfer dieses Diebes
... ich bin mir noch nicht ganz sicher was sie damit vorhaben... aber immerhin verwenden sie das Klassenkonzept selbsständig.

Da sie Kinder sind haben sie dauernd Diebe mit Zufallswerten erzeugt und sich gegenseitig vorgelesen wer wo besser ist (mehr Defensiv-Skill, mehr Geld, bessere Waffe, mehr Opfer etc.). Ich dachte man braucht dazu eine Netzwerk-Funktion und ein kompliziertes GUI aber es reicht anscheinend aus, die Kinder nebeneinander zu setzten.

Nächstes Woche mache ich mit der sich-gegenseitg-bestehlen Funktion weiter und versuche die __str__-Funktion zu erklären.

Vielen Dank für die vielen Anregungen und die guten Beispielprogramme !

PYthon unterrichten

Verfasst: Dienstag 18. September 2007, 21:48
von HorstJENS
EnTeQuAk hat geschrieben: Und ich denke kaum, das es der letzte Messias wird, der einem Vorschreibt, "Du hast zu Programmieren" -- oder HorstJens?
MfG EnTeQuAk
Nein. Ich versuche die Kinder soweit für das Programmieren zu begeistern das ihre Eltern ihnen weiterhin die Kursgebühr bezahlen.

Das einzige was ich ihnen seit Herbst vorschreibe ist das wir standarmäßig auf Linux arbeiten und nicht mehr auf Windows.
Umschulungszeit von Windows auf Linux beträgt bei Kindern übrigens genau 10 Sekunden:
Kind: Was ist Linux ?
Ich: Das, womit Du gerade arbeitest.
Kind: ach so
:-)

Verfasst: Dienstag 18. September 2007, 22:04
von meneliel
Masaru hat geschrieben: "OOP oder Python?" ... "Schlagsahne oder Schokosauce?"

Wobei das eine, nicht das andere unbedingt ausschließt ... ebenso natürlich umgekehrt.

SCHOKOSOßE :D Mjam

Verfasst: Montag 24. September 2007, 08:26
von Jona
ich wollte nur mal sagen, dass das ein tolles projekt ist und ich gerne erfahren würde wie es in den nächsten kursen weiterging?

wie es weiterging

Verfasst: Dienstag 25. September 2007, 19:41
von HorstJENS
Danke der Nachfrage.
Heute gings nicht so gut, was aber an mir selbst lag. Wollte die bisher erstellten Versionen langsam in Richtung Blackjack's Beispiel umarbeiten (siehe http://paste.pocoo.org/show/3954/).
Leider ging dabei etwas schief und die Diebe stahlen die Hälfte ihres eigenen Geldbetrages vom Opfer (anstatt die Hälfte des Geldes des Opfers).
Da ich nicht gleichzeitig Kinder unter Kontrolle halten und debuggen konnte habe ich ihnen die __str__ - Funktion und docstrings erklärt und die report-Routine um eine String-Multiplikation erweitert.

Code: Alles auswählen

print self.Angriffskill * "+"
print self.Defensifskill * "."
Das erleichtert das Vergleichen der Diebe.
Immerhin weiß ich schon wie ich das Beispiel in Richtung pygame erweitern werde und die Kinder haben recht konkrete Ideen für einen Charakterwerte-Bildschirm (so wie in Rollenspielen).

Ich denke das Beispiel ist ausbaufähig, aber ich muss mich mehr vorbereiten .

Verfasst: Dienstag 25. September 2007, 19:49
von C4S3
Viel Glück und Erfolg auch weiterhin!
Wie gesagt, mir gefällt die Idee!

update

Verfasst: Dienstag 2. Oktober 2007, 20:07
von HorstJENS
So, nach gründlicher Vorbereitung (2 Stunden Vorbereiten für 2 Stunden Unterricht) ging etwas mehr weiter als letztes Mal.
Ich habe im wesentlichen BlackJack's sehr gutes Script genommen und nur einige Sachen vorerst auskommentiert.
Den Decorator und die property habe ich nur beiläufig erwähnt, die Kinder waren hauptsächliich mit dem Ausbau der __str__ - Funktion und den beiden Status-Funktionen beschäftigt.
Nach ausgiebigem Rumprobieren auf der Konsole machen wir gerade ein primitves GUI mit easygui . Nächster Schritt ist ein rundenbasiertes Wer-bestiehlt-Wen mittels Easygui, um die Randrange-Werte besser austesten zu können.

Code: Alles auswählen

##from __future__ import division
##from random import randrange, shuffle
import random
import easygui
easygui.DEFAULT_FONT_SIZE=16
easygui.CODEBOX_FONT_SIZE=16

HERUMLUNGERN = 'lungert herum'
ABGELENKT = 'abgelenkt'

class Dieb(object):
    def __init__(self, name, geld=100):
        self.name = name
        self.geld = geld
        self.geschicklichkeit = random.randrange(5, 45)
        self._aufmerksamkeit = random.randrange(5, 45)
        self.ruf = random.randrange(20, 30)
        self.zustand = HERUMLUNGERN
    
    def __str__(self):
        #return '%s, besitzt %d EUR, Ruf: %d' % (self.name, self.geld, self.ruf)
        ausgabe = "Name: " + self.name + "\n"
        ausgabe += "Geld: " + str(self.geld) + "\n"
        ausgabe += "Geschicklichkeit: " + str(self.geschicklichkeit) + "\n"
        ausgabe += "Aufmerksamkeit: " + str(self._aufmerksamkeit) + "\n"
        ausgabe += "Ruf: " + str(self.ruf) + "\n"
        ausgabe += "Zustand: " + self.zustand + "\n"
        return ausgabe
        
    
    @property
    def aufmerksamkeit(self):
        if self.zustand == ABGELENKT:
            return self._aufmerksamkeit // 2
        else:
            return self._aufmerksamkeit
    
    def kann_bestehlen(self, opfer):
        return (random.randrange(0, 20) + self.geschicklichkeit
                > random.randrange(0, 20) + opfer.aufmerksamkeit)
    
    def bestiehlt(self, opfer):
        if self.kann_bestehlen(opfer):
            betrag = opfer.geld // 2
            opfer.geld -= betrag
            self.geld += betrag
        else:
            betrag = 0
            self.ruf -= int(self.ruf * 0.6)
        return betrag


### die folgende Klasse wurde komplett auskommentiert
##class Namen(object):

def diebstahl(taeter, opfer):
    betrag = taeter.bestiehlt(opfer)
    if betrag:
        print 'Diebstahl erfolgreich.'
        print '%s stiehlt %d EUR von %s.' % (taeter.name, betrag, opfer.name)
    else:
        print 'Diebstahl erfolglos.'

def status():
    for dummy in diebe:
        print dummy

def getstatus(gangsterliste):
    """Berichtet ueber alle Diebe in gangsterliste."""    
    text=""
    for gangster in gangsterliste:
        #text += gangster.__str__()
        text += str(gangster)
    return text
        
### die folgende Klasse wurde komplett auskommentiert
##def main():

#      hier gehts los, austesten am python-prompt
#diebe=[Dieb("Leo"),Dieb("Lexi"),Dieb("Chen")]
#print status()
#a=getstatus(diebe)
#easygui.msgbox(a)

diebe = []
name = "Unbekannter Dieb"
while name != "":
    name = easygui.enterbox("Name des Diebes eingeben: ","ENTER für abbruch","N A M E")
    if name == "":
        break 
    geld = easygui.integerbox("Geld des Diebes eingeben: ","GELD",100,5,150)
    diebe.append(Dieb(name,geld))
easygui.msgbox(getstatus(diebe))
#opfernummer = easygui.integerbox

Verfasst: Dienstag 2. Oktober 2007, 21:13
von Costi
ich find dein projekt echt cool.
Und die praesentationen von deinem schuelern haben mich echt geruehrt :lol:

nur als kleiner vorschlag:
das ist zwar in diesen fall nich so von bedeutung, vielicht wuerd ich aber klassen mit CamelCase, "konstanten" UPPERCASE und ales andere mit unter_striche schreiben.

CamelCase

Verfasst: Donnerstag 4. Oktober 2007, 15:04
von HorstJENS
Danke Costi.
Habe versucht das Listing entsprechend zu editieren.

Verfasst: Donnerstag 4. Oktober 2007, 17:41
von Costi
HorstJENS will sein beispiel "perfekt" gestalten,
vorschlaege?


:lol: :lol: :lol:

update, Netzwerk ?

Verfasst: Donnerstag 11. Oktober 2007, 21:05
von HorstJENS
Fortschritt ist hier einsehbar:
http://members.chello.at/horst.jens/files.htm

habe das Beispiel weiterentwickelt, es funktioniert inzwischen. Man muss sich allerdings easygui downloaden und entzippen:
http://www.ferg.org/easygui/


hier ist mein Skript, hat jemand eine Idee für einen simplen Netzwerk-Modus?

Code: Alles auswählen

# -*- coding: utf-8 -*-
##from __future__ import division
import random
import easygui

HERUMLUNGERN = 'lungert herum'
ABGELENKT = 'abgelenkt'

class Dieb(object):
    namensliste = []
    
    def __init__(self, name, geld=100, nummer=0):
        self.waffe=random.choice(["bogen und pfeile","schwert","speer","rüstung,schild und schwert","pistole"])        
        self.name = name
        self.nummer = nummer
        self.geld = geld
        self.geschicklichkeit = random.randrange(5, 45)
        self._aufmerksamkeit = random.randrange(5, 45)
        self.ruf = random.randrange(20, 30)
        self.zustand = HERUMLUNGERN
        self.pleite = False
        self.namensliste.append(self.name)

    def __del__(self):
        print self.name + " verschwindet.."
        self.namensliste.remove(self.name)

    
    def __str__(self):
        ##return '%s, besitzt %d EUR, Ruf: %d' % (self.name, self.geld, self.ruf)
        ausgabe = "========================================"  + self.name + "------" + "\n"
        ausgabe+="Geld: "+str(self.geld)+"\n"
        ausgabe+="$"*(self.geld/5) +"\n"
        ausgabe+="geschicklichkeit:  "+str(self.geschicklichkeit)+"\n"
        ausgabe+="."*self.geschicklichkeit+"\n"
        ausgabe+="aufmerksamkeit:  "+str(self.aufmerksamkeit)+"\n"
        ausgabe+="ruf:  "+str(self.ruf)+"\n"
        ausgabe+=":-)"*self.ruf +"\n"
        ausgabe+="zustand:  "+(self.zustand)+"\n"
        ausgabe+="waffe:   "+(self.waffe)+"\n"
        return ausgabe

    @property
    def aufmerksamkeit(self):
        if self.zustand == ABGELENKT:
            return self._aufmerksamkeit // 2
        else:
            return self._aufmerksamkeit
    
    def kann_bestehlen(self, opfer):
        return (random.randrange(0, 20) + self.geschicklichkeit
                > random.randrange(0, 20) + opfer.aufmerksamkeit)
    
    def bestiehlt(self, opfer):
        if self.kann_bestehlen(opfer):
            betrag = opfer.geld // 2
            opfer.geld -= betrag
            self.geld += betrag
        else:
            betrag = 0
            self.ruf -= int(self.ruf * 0.6)
        return betrag

def diebstahl(taeter, opfer):
    betrag = taeter.bestiehlt(opfer)
    if betrag:
        return "Diebstahl erfolgreich.\n %s stiehlt %s EUR von %s." % (taeter.name, betrag, opfer.name)
    else:
        return "Diebstahl erfolglos."

def reportall():
    ausgabe = ""
    for name in Dieb.namensliste:
        ausgabe += str(diebe[name])
    return ausgabe


def getliste(ohnemich):
    copyliste = Dieb.namensliste[:]
    copyliste.remove(ohnemich)
    return copyliste
    
#def main():
#----- erzeuge die Diebe ------
diebe={} # { Diebname1:Diebobjekt1, Diebname2:Diebobjekt2, usw} 
name="Unbekannter Dieb"
nummer = 0
#geld = 55 # soviel Geld hat ein Dieb am Anfang
geld = easygui.integerbox("Standard-Geldbetrag","Geldbetrag", 100, 50, 500)
#grenze = 35 # soviel Geld muss ein Dieb haben, sonst wird er ehrlich
grenze = easygui.integerbox("Betrag ab dem man pleite geht eingeben: ", "Pleitegrenze", geld/2,2,geld-1)


while name  != "":
    name=easygui.enterbox("Name des Diebes eingeben \n ENTER für Abbruch \n $ am Ende für Geldeingabe \n z.B. Hansi$ :","Dieb Nummer: " + str(nummer) + " Geld: " + str(geld))
    if name=="":
        break
    if name[-1] == "$":
        name = name[:-1] # Dollar vom Namen entfernen
        geld=easygui.integerbox("Geld des Diebes eingeben (50 bis 150): ","GELD",100,50,150)
    nummer +=1
    diebe[name] = Dieb(name,geld, nummer)

runde=0

while len(diebe)>1:
    easygui.codebox("So schaut es aus", "Report all", reportall())
    runde += 1
    for spieler in Dieb.namensliste:
        opfer = easygui.buttonbox("Ich bin der "+spieler+".\nWen soll ich bestehlen ?","Runde " + str(runde) + ", wähle Dein Opfer:",getliste(spieler)) 
        easygui.msgbox(diebstahl(diebe[spieler],diebe[opfer]))
    if easygui.ccbox("Weiterspielen oder aufhören?") == 0:
        break # Cancel = 0
    # --- pleite ?---
    for spieler in Dieb.namensliste:
        if diebe[spieler].geld < grenze:
            easygui.msgbox("Spieler " + spieler + " ist pleite und beendet seine kriminelle Laufbahn.")
            del diebe[spieler]            

if len(diebe)==1:
    easygui.msgbox("Sieger: "+ Dieb.namensliste[0])
else:
    easygui.msgbox("bye-bye")
[/code]

Verfasst: Donnerstag 11. Oktober 2007, 21:49
von BlackJack
Einfacher Netzwerkmodus: Pyro anschauen.