Links und Funktionen
Sprachumschaltung

Navigationspfad


Inhaltsbereich

Mensch ärgere dich nicht

-vier Spieler können Figuren bewegen -Netzwerkunterstützung -Würfelfunktion -Teile der Spiellogik

Python Source icon 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()

Funktionsleiste