Mensch ärgere dich nicht
-vier Spieler können Figuren bewegen
-Netzwerkunterstützung
-Würfelfunktion
-Teile der Spiellogik
Mensch-ärger_v4.py — Python Source, 20 KB (21299 bytes)
Dateiinhalt
# -*- coding: utf-8 -*- from visual import * import random import time from threading import Thread PORT = 51253 scene.background=color.white class Spielbrett (frame): def __init__(self): frame.__init__(self) Spielfeld = box (height=0.1, length=15, width=15, material =materials.wood, color=color.black, pos=(1.25,0,6.25)) #Geundfläche für Spielfeld feld1=Feld((0,0,0),1) feld2=Feld((1.25,0,0),2) feld3=Feld((2.5,0,0),3) feld4=Feld((2.5,0,1.25),4) feld5=Feld((2.5,0,2.5),5) feld6=Feld((2.5,0,3.75),6) feld7=Feld((2.5,0,5),7) feld8=Feld((3.75,0,5),8) feld9=Feld((5,0,5),9) feld10=Feld((6.25,0,5),10) feld11=Feld((7.5,0,5),11) feld12=Feld((7.5,0,6.25),12) feld13=Feld((7.5,0,7.5),13) feld14=Feld((6.25,0,7.5),14) feld15=Feld((5,0,7.5),15) feld16=Feld((3.75,0,7.5),16) feld17=Feld((2.5,0,7.5),17) feld18=Feld((2.5,0,8.75),18) feld19=Feld((2.5,0,10),19) feld20=Feld((2.5,0,11.25),20) feld21=Feld((2.5,0,12.5),21) feld22=Feld((1.25,0,12.5),22) feld23=Feld((0,0,12.5),23) feld24=Feld((0,0,11.25),24) feld25=Feld((0,0,10),25) feld26=Feld((0,0,8.75),26) feld27=Feld((0,0,7.5),27) feld28=Feld((-1.25,0,7.5),28) feld29=Feld((-2.5,0,7.5),29) feld30=Feld((-3.75,0,7.5),30) feld31=Feld((-5,0,7.5),31) feld32=Feld((-5,0,6.25),32) feld33=Feld((-5,0,5),33) feld34=Feld((-3.75,0,5),34) feld35=Feld((-2.5,0,5),35) feld36=Feld((-1.25,0,5),36) feld37=Feld((0,0,5),37) feld38=Feld((0,0,3.75),38) feld39=Feld((0,0,2.5),39) feld40=Feld((0,0,1.25),40) garage1=Feld((1.25,0,1.25),41) garage2=Feld((1.25,0,2.5),42) garage3=Feld((1.25,0,3.75),43) garage4=Feld((1.25,0,5),44) garage5=Feld((-3.75,0,6.25),45) garage6=Feld((-2.5,0,6.25),46) garage7=Feld((-1.25,0,6.25),47) garage8=Feld((0,0,6.25),48) garage9=Feld((2.5,0,6.25),49) garage10=Feld((3.75,0,6.25),50) garage11=Feld((5,0,6.25),51) garage12=Feld((6.25,0,6.25),52) garage13=Feld((1.25,0,7.5),53) garage14=Feld((1.25,0,8.75),54) garage15=Feld((1.25,0,10),55) garage16=Feld((1.25,0,11.25),56) anfang1=Feld((6.25,0,11.25),57) anfang2=Feld((7.5,0,11.25),58) anfang3=Feld((6.25,0,12.5),59) anfang4=Feld((7.5,0,12.5),60) anfang5=Feld((6.25,0,0),61) anfang6=Feld((7.5,0,0),62) anfang7=Feld((6.25,0,1.25),63) anfang8=Feld((7.5,0,1.25),64) anfang9=Feld((-5,0,0),65) anfang10=Feld((-3.75,0,0),66) anfang11=Feld((-5,0,1.25),67) anfang12=Feld((-3.75,0,1.25),68) anfang13=Feld((-5,0,11.25),69) anfang14=Feld((-3.75,0,11.25),70) anfang15=Feld((-5,0,12.5),71) anfang16=Feld((-3.75,0,12.5),72) anfang9.feld.color=color.yellow anfang10.feld.color=color.yellow anfang11.feld.color=color.yellow anfang12.feld.color=color.yellow feld33.feld.color=color.yellow garage5.feld.color=color.yellow garage6.feld.color=color.yellow garage7.feld.color=color.yellow garage8.feld.color=color.yellow anfang5.feld.color=color.green anfang6.feld.color=color.green anfang7.feld.color=color.green anfang8.feld.color=color.green feld3.feld.color=color.green garage1.feld.color=color.green garage2.feld.color=color.green garage3.feld.color=color.green garage4.feld.color=color.green anfang1.feld.color=color.red anfang2.feld.color=color.red anfang3.feld.color=color.red anfang4.feld.color=color.red feld13.feld.color=color.red garage9.feld.color=color.red garage10.feld.color=color.red garage11.feld.color=color.red garage12.feld.color=color.red anfang13.feld.color=color.blue anfang14.feld.color=color.blue anfang15.feld.color=color.blue anfang16.feld.color=color.blue feld23.feld.color=color.blue garage13.feld.color=color.blue garage14.feld.color=color.blue garage15.feld.color=color.blue garage16.feld.color=color.blue self.liste = [feld1,feld2,feld3,feld4,feld5,feld6,feld7,feld8,feld9,feld10,feld11,feld12,feld13,feld14,feld15,feld16,feld17,feld18,feld19,feld20,feld21,feld22,feld23,feld24,feld25,feld26,feld27,feld28,feld29,feld30,feld31,feld32,feld33,feld34,feld35,feld36,feld37,feld38,feld39,feld40,garage1,garage2,garage3,garage4,garage5,garage6,garage7,garage8,garage9,garage10,garage11,garage12,garage13,garage14,garage15,garage16,anfang1,anfang2,anfang3,anfang4,anfang5,anfang6,anfang7,anfang8,anfang9,anfang10,anfang11,anfang12,anfang13,anfang14,anfang15,anfang16] #------------------------------------------------- # s1 = Spielfigur(groesse = 0.5, farbe = color.red) # s2 = Spielfigur(groesse = 0.5, farbe = color.red) # s3 = Spielfigur(groesse = 0.5, farbe = color.red) # s4 = Spielfigur(groesse = 0.5, farbe = color.red) # s5 = Spielfigur(groesse = 0.5, farbe = color.green) # s6 = Spielfigur(groesse = 0.5, farbe = color.green) # s7 = Spielfigur(groesse = 0.5, farbe = color.green) # s8 = Spielfigur(groesse = 0.5, farbe = color.green) # s9 = Spielfigur(groesse = 0.5, farbe = color.yellow) # s10 = Spielfigur(groesse = 0.5, farbe = color.yellow) # s11 = Spielfigur(groesse = 0.5, farbe = color.yellow) # s12 = Spielfigur(groesse = 0.5, farbe = color.yellow) # s13 = Spielfigur(groesse = 0.5, farbe = color.blue) # s14 = Spielfigur(groesse = 0.5, farbe = color.blue) # s15 = Spielfigur(groesse = 0.5, farbe = color.blue) # s16 = Spielfigur(groesse = 0.5, farbe = color.blue) # self.liste1 = [s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16] # self.liste1 = [s1,s2,s3,s4] # self.figurensetzen(56,0) # self.figurensetzen(57,1) # self.figurensetzen(58,2) # self.figurensetzen(59,3) # self.figurensetzen(60,4) # self.figurensetzen(61,5) # self.figurensetzen(62,6) # self.figurensetzen(63,7) # self.figurensetzen(64,8) # self.figurensetzen(65,9) # self.figurensetzen(66,10) # self.figurensetzen(67,11) # self.figurensetzen(68,12) # self.figurensetzen(69,13) # self.figurensetzen(70,14) # self.figurensetzen(71,15) def figurensetzen(self,feld,figurnummer): x = self.liste1[figurnummer] y = self.liste[feld] x.pos = y.pos def test(self): print("geschafft ;)") #------------------------------------------------- class Feld (frame): def __init__(self, ort, nummer, besetzt = None): frame.__init__(self,pos=ort) self.nummer=nummer self.besetzt = None self.feld=cylinder(radius=0.5,axis=(0,0.1,0), pos=ort) class Figur: def __init__(self, farbe = color.white, groesse = 0.5, position = (0,0,0)): figur = frame() rad = groesse hoehe = 3*rad self.fuss = cone(frame = figur, radius = rad, pos = position, axis = (0,1,0), length = hoehe, color = farbe) self.kopf = sphere(frame = figur, radius = rad, pos = (position[0],position[1]+hoehe,position[2]), color = farbe) class Spielfigur(frame): def __init__(self, farbe = color.white, groesse = 0.5, position = (0,0,0), spiel = None): frame.__init__(self) rad = groesse hoehe = 3*rad self.spiel = spiel self.fuss = cone(frame = self, radius = rad, pos = position, axis = (0,1,0), length = hoehe, color = farbe) self.kopf = sphere(frame = self, radius = rad, pos = (position[0],position[1]+hoehe,position[2]), color = farbe) def Bewegen(self, position): x = position[0] y = position[1] z = position[2] # tuple1 = (x,0,z) # tuple2 = (x,y,z) tuple3 = scene.mouse.project(normal=(0,1,0)) if y <= 0: self.pos = (tuple3) elif y > 0: self.pos = (tuple3) def zurueckZumStart(self, farbe_neu): if farbe_neu == color.green: for n in [self.spiel.spielbrett.liste[60], self.spiel.spielbrett.liste[61], self.spiel.spielbrett.liste[62], self.spiel.spielbrett.liste[63]]: if n.besetzt == None: #self.Bewegen(n.pos) self.pos = n.pos n.besetzt = self break elif farbe_neu == color.yellow: for n in [self.spiel.spielbrett.liste[64], self.spiel.spielbrett.liste[65], self.spiel.spielbrett.liste[66], self.spiel.spielbrett.liste[67]]: if n.besetzt == None: #self.Bewegen(n.pos) self.pos = n.pos n.besetzt = self break elif farbe_neu == color.blue: for n in [self.spiel.spielbrett.liste[68], self.spiel.spielbrett.liste[69], self.spiel.spielbrett.liste[70], self.spiel.spielbrett.liste[71]]: if n.besetzt == None: #self.Bewegen(n.pos) self.pos = n.pos n.besetzt = self break elif farbe_neu == color.red: for n in [self.spiel.spielbrett.liste[56], self.spiel.spielbrett.liste[57], self.spiel.spielbrett.liste[58], self.spiel.spielbrett.liste[59]]: if n.besetzt == None: #self.Bewegen(n.pos) self.pos = n.pos n.besetzt = self break else: print("error!") class Wuerfel(frame): def __init__(self, groesse = 1, pos=(0,0,0)): frame.__init__(self,pos=pos) wuerfel = box(pos = (1,1,1), length = groesse, width = groesse, height = groesse, color = color.white, frame=self) p1 = cylinder(pos = (1.41,1,1),axis=(0.1,0,0),radius=0.1,color = color.black,frame=self) p2 = cylinder(pos = (0.49,1.25,1.25),axis=(0.1,0,0),radius=0.1,color = color.black,frame=self) p3 = cylinder(pos = (0.49,1,1.25),axis=(0.1,0,0),radius=0.1,color = color.black ,frame=self) p4 = cylinder(pos = (0.49,0.75,1.25),axis=(0.1,0,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (0.49,1.25,0.75),axis=(0.1,0,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (0.49,1,0.75),axis=(0.1,0,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (0.49,0.75,0.75),axis=(0.1,0,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (1,1.41,1),axis=(0,0.1,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (0.75,1.41,0.75),axis=(0,0.1,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (1.25,1.41,0.75),axis=(0,0.1,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (0.75,1.41,1.25),axis=(0,0.1,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (1.25,1.41,1.25),axis=(0,0.1,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (1.25,0.49,1.25),axis=(0,0.1,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (0.75,0.49,0.75),axis=(0,0.1,0),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (1.25,1.25,0.49),axis=(0,0,0.1),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (1.25,0.75,0.49),axis=(0,0,0.1),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (0.75,1.25,0.49),axis=(0,0,0.1),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (0.75,0.75,0.49),axis=(0,0,0.1),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (0.75,0.75,1.41),axis=(0,0,0.1),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (1.25,1.25,1.41),axis=(0,0,0.1),radius=0.1,color = color.black,frame=self) p4 = cylinder(pos = (1,1,1.41),axis=(0,0,0.1),radius=0.1,color = color.black,frame=self) class Logik: def __init__(self): print("") def zugPruefen(self, figur, feld): if feld.besetzt != None: #Feld besetzt feld.besetzt.zurueckZumStart(figur.color) return True elif figur.color == feld.color: #Falsche Farbe if feld.nummer == 3 or feld.nummer == 13 or feld.nummer == 23 or feld.nummer == 33: return True else: return True # elif #!= Würfel # elif #falsche Richtung # elif #Bei Start nur mit 6 (3 Versuche) else: return True class Spieler: def __init__(self, farbe_neu, spiel): if farbe_neu == color.green: #grün: t1 = (6.25,0,0) t2 = (7.5,0,0) t3 = (6.25,0,1.25) t4 = (7.5,0,1.25) elif farbe_neu == color.yellow: #gelb: t1 = (-5,0,0) t2 = (-3.75,0,0) t3 = (-5,0,1.25) t4 = (-3.75,0,1.25) elif farbe_neu == color.blue: #blau: t1 = (-5,0,11.25) t2 = (-3.75,0,11.25) t3 = (-5,0,12.5) t4 = (-3.75,0,12.5) elif farbe_neu == color.red: #rot: t1 = (6.25,0,11.25) t2 = (7.5,0,11.25) t3 = (6.25,0,12.5) t4 = (7.5,0,12.5) else: print("error!") # self.s1 = Spielfigur(farbe = farbe_neu, position = t1) # self.s2 = Spielfigur(farbe = farbe_neu, position = t2) # self.s3 = Spielfigur(farbe = farbe_neu, position = t3) # self.s4 = Spielfigur(farbe = farbe_neu, position = t4) self.s1 = Spielfigur(farbe = farbe_neu, spiel = spiel) self.s1.zurueckZumStart(farbe_neu) self.s2 = Spielfigur(farbe = farbe_neu, spiel = spiel) self.s2.zurueckZumStart(farbe_neu) self.s3 = Spielfigur(farbe = farbe_neu, spiel = spiel) self.s3.zurueckZumStart(farbe_neu) self.s4 = Spielfigur(farbe = farbe_neu, spiel = spiel) self.s4.zurueckZumStart(farbe_neu) self.figurenliste = [self.s1, self.s2, self.s3, self.s4] class Spiel (Thread): def __init__(self): Thread.__init__(self) self.spielbrett = Spielbrett() self.wuerfel = Wuerfel(pos=(0.25,-0.5,5.25)) self.spieler1 = Spieler(farbe_neu = color.red, spiel = self) self.spieler2 = Spieler(farbe_neu = color.green, spiel = self) self.spieler3 = Spieler(farbe_neu = color.yellow, spiel = self) self.spieler4 = Spieler(farbe_neu = color.blue, spiel= self) self.aktSpieler = 1 # Spieler1: rot # Spieler2: grün # Spieler3: gelb # Spieler4: blau #self.figuren = self.spieler1.figurenliste self.figuren = [] for l in self.spieler1.figurenliste: self.figuren.append(l) for l in self.spieler2.figurenliste: self.figuren.append(l) for l in self.spieler3.figurenliste: self.figuren.append(l) for l in self.spieler4.figurenliste: self.figuren.append(l) self.logik = Logik() self.controller = Steuerung(self) self.spielbrett.controller = self.controller def figurBewegen(self): self.felder = self.spielbrett.liste self.altesFeld = 0 pick = None #das angeklickte Objekt - am Anfang keines while True: if scene.mouse.events: m1 = scene.mouse.getevent() # get event if m1.drag: for f in range(len(self.figuren)): if m1.pick in self.figuren[f].objects: drag_pos = m1.pickpos # where on the object pick = self.figuren[f] # pick now true (not None) for n in range (len(self.felder)): position = self.felder[n].pos if mag(position - self.figuren[f].pos) < mag((self.felder[self.altesFeld].pos - self.figuren[f].pos)): self.altesFeld = n break elif m1.drop: # released at end of drag pick = None # end dragging (None is false) tmp = self.figuren[f].pos #self.zug(tmp[0],tmp[1],tmp[2]) #$ohne Server$ self.controller.weiterleiten(self.figuren[f].pos,f) #$mit Server$ break elif m1.click: if m1.pick in self.wuerfel.objects: zahl=1 self.b=label(pos=(1,7,1), color=color.black) zahl = random.choice([1,2,3,4,5,6]) self.b.text = 'Du hast eine ' + str(zahl) + ' gewuerfelt!' time.sleep(1) self.b.visible=False if pick: pick.Bewegen(scene.mouse.pos) def zug(self, pos1, pos2, pos3, f): pos = (pos1, pos2, pos3) feldindex = 0 for n in range (len(self.felder)): position = self.felder[n].pos if mag(position - pos) < mag((self.felder[feldindex].pos - pos)): feldindex = n if self.logik.zugPruefen(self.figuren[f], self.felder[feldindex]): self.figuren[f].pos = (self.felder[feldindex].pos) self.felder[feldindex].besetzt = self.figuren[f] self.felder[self.altesFeld].besetzt = None else: print("Zug ungültig!!") def spielerWechseln(self): if self.aktSpieler == 1: self.figuren = self.spieler2.figurenliste self.aktSpieler = 2 elif self.aktSpieler == 2: self.figuren = self.spieler3.figurenliste self.aktSpieler = 3 elif self.aktSpieler == 3: self.figuren = self.spieler4.figurenliste self.aktSpieler = 4 elif self.aktSpieler == 4: self.figuren = self.spieler1.figurenliste self.aktSpieler = 1 def run(self): while True: self.figurBewegen() # self.spielerWechseln() # Wuerfeln() class Steuerung(Thread): def __init__(self, spiel, port=51253): 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,pos,f): # HIER CODE EINFUEGEN, DER AUSGEFUEHRT WERDEN SOLL #teile=nachricht nachricht = "self.view.zug("+str(pos[0])+","+str(pos[1])+","+str(pos[2])+","+str(f)+")" self.s.sendto(nachricht, ('255.255.255.255', self.PORT)) # versenden der Nachricht an Tupel(IP, PORT) spiel = Spiel() spiel.run()