Mensch ärger dich nicht.py
Mensch ärger dich nicht.py
—
Python Source,
12 KB (12871 bytes)
Dateiinhalt
#Achtung Figuren schlagen hat Bugs from visual import * from threading import Thread scene.range = 15 # fixed size, no autoscaling '''scene.stereo="redcyan"''' PORT = 51540 class feldinhalt(frame): def __init__(self,nummer,farbe): frame.__init__(self) self.feldinhalt=ring(frame=self,pos=(0,0,0),radius=0.5,color=farbe,axis=(0,1,0),material=materials.diffuse) self.nummer=nummer class spielfigur(frame): def __init__(self,nummer,farbe): frame.__init__(self) self.koerper=cylinder(frame=self,pos=(0,0,0),radius=0.45,color=farbe,axis=(0,1.5,0),material=materials.chrome) self.Kopf=cone(frame=self,pos=(0,1.5,0),axis=(0,1,0),radius=0.45,color=farbe,material=materials.chrome) self.nummer=nummer self.ringnr = 0 self.anfangspos=self.pos class spielfeld(Thread): def __init__(self): Thread.__init__(self) self.aufbauen() def aufbauen(self): feld=box(pos=(0,0,0),length=22,height=0.05,width=22,color=(1.5,1.5,1.5),material=materials.wood) #Ringe self.ringliste=[] self.figurenliste=[] for i in range(-20,0): self.s1= feldinhalt(i,farbe=color.red) self.s2= feldinhalt(i+20,farbe=color.red) self.s3= feldinhalt(i+40,farbe=color.red) self.s4= feldinhalt(i+60,farbe=color.red) self.s1.pos=(10+i,0.1,-10) self.s2.pos=(10,0.1,10+i) self.s3.pos=(10+i,0.1,10) self.s4.pos=(-10,0.1,10+i) self.ringliste.append(self.s1) self.ringliste.append(self.s2) self.ringliste.append(self.s3) self.ringliste.append(self.s4) for u in range(0,2): self.s5=feldinhalt(-u-405,farbe=color.black) self.s5.pos=(7+u,0.1,7) self.s6=feldinhalt(-u-408,farbe=color.black) self.s6.pos=(7+u,0.1,8) self.s7=feldinhalt(-u-411,farbe=color.green) self.s7.pos=(-8+u,0.1,-7) self.s8=feldinhalt(-u-414,farbe=color.green) self.s8.pos=(-8+u,0.1,-8) self.s9=feldinhalt(u+405,farbe=color.blue) self.s9.pos=(-8+u,0.1,7) self.s10=feldinhalt(u+408,farbe=color.blue) self.s10.pos=(-8+u,0.1,8) self.s11=feldinhalt(u+411,farbe=color.orange) self.s11.pos=(7+u,0.1,-7) self.s12=feldinhalt(u+414,farbe=color.orange) self.s12.pos=(7+u,0.1,-8) self.ringliste.append(self.s5) self.ringliste.append(self.s6) self.ringliste.append(self.s7) self.ringliste.append(self.s8) self.ringliste.append(self.s9) self.ringliste.append(self.s10) self.ringliste.append(self.s11) self.ringliste.append(self.s12) for o in range(-9,-5): self.d1=feldinhalt(o+1000,farbe=color.blue) self.d1.pos=(o,0.1,0) self.d2=feldinhalt(-o+1500,farbe=color.green) self.d2.pos=(0,0.1,o) self.ringliste.append(self.d1) self.ringliste.append(self.d2) for p in range(6,10): self.d3=feldinhalt(-p+2000,farbe=color.orange) self.d3.pos=(p,0.1,0) self.d4=feldinhalt(p+2500,farbe=color.black) self.d4.pos=(0,0.1,p) self.ringliste.append(self.d3) self.ringliste.append(self.d4) for l in range(0,1): self.w1= feldinhalt(-l+3000,farbe=color.orange) self.w2= feldinhalt(-l+3500,farbe=color.green) self.w3= feldinhalt(l+4000,farbe=color.black) self.w4= feldinhalt(l+4500,farbe=color.blue) self.w1.pos=(10+l,0.1,-10) self.w2.pos=(-10,0.1,-10+l) self.w3.pos=(10+l,0.1,10) self.w4.pos=(-10,0.1,10+l) self.ringliste.append(self.w1) self.ringliste.append(self.w2) self.ringliste.append(self.w3) self.ringliste.append(self.w4) ###Figuren for i in range(0,1): self.r1 = spielfigur(1,farbe=color.green) self.r2 = spielfigur(2,farbe=color.green) self.r3 = spielfigur(3,farbe=color.green) self.r4 = spielfigur(4,farbe=color.green) self.r1.anfangspos=self.r1.pos=(-8+i,0.05,-7) self.r2.anfangspos=self.r2.pos=(-8+i,0.05,-8) self.r3.anfangspos=self.r3.pos=(-7+i,0.05,-7) self.r4.anfangspos=self.r4.pos=(-7+i,0.05,-8) self.r5 = spielfigur(5,farbe=color.black) self.r6 = spielfigur(6,farbe=color.black) self.r7 = spielfigur(7,farbe=color.black) self.r8 = spielfigur(8,farbe=color.black) self.r5.anfangspos=self.r5.pos=(7+i,0.05,7) self.r6.anfangspos=self.r6.pos=(7+i,0.05,8) self.r7.anfangspos=self.r7.pos=(8+i,0.05,7) self.r8.anfangspos=self.r8.pos=(8+i,0.05,8) self.r9 = spielfigur(9,farbe=color.blue) self.r10 = spielfigur(10,farbe=color.blue) self.r11 = spielfigur(11,farbe=color.blue) self.r12 = spielfigur(12,farbe=color.blue) self.r9.anfangspos=self.r9.pos=(-8+i,0.05,7) self.r10.anfangspos=self.r10.pos=(-8+i,0.05,8) self.r11.anfangspos=self.r11.pos=(-7+i,0.05,7) self.r12.anfangspos=self.r12.pos=(-7+i,0.05,8) self.r13 = spielfigur(13,farbe=color.orange) self.r14 = spielfigur(14,farbe=color.orange) self.r15 = spielfigur(15,farbe=color.orange) self.r16 = spielfigur(16,farbe=color.orange) self.r13.anfangspos=self.r13.pos=(7+i,0.05,-7) self.r14.anfangspos=self.r14.pos=(7+i,0.05,-8) self.r15.anfangspos=self.r15.pos=(8+i,0.05,-7) self.r16.anfangspos=self.r16.pos=(8+i,0.05,-8) self.figurenliste.append(self.r1) self.figurenliste.append(self.r2) self.figurenliste.append(self.r3) self.figurenliste.append(self.r4) self.figurenliste.append(self.r5) self.figurenliste.append(self.r6) self.figurenliste.append(self.r7) self.figurenliste.append(self.r8) self.figurenliste.append(self.r9) self.figurenliste.append(self.r10) self.figurenliste.append(self.r11) self.figurenliste.append(self.r12) self.figurenliste.append(self.r13) self.figurenliste.append(self.r14) self.figurenliste.append(self.r15) self.figurenliste.append(self.r16) def figur_setzen(self,figurnr,zielnr): for f in self.figurenliste: if f.nummer==figurnr: figur=f break for ring in self.ringliste: if ring.nummer==zielnr: figur.pos=ring.pos figur.ringnr=ring.nummer break def run(self): figurnr = -1 #die figurnummer zielnr = -1 #die zielposition (als nummer) pick = None # no object picked out of the scene yet while True: rate(30) if scene.mouse.events: m1 = scene.mouse.getevent() # get event if m1.drag and m1.pick: for f in self.figurenliste: if m1.pick in f.objects: figurnr=f.nummer altpos=m1.pickpos-(m1.pickpos-f.pos) break else: f = None drag_pos =m1.pickpos drag_pos.y = 0 pick = f elif m1.drop and pick: # released at end of drag for ring in self.ringliste: ringmitte = ring.pos if mag(ringmitte-pick.pos) < .5: f.pos = ringmitte zielnr=ring.nummer pick=None for g in self.figurenliste: if g.pos==f.pos: g.pos=g.anfangspos break zufall=int(random.random()*6+1) augen=label(text=str(zufall),pos=(0,0,0),depth=-0.3,color=color.cyan) break if not f.pos in [ring.pos for ring in self.ringliste]: f.pos=altpos pick=None #--------------------# self.controller.weiterleiten(str(figurnr)+","+str(zielnr)) #--------------------# #self.figur_setzen(figurnr,zielnr) pick = None if pick: # project onto xy plane, even if scene rotated: new_pos = scene.mouse.project(normal=(0,1,0)) if new_pos != drag_pos :# if mouse has moved pick.pos += new_pos - drag_pos drag_pos = new_pos # update drag position+ pick.pos = new_pos + pick.pos - drag_pos drag_pos = new_pos # update drag position # offset for where the ball was clicked: zufall=int(random.random()*6+1) augen=label(text=str(zufall),pos=(0,0,0),depth=-0.3,color=color.cyan) '''Diese Klasse ermoeglicht die Netzkommunikation. Bau sie in dein Projekt ein. Die eigentliche Spielklasse braucht ein Referenzattribut auf ein Objekt dieser Steuerungs-Klasse, und kann dann mittels der Steuerungs-Methode weiterleiten(nachricht) einen String an die Steuerung schicken, die ihrerseits das an den Server weiterleitet. (Was der Server macht, steht in der Datei "server_class.py", die sich im selben Verzeichnis befinden muss.) Der Konstruktor verlangt ein Objekt, dem er die Nachrichten des Servers schicken soll, also das eigentliche Spiel, und optional einen Port. Jedes Team sollte eine eigene fuenstellige Portnummer waehlen.''' class Steuerung(Thread): def __init__(self, spiel, port=51540): Thread.__init__(self) self.view=spiel # UDP-Client, der den Server als Subprozess startet import subprocess # Modul zum Starten von Subprozessen import socket # Modul fuer Netzwerkkommunikation self.PORT = port #Anlegen eines Socket self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # AF_INET = IPv4, SOCK_DGRAM = UDP self.s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1) # Broadcast ermoeglichen #Testen, ob es schon einen Server auf diesem Port gibt, notfalls selber starten try: self.s.sendto("print 'wer hoert mich?'", ('255.255.255.255', self.PORT)) # sende Nachricht 'an alle' self.s.settimeout(2) # warte 1/2 Sekunde.. print (self.s.recvfrom(64)[0]) # gibt Servermeldung aus #ein Problem, wenn timeout einmal gesetzt ist... self.s.settimeout(3000) except: # reagiert auf Zeitueberschreitung print ("Kein Server vorhanden - starte Server") # Rueckmeldung subprocess.Popen(['python','server_class.py',str(self.PORT)]) # Server starten self.s.setblocking(1) # nicht-blockierend self.s.sendto("print 'hallo'", ('255.255.255.255', self.PORT)) self.start() #Endlosmethode zum Abhoeren des Ports auf Nachrichten def run(self): while True: nachricht = self.s.recvfrom(128)[0] self.auswerten(nachricht) #Methode zum Auswerten der eingegangenen Nachricht def auswerten(self,nachricht): exec (nachricht) #Methode zum Weiterleiten, wird von Spiel genutzt def weiterleiten(self, nachricht): # HIER CODE EINFUEGEN, DER AUSGEFUEHRT WERDEN SOLL teile=nachricht.split(",") nachricht = "self.view.figur_setzen("+teile[0]+","+teile[1]+")" self.s.sendto(nachricht, ('255.255.255.255', self.PORT)) # versenden der Nachricht an Tupel(IP, PORT) if __name__ == "__main__": spiel = spielfeld() #das eigentliche Spiel steuerung = Steuerung(spiel, PORT) #Die Steuerung, mit dem Spiel und einem Port als Argument spiel.controller = steuerung #Setzen des Referenzattributs spiel.run() #Das Spiel muss von Thread erben, hier wird dessen run-Methode gestartet