Kann ich so Kindern Python-Klassen erklären ? Kritik bitte

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.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

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
Jona
User
Beiträge: 94
Registriert: Sonntag 23. September 2007, 23:25

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?
Benutzeravatar
HorstJENS
User
Beiträge: 124
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

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 .
https://spielend-programmieren.at
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Viel Glück und Erfolg auch weiterhin!
Wie gesagt, mir gefällt die Idee!
Gruß!
Benutzeravatar
HorstJENS
User
Beiträge: 124
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

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
Zuletzt geändert von HorstJENS am Donnerstag 4. Oktober 2007, 15:03, insgesamt 2-mal geändert.
https://spielend-programmieren.at
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

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.
cp != mv
Benutzeravatar
HorstJENS
User
Beiträge: 124
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

Danke Costi.
Habe versucht das Listing entsprechend zu editieren.
https://spielend-programmieren.at
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

HorstJENS will sein beispiel "perfekt" gestalten,
vorschlaege?


:lol: :lol: :lol:
cp != mv
Benutzeravatar
HorstJENS
User
Beiträge: 124
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

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]
https://spielend-programmieren.at
BlackJack

Einfacher Netzwerkmodus: Pyro anschauen.
Antworten