Links und Funktionen
Sprachumschaltung

Navigationspfad


Inhaltsbereich

beispielspiel.py

Python Source icon beispielspiel.py — Python Source, 5 KB (5687 bytes)

Dateiinhalt

from visual import *
from netzwerk import *

class Spielfigur(frame):
    """Modelliert eine einzelne Spielfigur. Erbt von frame und hat dadurch ein Attribut pos.
    Damit kann man die Position des frames, zu dem alle Objekte darin gehoeren, veraendern."""
    def __init__(self, farbe=color.red, groesse=1, pos=(0,0,0)):
        frame.__init__(self)
        self.pos = pos
        self.body = cone(frame=self, color=farbe, axis=(0,1,0),
                         radius=0.375*groesse, material=materials.wood, pos=(0,.1,0))
        self.head = sphere(frame=self, color=farbe, y=1*groesse,
                           radius=0.25*groesse,material=materials.wood)
        self.hut = cylinder (frame = self, color= farbe, axis=(0,1,0), radius =.9*groesse, pos=(0,1,0), length=groesse*.02)

class Feld(frame):
    """Modelliert ein Spielfeld, auf dem eine Figur stehen kann. Erbt von frame und hat dadurch
    ein Attribut pos. Damit kann man die Position des frames, zu dem alle Objekte darin gehoeren, veraendern."""
    def __init__(self, farbe=color.blue, groesse=1, pos=(0,0,0)):
        frame.__init__(self)
        self.pos=pos
        self.feld = box(frame=self, material=materials.plastic, width=groesse, length=groesse, height=groesse/20, color=farbe)

class Spiel(Teilnehmer):
    """Erbt von der Oberklasse 'Teilnehmer' die Methode self.senden(nachricht),
    mit der Nachrichten an alle anderen Teilnehmer versendet werde."""
    def __init__(self):
        Teilnehmer.__init__(self, 41000)            # den Konstruktor der Oberklasse aufbauen, mit Angabe eines Netzwerkports
        self.figurenliste = []                      # eine Liste, um die Figuren des Spiels zu verwalten
        self.felderliste = []                       # eine Liste, um die Felder Spiels zu verwalten
        self.aufbauen()                             # das Spielmaterial aufbauen
        self.run()                                  # die Endlosschleife starten
    def aufbauen(self):    
        #felder aufbauen
        feld1 = Feld(farbe = color.white, pos = (0,0,0))
        feld2 = Feld(farbe = color.red, pos = (1,0,0))
        feld3 = Feld(farbe = color.red, pos = (0,0,1))
        feld4 = Feld(farbe = color.white,pos = (1,0,1))
        self.felderliste.append(feld1)
        self.felderliste.append(feld2)
        self.felderliste.append(feld3)
        self.felderliste.append(feld4)
        #die figuren aufbauen
        figur1 = Spielfigur(farbe=color.green)
        figur1.pos = self.felderliste[0].pos
        figur2 = Spielfigur(farbe=color.yellow)
        figur2.pos = self.felderliste[3].pos
        self.figurenliste.append(figur1)
        self.figurenliste.append(figur2)
    def empfangen(self, nachricht):
        """Optionale, weil ererbte Methode: Gibt an, was mit eingegangenen Nachrichten
        geschieht. Fehlt diese Methode, werden sie standardmaessig 
        unmittelbar als Code ausgefuehrt."""
        exec(nachricht)
    def zug_ausfuehren(self, wer, wo):
        self.figurenliste[wer].pos=self.felderliste[wo].pos
    def run(self):
         aktiv = None #das zu bewegende Objekt - am Anfang keines
         while True:
            rate(30)            
            if aktiv: #wenn es gerade ein zu bewegendes Objekt gibt, wird seine Position der Maus angepasst
                new_pos = scene.mouse.project(normal=(0,1,0))   # wo die Maus ist, projiziert auf eine Ebene 
                aktiv.pos = new_pos
            if scene.mouse.events:                              # wenn etwas mit der Maus geschieht
                sme = scene.mouse.getevent()                    # merk dir das Mausereignis
                if sme.drag and sme.pick:                       # wenn ein Objekt geklickt und bewegt wird
                    #testen, ob das ausgewaehlte Objekt Teile eines Objekts in der Figurenliste ist - sonst bleibt aktiv beim Wert None
                    for figur in self.figurenliste:
                        if sme.pick in figur.objects:
                            aktiv = figur                       # figur ist die gesuchte Figur, aktiv hat jetzt einen Wert
                            break
                elif sme.drop and aktiv:                        # wenn der Mausknopf losgelassen wird und es ein aktives Objekt gibt
                    #suchen nach naechstgelegenem neuen Feld
                    for feld in self.felderliste:
                        feldmitte = feld.pos                    # das ist die Position des frames, nicht der Objekte darin!
                        if mag(feldmitte - aktiv.pos) < .8:
                            #feld ist das gesuchte Feld
                            break
                    aktiv = None                                # jetzt wird die Figur losgelassen
                    feldindex  = self.felderliste.index(feld)   # den Index des Feldes herausfinden (zum Uebermitteln)
                    figurindex = self.figurenliste.index(figur) # den Index der Figur herausfinden (zum Uebermitteln)
                    # ------------------ zum Schluss uebermietteln des Befehls an den Server - und damit auch an sich selber
                    self.senden("self.zug_ausfuehren("+str(figurindex)+","+str(feldindex)+")")
                    # ------------------
            if scene.kb.keys:                                   # Tastendruck?
                zeichen = scene.kb.getkey()                     # Zeichen holen
                if zeichen == "up":
                    print (str(self.nummer))
                elif zeichen == "down":
                    break
                
            
z = Spiel()

Funktionsleiste