Seite 2 von 2

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.