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
"""