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