Schach2.12.py
Schach2.12.py — Python Source, 20 KB (20894 bytes)
Dateiinhalt
from visual import * from threading import Thread #scene.stereo = "redblue" scene = display(background=(0.6,0.4,0.2)) #(0.5, 0.5, 0.5) color dark grey class figur(): def __init__(self,feldnummer,gezogen=0): self.feldnummer=feldnummer self.gezogen=gezogen class pawn(frame,figur): def __init__(self, farbe1=color.white): frame.__init__(self) figur.__init__(self,0) self.color=farbe1 self.c1 = cone(frame=self,pos=(0,0,0),axis=(0,2.2,0),radius=0.6,color=farbe1) #koerper self.s1 = sphere(frame=self,pos=(0,1.7,0),radius=0.5,color=farbe1) #kopf self.c2 = cylinder(frame=self,pos=(0,0,0),radius=0.8,axis=(0,0.3,0),color=farbe1) self.c3 = cone(frame=self,pos=(0,0.3,0),radius=0.8,axis=(0,0.7,0),color=farbe1) #fuss self.c4 = cone(frame=self,pos=(0,1.3,0),radius=0.6,axis=(0,0.6,0),color=farbe1) #kopfring class rook(frame,figur): def __init__(self, farbe1=color.white): frame.__init__(self) figur.__init__(self,0) self.color=farbe1 self.c5 = cone(frame=self,pos=(0,0,0),axis=(0,2.5,0),radius=0.7,color=farbe1) self.c9 = cone(frame=self,pos=(0,2.6,0),axis=(0,-2.5,0),radius=0.7,color=farbe1) #koerper self.c6 = cylinder(frame=self,pos=(0,0,0),radius=1,axis=(0,0.4,0),color=farbe1) self.c7 = cone(frame=self,pos=(0,0.4,0),radius=1,axis=(0,0.8,0),color=farbe1) #fuss self.c8 = cylinder(frame=self,pos=(0,2.6,0),radius=0.8,axis=(0,0.4,0),color=farbe1) #kopf self.c4 = cone(frame=self,pos=(0,2.1,0),radius=0.75,axis=(0,0.8,0),color=farbe1) #kopfring self.c10 = box(frame=self,pos=(0,3.05,-0.65),size=(0.8,0.5,0.3),color=farbe1) self.c11 = box(frame=self,pos=(0,3.05,0.65),size=(0.8,0.5,0.3),color=farbe1) self.c12 = box(frame=self,pos=(0.65,3.05,0),size=(0.3,0.5,0.8),color=farbe1) self.c13 = box(frame=self,pos=(-0.65,3.05,0),size=(0.3,0.5,0.8),color=farbe1) #zacken class king(frame,figur): def __init__(self, farbe1=color.white,name=0): frame.__init__(self) figur.__init__(self,0) self.color=farbe1 self.name=0 self.c14 = cone(frame=self,pos=(0,0,0),axis=(0,3.9,0),radius=0.8,color=farbe1) self.c15 = cone(frame=self,pos=(0,4,0),axis=(0,-3.9,0),radius=0.7,color=farbe1) #koerper self.c16 = cylinder(frame=self,pos=(0,0,0),radius=1,axis=(0,0.4,0),color=farbe1) self.c17 = cone(frame=self,pos=(0,0.4,0),radius=1,axis=(0,0.8,0),color=farbe1) #fuss self.c18 = cone(frame=self,pos=(0,4,0),radius=0.7,axis=(0,0.5,0),color=farbe1) #hut self.c19 = cone(frame=self,pos=(0,2.5,0),radius=0.8,axis=(0,0.4,0),color=farbe1) #hueftring self.c20 = cone(frame=self,pos=(0,4,0),radius=0.9,axis=(0,-0.9,0),color=farbe1) #kopfkranz self.c21 = box(frame=self,pos=(0,4.7,0),size=(0.1,0.7,0.1),color=farbe1) self.c22 = box(frame=self,pos=(0,4.9,0),size=(0.4,0.1,0.1),color=farbe1) #kreuz def kippen(self): self.axis=(0,-1,0) #k3=king() #k3.pos=(3,1,9) #k3.kippen() class queen(frame,figur): def __init__(self, farbe1=color.white): frame.__init__(self) figur.__init__(self,0) self.color=farbe1 self.c14 = cone(frame=self,pos=(0,0,0),axis=(0,3.9,0),radius=0.8,color=farbe1) self.c15 = cone(frame=self,pos=(0,4,0),axis=(0,-3.9,0),radius=0.7,color=farbe1) #koerper self.c16 = cylinder(frame=self,pos=(0,0,0),radius=1,axis=(0,0.4,0),color=farbe1) self.c17 = cone(frame=self,pos=(0,0.4,0),radius=1,axis=(0,0.8,0),color=farbe1) #fuss self.c18 = cone(frame=self,pos=(0,4,0),radius=0.7,axis=(0,0.7,0),color=farbe1) #hut self.c19 = cone(frame=self,pos=(0,2.5,0),radius=0.8,axis=(0,0.4,0),color=farbe1) #hueftring self.c20 = cone(frame=self,pos=(0,4,0),radius=0.9,axis=(0,-0.9,0),color=farbe1) #kopfkranz class knight(frame,figur): def __init__(self, farbe1=color.white): frame.__init__(self) figur.__init__(self,0) self.color=farbe1 self.c31 = cylinder (frame=self,pos=(0,0,0),axis=(0,0.5,0), radius=0.8,color=farbe1) self.c32 = cone (frame=self,pos=(0,0.5,0),axis=(0,1.5,0),radius=0.8,color=farbe1) self.c33 = cone (frame=self,pos=(0,2,0),axis=(0,-1,0),radius=0.6,color=farbe1) self.c35 = box(frame=self,pos=(0,2.35,-0.25),size=(0.6,0.8,0.6),color=farbe1) self.c36 = box(frame=self,pos=(0,3,0),size=(0.6,0.7,1.2),color=farbe1) self.c37 = pyramid (frame=self,pos=(0,2.1,0),axis=(0,0,0.6),size=(0.6,0.6,0.6),color=farbe1) self.c39 = cone (frame=self,pos=(0.1,3.25,-0.3),axis=(0,0.5,0),radius=0.2,color=farbe1) self.c40 = cone (frame=self,pos=(-0.1,3.25,-0.3),axis=(0,0.5,0),radius=0.2,color=farbe1) class knightS(frame,figur): def __init__(self, farbe1=color.white): frame.__init__(self) figur.__init__(self,0) self.color=farbe1 self.c31 = cylinder (frame=self,pos=(0,0,0),axis=(0,0.5,0), radius=0.8,color=farbe1) self.c32 = cone (frame=self,pos=(0,0.5,0),axis=(0,1.5,0),radius=0.8,color=farbe1) self.c33 = cone (frame=self,pos=(0,2,0),axis=(0,-1,0),radius=0.6,color=farbe1) self.c35 = box(frame=self,pos=(0,2.35,0.25),size=(0.6,0.8,0.6),color=farbe1) self.c36 = box(frame=self,pos=(0,3,0),size=(0.6,0.7,1.2),color=farbe1) self.c37 = pyramid (frame=self,pos=(0,2.1,0),axis=(0,0,-0.6),size=(0.6,0.6,0.6),color=farbe1) self.c39 = cone (frame=self,pos=(0.1,3.25,0.3),axis=(0,0.5,0),radius=0.2,color=farbe1) self.c40 = cone (frame=self,pos=(-0.1,3.25,0.3),axis=(0,0.5,0),radius=0.2,color=farbe1) class bishop1(frame,figur): def __init__(self,farbe1=color.white): frame.__init__(self) figur.__init__(self,0) self.color=farbe1 self.c41 =cylinder (frame=self,pos=(0,0,0),axis=(0,0.5,0), radius=0.8,color=farbe1) self.c42 = cone (frame=self,pos=(0,0.5,0),axis=(0,0.5,0),radius=0.8,color=farbe1) self.c43 = cone (frame=self,pos=(0,1,0),axis=(0,-1,0),radius=0.61,color=farbe1) self.c44 = cone (frame=self,pos=(0,1,0),axis=(0,1.5,0),radius=0.6,color=farbe1) self.c45 = cone (frame=self,pos=(0,2.5,0),axis=(0,-1,0),radius=0.6,color=farbe1) self.c46 = cylinder (frame=self,pos=(0,2.5,0),axis=(0,0.3,0), radius=0.7,color=farbe1) self.c47 = cylinder (frame=self,pos=(0,2.8,0),axis=(0,0.15,0), radius=0.6,color=farbe1) self.c48 = cylinder (frame=self,pos=(0,2.95,0),axis=(0,0.3,0), radius=0.5,color=farbe1) self.c49 = sphere(frame=self,pos=(0,3.25,0),radius=0.5,color=farbe1) self.c50 = sphere(frame=self,pos=(0,3.7,0),radius=0.2,color=farbe1) class Spielbrettstein(frame): def __init__ (self,farbe = 1,position = (0,0,0),nummer=0): frame.__init__(self) self.pos=position self.besetzt=0 self.stein = box(frame=self,height = 0.2,length = 3,width = 3) self.nummer=nummer if farbe == 1: self.stein.color = color.black else: self.stein.color = color.white class Spielbrett(Thread): def __init__(self): Thread. __init__(self) self.brett = [] for i in range(0,64): self.brett.append(Spielbrettstein(farbe = (i%2)+(i/8)%2,position = ((i/8)*3,0,(i%8)*3),nummer=i)) self.aufbauen() def aufbauen(self): self.figurList = [] p1 = pawn() p1.feldnummer=1 p1.pos=(0,0,3) self.figurList.append(p1) p2 = pawn() p2.feldnummer=9 p2.pos=(3,0,3) self.figurList.append(p2) p3 = pawn() p3.feldnummer=17 p3.pos=(6,0,3) self.figurList.append(p3) p4 = pawn() p4.feldnummer=25 p4.pos=(9,0,3) self.figurList.append(p4) p5 = pawn() p5.feldnummer=33 p5.pos=(12,0,3) self.figurList.append(p5) p6 = pawn() p6.feldnummer=41 p6.pos=(15,0,3) self.figurList.append(p6) p7 = pawn() p7.feldnummer=49 p7.pos=(18,0,3) self.figurList.append(p7) p8 = pawn() p8.feldnummer=57 p8.pos=(21,0,3) self.figurList.append(p8) p9 = pawn(farbe1=(0.5, 0.5, 0.5)) p9.feldnummer=6 p9.pos=(0,0,18) self.figurList.append(p9) p10 = pawn(farbe1=(0.5, 0.5, 0.5)) p10.feldnummer=14 p10.pos=(3,0,18) self.figurList.append(p10) p11 = pawn(farbe1=(0.5, 0.5, 0.5)) p11.feldnummer=22 p11.pos=(6,0,18) self.figurList.append(p11) p12 = pawn(farbe1=(0.5, 0.5, 0.5)) p12.feldnummer=30 p12.pos=(9,0,18) self.figurList.append(p12) p13 = pawn(farbe1=(0.5, 0.5, 0.5)) p13.feldnummer=38 p13.pos=(12,0,18) self.figurList.append(p13) p14 = pawn(farbe1=(0.5, 0.5, 0.5)) p14.feldnummer=46 p14.pos=(15,0,18) self.figurList.append(p14) p15 = pawn(farbe1=(0.5, 0.5, 0.5)) p15.feldnummer=54 p15.pos=(18,0,18) self.figurList.append(p15) p16 = pawn(farbe1=(0.5, 0.5, 0.5)) p16.feldnummer=62 p16.pos=(21,0,18) self.figurList.append(p16) r1w = rook() r1w.feldnummer=0 r1w.pos=(0,0,0) self.figurList.append(r1w) r2w = rook() r2w.feldnummer=56 r2w.pos=(21,0,0) self.figurList.append(r2w) r1s = rook(farbe1=(0.5, 0.5, 0.5)) r1s.feldnummer=7 r1s.pos=(0,0,21) self.figurList.append(r1s) r2s = rook(farbe1=(0.5, 0.5, 0.5)) r2s.feldnummer=63 r2s.pos=(21,0,21) self.figurList.append(r2s) k1 = king() k1.feldnummer=24 k1.pos=(9,0,0) self.figurList.append(k1) k2 = king(farbe1=(0.5, 0.5, 0.5)) k2.feldnummer=31 k2.pos=(9,0,21) self.figurList.append(k2) q1 = queen() q1.feldnummer=32 q1.pos=(12,0,0) self.figurList.append(q1) q2 = queen(farbe1=(0.5, 0.5, 0.5)) q2.feldnummer=39 q2.pos=(12,0,21) self.figurList.append(q2) knw1 = knight() knw1.feldnummer=8 knw1.pos=(3,0,0) self.figurList.append(knw1) knw2 = knight() knw2.feldnummer=48 knw2.pos=(18,0,0) self.figurList.append(knw2) kns1 = knightS(farbe1=(0.5, 0.5, 0.5)) kns1.feldnummer=15 kns1.pos=(3,0,21) self.figurList.append(kns1) kns2 = knightS(farbe1=(0.5, 0.5, 0.5)) kns2.feldnummer=55 kns2.pos=(18,0,21) self.figurList.append(kns2) b1w = bishop1() b1w.feldnummer=16 b1w.pos=(6,0,0) self.figurList.append(b1w) b2w = bishop1() b2w.feldnummer=40 b2w.pos=(15,0,0) self.figurList.append(b2w) b1s = bishop1(farbe1=(0.5, 0.5, 0.5)) b1s.feldnummer=23 b1s.pos=(6,0,21) self.figurList.append(b1s) b2s = bishop1(farbe1=(0.5, 0.5, 0.5)) b2s.feldnummer=47 b2s.pos=(15,0,21) self.figurList.append(b2s) for m in range (0,57,8): self.brett[m].besetzt=1 for j in range (1,58,8): self.brett[j].besetzt=1 for k in range (6,63,8): self.brett[k].besetzt=1 for l in range (7,64,8): self.brett[l].besetzt=1 def run (self): pick = None #das angeklickte Objekt - am Anfang keines c=0 d=-6 e=27 f=0 while True: rate(30) if scene.mouse.events: m1 = scene.mouse.getevent() # get event if m1.drag and m1.pick: for i in self.figurList: if m1.pick in i.objects: drag_pos = i.pos drag_pos.y=0 pick = m1.pick.frame break# if touched #drag_pos = m1.pickpos # where on the ball #pick = m1.pick.frame # pick now true (not None) elif m1.drop and pick: # released at end of drag for b in self.brett: if mag (b.pos-pick.pos)<1.5: pick.pos=b.pos index=self.figurList.index(i) self.brett[i.feldnummer].besetzt=0 i.gezogen=i.gezogen+1 self.controller.weiterleiten(str(b.nummer)+","+str(index)) if self.brett[b.nummer].besetzt==1: for a in self.figurList: if a.feldnummer==b.nummer: gesch_F=a #geschlagene figur else: pass if gesch_F.color==color.white and i.color==(0.5, 0.5, 0.5): gesch_F.pos=(3*f,0,d) f=f+1 if f==8: d=d-3 f=0 self.brett[b.nummer].besetzt=1 self.brett[i.feldnummer].besetzt=0 i.gezogen=i.gezogen+1 i.feldnummer=b.nummer self.controller.weiterleiten(str(b.nummer)+","+str(index)) break elif gesch_F.color==(0.5, 0.5, 0.5) and i.color==color.white: gesch_F.pos=(3*c,0,e) c=c+1 if c==8: e=e+3 c=0 self.brett[b.nummer].besetzt=1 self.brett[i.feldnummer].besetzt=0 i.gezogen=i.gezogen+1 i.feldnummer=b.nummer self.controller.weiterleiten(str(b.nummer)+","+str(index)) break else: alte_FNr=i.feldnummer altes_F=self.brett[alte_FNr] i.pos=altes_F.pos self.brett[b.nummer].besetzt=1 self.brett[i.feldnummer].besetzt=1 i.gezogen=i.gezogen-1 #self.controller.weiterleiten(str(i.feldnummer)+","+str(index)) break self.brett[b.nummer].besetzt=1 i.feldnummer=b.nummer break pick = None # end dragging (None is false) 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 # offset for where the ball was touched: drag_pos = new_pos i.pos = drag_pos + vector(0,0.15,0) # update drag position def figur_setzen(self,feldnummer,figur_nummer): i=self.figurList[figur_nummer] for j in self.brett: if j.nummer==feldnummer: i.pos=j.pos #x=Spielbrett() #x.run() PORT = 11111 class Steuerung(Thread): def __init__(self, spiel, port=11111): 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 teil=nachricht.split(",") nachricht = "self.view.figur_setzen("+teil[0]+","+teil[1]+")" self.s.sendto(nachricht, ('255.255.255.255', self.PORT)) # versenden der Nachricht an Tupel(IP, PORT) if __name__ == "__main__": scene.center=(10,0,10) scene.forward=(0,-0.5,-1) spiel = Spielbrett() #das eigentliche Spiel steuerung = Steuerung(spiel, PORT) #Die Steuerung, mit dem Spiel und einem Port als Argument spiel.controller = steuerung #Setzen des Referenzattributs spiel.start() #Das Spiel muss von Thread erben, hier wird dessen run-Methode gestartet """ class bishop(frame): def __init__(self, farbe1=color.white): frame.__init__(self) self.c5 = cone(frame=self,pos=(0,0,0),axis=(0,3.4,0),radius=0.8,color=farbe1) self.c9 = cone(frame=self,pos=(0,3.5,0),axis=(0,-3.4,0),radius=0.6,color=farbe1) #koerper self.c6 = cylinder(frame=self,pos=(0,0,0),radius=1,axis=(0,0.4,0),color=farbe1) self.c7 = cone(frame=self,pos=(0,0.4,0),radius=1,axis=(0,0.8,0),color=farbe1) #fuss self.c3 = cone(frame=self,pos=(0,3.5,0),radius=0.65,axis=(0,0.6,0),color=farbe1) self.c10 = ring(frame=self,pos=(0,3.5,0),radius=0.65,axis=(0,1,0),color=farbe1) self.c11 = sphere(frame=self,pos=(0,4.1,0),radius=0.14,color=farbe1) self.c4 = cone(frame=self,pos=(0,2.8,0),radius=0.7,axis=(0,0.8,0),color=farbe1) #kopfring for i in range (6,24,9): b1 = bishop() b1.pos=(i,0,0) for i in range (6,24,9): b2 = bishop(farbe1=(0.5, 0.5, 0.5)) b2.pos=(i,0,21) """ """ for i in range(0,57,8): self.brett[i].besetzt=1 for i in range(1,58,8): self.brett[i].besetzt=1 for i in range(6,63,8): self.brett[i].besetzt=1 for i in range(7,64,8): self.brett[i].besetzt=1 for i in range (0,63): if self.brett[i].besetzt == 1: self.brett[i].stein.color=color.red """