beispielspiel.py
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()