Links und Funktionen
Sprachumschaltung

Navigationspfad


Inhaltsbereich

beispielspiel.py

Python Source icon beispielspiel.py — Python Source, 5 KB (5808 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."""
    #Konstruktormethode
    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)



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."""
    #Konstruktormethode
    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):    
        #Spielfelder erzeugen 
        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))
        #Spielfelder in Felderliste einfuegen
        self.felderliste.append(feld1)
        self.felderliste.append(feld2)
        self.felderliste.append(feld3)
        self.felderliste.append(feld4)
        #Figuren erzeugen und positionieren
        figur1 = Spielfigur(farbe=color.green)
        figur2 = Spielfigur(farbe=color.yellow)
        figur1.pos = self.felderliste[0].pos #Figur auf Feld 0 stellen
        figur2.pos = self.felderliste[3].pos #Figur auf Feld 3 stellen
        #Figuren in Figurenliste einfuegen
        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 uebermitteln 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
                
            
mein_spiel = Spiel()

Funktionsleiste