Links und Funktionen
Sprachumschaltung

Navigationspfad


Inhaltsbereich

Schach2.12.py

Python Source icon 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
            
"""            

Funktionsleiste