Mensch-Ärgere-Dich-Nicht SP
fertigSp.py — Python Source, 17 KB (18407 bytes)
Dateiinhalt
from visual import * import copy # Colormap: rot = 0, blau = 1, gruen = 2, gelb = 3 #Wichtigste Klasse, initalisiert Graphik und macht Bewegungen class Spielfeld(): def __init__(self): self.boxMain = box(pos=(0,-0.25,0),length=11,height=0.5, width=11) #Spielfeld self.goal = [0,0,0,0] #Spielstand self.colorStartField = [0,10,20,30] #Startfeld fuer Figuren einer Farbe die aus dem Haus kommen self.colorEndField = [39,9,19,29] #Endfeld fuer Figuren einer Farbe die aus dem Haus kommen # Array der Spieler: self.p[x][y] mit x = color und y = Nummer des Spielers eines Teams self.p = [[Player((1,0,0)),Player((1,0,0)),Player((1,0,0)),Player((1,0,0))],[Player((0,0,1)),Player((0,0,1)),Player((0,0,1)),Player((0,0,1))],[Player((0,1,0)),Player((0,1,0)),Player((0,1,0)),Player((0,1,0))],[Player((1,1,0)),Player((1,1,0)),Player((1,1,0)),Player((1,1,0))]] # Setzt die Startposition der Figuren self.p[0][0].pos = (-5,0,-4) self.p[0][1].pos = (-5,0,-5) self.p[0][2].pos = (-4,0,-4) self.p[0][3].pos = (-4,0,-5) self.p[1][0].pos = (5,0,-4) self.p[1][1].pos = (5,0,-5) self.p[1][2].pos = (4,0,-4) self.p[1][3].pos = (4,0,-5) self.p[2][0].pos = (5,0,4) self.p[2][1].pos = (5,0,5) self.p[2][2].pos = (4,0,4) self.p[2][3].pos = (4,0,5) self.p[3][0].pos = (-5,0,4) self.p[3][1].pos = (-5,0,5) self.p[3][2].pos = (-4,0,4) self.p[3][3].pos = (-4,0,5) #Kopiert die Startpositionen in posCopy, damit die Ursprungsposition einer Figur gespeichert ist self.p[0][0].posCopy = (-5,0,-4) self.p[0][1].posCopy = (-5,0,-5) self.p[0][2].posCopy = (-4,0,-4) self.p[0][3].posCopy = (-4,0,-5) self.p[1][0].posCopy = (5,0,-4) self.p[1][1].posCopy = (5,0,-5) self.p[1][2].posCopy = (4,0,-4) self.p[1][3].posCopy = (4,0,-5) self.p[2][0].posCopy = (5,0,4) self.p[2][1].posCopy = (5,0,5) self.p[2][2].posCopy = (4,0,4) self.p[2][3].posCopy = (4,0,5) self.p[3][0].posCopy = (-5,0,4) self.p[3][1].posCopy = (-5,0,5) self.p[3][2].posCopy = (-4,0,4) self.p[3][3].posCopy = (-4,0,5) #Array der "Haus"-Felder: self.pRoot[x][y] mit x = color und y = Nummer des Hausfeldes eines Teams self.pRoot = [[PosFeld((1,0,0)),PosFeld((1,0,0)),PosFeld((1,0,0)),PosFeld((1,0,0))],None,None,None] self.pRoot[1] = [PosFeld((0,0,1)),PosFeld((0,0,1)),PosFeld((0,0,1)),PosFeld((0,0,1))] self.pRoot[2] = [PosFeld((0,1,0)),PosFeld((0,1,0)),PosFeld((0,1,0)),PosFeld((0,1,0))] self.pRoot[3] = [PosFeld((1,1,0)),PosFeld((1,1,0)),PosFeld((1,1,0)),PosFeld((1,1,0))] # Setzt die Position der "Haus"-Felder self.pRoot[0][0].pos = (-5,0,-4) self.pRoot[0][1].pos = (-5,0,-5) self.pRoot[0][2].pos = (-4,0,-4) self.pRoot[0][3].pos = (-4,0,-5) self.pRoot[1][0].pos = (5,0,-4) self.pRoot[1][1].pos = (5,0,-5) self.pRoot[1][2].pos = (4,0,-4) self.pRoot[1][3].pos = (4,0,-5) self.pRoot[2][0].pos = (5,0,4) self.pRoot[2][1].pos = (5,0,5) self.pRoot[2][2].pos = (4,0,4) self.pRoot[2][3].pos = (4,0,5) self.pRoot[3][0].pos = (-5,0,4) self.pRoot[3][1].pos = (-5,0,5) self.pRoot[3][2].pos = (-4,0,4) self.pRoot[3][3].pos = (-4,0,5) #Array der "End"-Felder: self.pEnd[x][y] mit x = color und y = Nummer dse Endfeldes eines Teams self.pEnd = [[PosFeld((1,0,0)),PosFeld((1,0,0)),PosFeld((1,0,0)),PosFeld((1,0,0))],[PosFeld((0,0,1)),PosFeld((0,0,1)),PosFeld((0,0,1)),PosFeld((0,0,1))],[PosFeld((0,1,0)),PosFeld((0,1,0)),PosFeld((0,1,0)),PosFeld((0,1,0))],[PosFeld((1,1,0)),PosFeld((1,1,0)),PosFeld((1,1,0)),PosFeld((1,1,0))]] # Setzt die Position der "End"-Felder self.pEnd[0][0].pos = (-4,0,0) self.pEnd[0][1].pos = (-3,0,0) self.pEnd[0][2].pos = (-2,0,0) self.pEnd[0][3].pos = (-1,0,0) self.pEnd[1][0].pos = (0,0,-4) self.pEnd[1][1].pos = (0,0,-3) self.pEnd[1][2].pos = (0,0,-2) self.pEnd[1][3].pos = (0,0,-1) self.pEnd[2][0].pos = (4,0,0) self.pEnd[2][1].pos = (3,0,0) self.pEnd[2][2].pos = (2,0,0) self.pEnd[2][3].pos = (1,0,0) self.pEnd[3][0].pos = (0,0,4) self.pEnd[3][1].pos = (0,0,3) self.pEnd[3][2].pos = (0,0,2) self.pEnd[3][3].pos = (0,0,1) #Array der "neutralen"-Felder: self.pEnd[x] mit x = Nummer des Feldes startend beim roten Startfeld self.fieldNeutral = [] for x in range(40): if x == 0: self.fieldNeutral.append(PosFeld((1,0,0))) #rotes Startfeld elif x == 10: self.fieldNeutral.append(PosFeld((0,0,1))) #blaues Startfeld elif x == 20: self.fieldNeutral.append(PosFeld((0,1,0))) #gruenes Startfeld elif x == 30: self.fieldNeutral.append(PosFeld((1,1,0))) #gelbes Startfeld else: self.fieldNeutral.append(PosFeld()) #schwarzes Feld # Setzt die Position der "neutralen"-Felder self.fieldNeutral[0].pos= (-5,0,-1) self.fieldNeutral[1].pos= (-4,0,-1) self.fieldNeutral[2].pos= (-3,0,-1) self.fieldNeutral[3].pos= (-2,0,-1) self.fieldNeutral[4].pos= (-1,0,-1) self.fieldNeutral[5].pos= (-1,0,-2) self.fieldNeutral[6].pos= (-1,0,-3) self.fieldNeutral[7].pos= (-1,0,-4) self.fieldNeutral[8].pos= (-1,0,-5) self.fieldNeutral[9].pos= (0,0,-5) self.fieldNeutral[10].pos= (1,0,-5) self.fieldNeutral[11].pos= (1,0,-4) self.fieldNeutral[12].pos= (1,0,-3) self.fieldNeutral[13].pos= (1,0,-2) self.fieldNeutral[14].pos= (1,0,-1) self.fieldNeutral[15].pos= (2,0,-1) self.fieldNeutral[16].pos= (3,0,-1) self.fieldNeutral[17].pos= (4,0,-1) self.fieldNeutral[18].pos= (5,0,-1) self.fieldNeutral[19].pos= (5,0,0) self.fieldNeutral[20].pos= (5,0,1) self.fieldNeutral[21].pos= (4,0,1) self.fieldNeutral[22].pos= (3,0,1) self.fieldNeutral[23].pos= (2,0,1) self.fieldNeutral[24].pos= (1,0,1) self.fieldNeutral[25].pos= (1,0,2) self.fieldNeutral[26].pos= (1,0,3) self.fieldNeutral[27].pos= (1,0,4) self.fieldNeutral[28].pos= (1,0,5) self.fieldNeutral[29].pos= (0,0,5) self.fieldNeutral[30].pos= (-1,0,5) self.fieldNeutral[31].pos= (-1,0,4) self.fieldNeutral[32].pos= (-1,0,3) self.fieldNeutral[33].pos= (-1,0,2) self.fieldNeutral[34].pos= (-1,0,1) self.fieldNeutral[35].pos= (-2,0,1) self.fieldNeutral[36].pos= (-3,0,1) self.fieldNeutral[37].pos= (-4,0,1) self.fieldNeutral[38].pos= (-5,0,1) self.fieldNeutral[39].pos= (-5,0,0) #Methode, die berechnet ob playerFrame um die Anzahl field bewegt werden kann (return bool) def calcPossible(self,playerFrame,field): newField = playerFrame.fieldPos + field #neue Position der Figur #wenn im Endbereich if playerFrame.isEndZone: #wenn neue Position innerhalb des Endbereich if newField < 4: #wenn keine eigene Figur blockiert if self.fieldNeutral[newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color: return True return False #wenn im Haus elif playerFrame.fieldPos == -1: #wenn keine eigene Figur blockiert if (self.fieldNeutral[newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color) and field == 6: return True else: return False #wenn kommt in den Endbereich elif newField > self.colorEndField[playerFrame.color]and (playerFrame.fieldPos < self.colorStartField[playerFrame.color] or playerFrame.color == 0): if newField < self.colorEndField[playerFrame.color] + 5: newField -= (self.colorEndField[playerFrame.color] +1)#neue Position auf das korrekte Endfeld setzten #wenn keine eigene Figur blockiert if self.pEnd[playerFrame.color][newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color: return True else: return False else: return False #wenn Overflow im Array elif newField > 39: newField -= 40 #Overflow beheben #wenn keine eigene Figur blockiert if (self.fieldNeutral[newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color): return True else: return False #sonst, wenn keine eigene Figur blockiert elif self.fieldNeutral[newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color: return True return False #Methode, die playerFrame um die Anzahl field bewegt, wenn moeglich (return bool) def movePlayer(self,playerFrame,field): newField = playerFrame.fieldPos + field #neue Position der Figur #wenn im Endbereich if playerFrame.isEndZone: #wenn neue Position innerhalb des Endbereich if newField < 4: #wenn keine eigene Figur blockiert if self.fieldNeutral[newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color: self.pEnd[playerFrame.color][playerFrame.fieldPos] = None #Spieler im alten Feld entfernen playerFrame.fieldPos = newField #neue Position des Spielers intern setzten self.pEnd[playerFrame.color][newField].player = playerFrame #Spieler im neuen Feld anmelden playerFrame.pos = self.pEnd[playerFrame.color][newField].pos #neue Position des Spielers graphisch setzten return True return False #wenn im Haus elif playerFrame.fieldPos == -1: newField = self.colorStartField[playerFrame.color] #wenn keine eigene Figur blockiert if (self.fieldNeutral[newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color) and field == 6: #wenn anderer Spieler wird geschlagen if not self.fieldNeutral[newField].player == None and not self.fieldNeutral[newField].player.color == playerFrame.color: self.fieldNeutral[newField].player.pos = self.fieldNeutral[newField].player.posCopy #geschlagenen Spieler zuruecksetzen self.fieldNeutral[newField].player.fieldPos = -1 #neue Position des geschlagenen Spielers auf im Haus setzten playerFrame.fieldPos = newField #neue Position des Spielers intern setzten self.fieldNeutral[newField].player = playerFrame #Spieler im neuen Feld anmelden playerFrame.pos = self.fieldNeutral[newField].pos #neue Position des Spielers graphisch setzten return True return False #wenn kommt in den Endbereich elif newField > self.colorEndField[playerFrame.color]and (playerFrame.fieldPos < self.colorStartField[playerFrame.color] or playerFrame.color == 0): if newField < self.colorEndField[playerFrame.color] + 5: newField -= self.colorEndField[playerFrame.color] newField -= 1 #neue Position auf das korrekte Endfeld setzten #wenn keine eigene Figur blockiert if (self.fieldNeutral[newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color): self.goal[playerFrame.color] += 1 #der Farbe einem Punkt geben playerFrame.isEndZone = True #Zustand des Spielers intern auf im Ziel setzten self.fieldNeutral[playerFrame.fieldPos].player = None #Spieler im alten Feld entfernen playerFrame.fieldPos = newField #neue Position des Spielers intern setzten self.pEnd[playerFrame.color][newField].player = playerFrame #Spieler im neuen Feld anmelden playerFrame.pos = self.pEnd[playerFrame.color][newField].pos #neue Position des Spielers graphisch setzten return True else: return False else: return False #wenn Overflow im Array elif newField > 39: newField -= 40 #Overflow beheben #wenn keine eigene Figur blockiert if (self.fieldNeutral[newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color): #wenn anderer Spieler wird geschlagen if not self.fieldNeutral[newField].player == None and not self.fieldNeutral[newField].player.color == playerFrame.color: self.fieldNeutral[newField].player.pos = self.fieldNeutral[newField].player.posCopy #geschlagenen Spieler zuruecksetzen self.fieldNeutral[newField].player.fieldPos = -1 #neue Position des geschlagenen Spielers auf im Haus setzten self.fieldNeutral[playerFrame.fieldPos].player = None #Spieler im alten Feld entfernen playerFrame.fieldPos = newField #neue Position des Spielers intern setzten self.fieldNeutral[newField].player = playerFrame #Spieler im neuen Feld anmelden playerFrame.pos = self.fieldNeutral[newField].pos #neue Position des Spielers graphisch setzten return True return False #sonst, wenn keine eigene Figur blockiert elif self.fieldNeutral[newField].player == None or not self.fieldNeutral[newField].player.color == playerFrame.color: #wenn anderer Spieler wird geschlagen if not self.fieldNeutral[newField].player == None and not self.fieldNeutral[newField].player.color == playerFrame.color: self.fieldNeutral[newField].player.pos = self.fieldNeutral[newField].player.posCopy #geschlagenen Spieler zuruecksetzen self.fieldNeutral[newField].player.fieldPos = -1 #neue Position des geschlagenen Spielers auf im Haus setzten self.fieldNeutral[playerFrame.fieldPos].player = None #Spieler im alten Feld entfernen playerFrame.fieldPos = newField #neue Position des Spielers intern setzten self.fieldNeutral[newField].player = playerFrame #Spieler im neuen Feld anmelden playerFrame.pos = self.fieldNeutral[newField].pos #neue Position des Spielers graphisch setzten return True return False def allOfColorInHouse(self,color): for i in range(4): if field.p[color][i].fieldPos <> -1 and field.p[color][i].isEndZone == False: return False return True #Klasse Player, erbt von Frame class Player(frame): def __init__(self,color = (1,1,1)): frame.__init__(self) #super-Konstruktor self.bottom = cone(frame = self,axis=(0,1,0), radius=0.35,color = color) #graphischer Rumpf self.head = sphere(frame = self, radius=0.3,pos=(0,0.8,0),color = color) #graphischer Kopf self.fieldPos = -1 #aktuelle Position (Startposition = -1) if color == (1,0,0): #Farbcode in Colormap (siehe Anfang der Datei) self.color = 0 elif color == (0,0,1): self.color = 1 elif color == (0,1,0): self.color = 2 elif color == (1,1,0): self.color = 3 self.isEndZone= False #Zustand(im Ziel, oder nicht) self.posCopy = None #Kopie der Startposition #Klasse PosFeld (Spielfeld), erbt von Frame class PosFeld(frame): def __init__(self,color= (0,0,0)): frame.__init__(self) #super-Konstruktor self.feld = ring(frame = self,axis=(0,1,0),radius=0.4,thickness= 0.05, color = color) #graphischer Kreis self.player = None #Spieler der auf dem Feld steht #Hauptthread scene.title = "Mensch aergere dich nicht!" #Fenstertitel scene.forward = (0,-0.5,-1) #Kamerawinkel scene.background = (1,1,1) #Hintergrund field = Spielfeld() #Spielfeld (Hauptobjekt) random.seed() #Wuerfel curPlayer = 0 #aktueller Spieler while True: #Spiel startet isAgain = True allInHouseCount = 0 #Zug beginnt while isAgain: endTurn = False #Wuerfeln print "Spieler Nummer "+ str(curPlayer) + " ist an der Reihe:" result = random.randint(1,7) print "Er wuerfelt " + str(result) if result == 6: isAgain = True else: isAgain = False if field.allOfColorInHouse(curPlayer) and allInHouseCount <2: isAgain = True allInHouseCount += 1 #testet Moeglichkeit zu ziehen for i in range(4): if field.calcPossible(field.p[curPlayer][i],result): #Mauseingabe: wartet auf korrekten Zug while not endTurn: rate(30) if scene.mouse.events: m1 = scene.mouse.getclick() #wenn Spieler angeklickt if type(m1.pick) == cone or type(m1.pick) == sphere: #wenn Farbe des Spielers stimmt if m1.pick.frame.color == curPlayer: #bewege Spieler und setzte ob der Zug korrekt war (je nach Ergebnis von movePlayer) endTurn = field.movePlayer(m1.pick.frame,result) #wenn Sieger if field.goal[curPlayer] > 3: print str(curPlayer) + "wins!" #Spieler wechseln if curPlayer == 0: curPlayer = 1 else: curPlayer = 0