Mastermind


MasterMind ist ein bekanntes Logikspiel. Der Computer legt zu Beginn einen vierstelligen geordneten Farbcode fest, der aus sechs Farben ausgewählt wird; eine Farbe kann auch mehrmals verwendet werden. Der Spieler versucht den Code herauszufinden, in dem er reihenweise farbige Stifte setzt. Nach jedem Zug erhällt er die Information, wie viele Stifte er in Farbe und Position richtig gesetzt hat (schwarzer Stift) und wie viele Stifte zwar die richtige Farbe haben, aber an einer falschen Position stehen (weisser Stift). Ziel ist es, den Farbcode mit möglichst wenigen Zügen zu erraten. Gelingt es dem Spieler nicht, den Farbcode in 7 Zügen zu erraten, wird die Lösung angezeigt.

In unserem MasterMind werden die Farbstifte mit linkem Masklick an der entsprechenden Position gesetzt. Erneutes Klicken bewirkt Farbwechsel. Ein Zug wird mit Klick auf Fragezeichen beendet. Dann werden die schwarzen bzw. weissen Stifte angezeigt.

 


# Mastermind.py

from gamegrid import *
import random

def showTips(whitePegs, blackPegs):
    for i in range(4):
        ep = Actor(True, "sprites/evalpeg.png", 2)
        if blackPegs > 0:
            ep.show(0)
            addActor(ep, Location(1, currentRow))
            ep.turn(90 * i)
            blackPegs -= 1
        elif whitePegs > 0:
            ep.show(1)
            addActor(ep, Location(1, currentRow))
            ep.turn(90 * i)
            whitePegs -= 1
    
def finishRound():
    removeActor(marker)
    x = 2
    for spriteNr in secretCode:
        peg = Actor("sprites/peg.png", 6)
        peg.show(spriteNr)
        addActor(peg, Location(x, 1))
        x += 1
 
def evaluateGuess(guess):
    global currentRow, placedPegs
    blackPegs = 0
    whitePegs = 0
    for i in range(4):
        if guess[i] == secretCode[i]:
            blackPegs += 1
            
    alreadyProcessed = [] 
    for color in secretCode:
        for j in range(4):
            if color == guess[j] and not j in alreadyProcessed: 
               alreadyProcessed.append(j)
               whitePegs += 1
               break
    whitePegs = whitePegs - blackPegs
    showTips(whitePegs, blackPegs)

    if blackPegs == 4: 
        setStatusText("Correct!")
        finishRound()
    else:
        currentRow -= 1
    if currentRow == 1: 
        finishRound()
        setStatusText("Pattern not found!")
    marker.setLocation(Location(1, currentRow))
    placedPegs = 0
    removeActor(evaluateBtn)

def pressCallback(e):
    global placedPegs
    global evaluateBtn          
    loc = toLocationInGrid(e.getX(), e.getY())  
    if placedPegs == 4 and loc.x == 1 and loc.y == currentRow:
         guess = [0] * 4
         for i in range(4):
             guess[i] = getOneActorAt(Location(2 + i, currentRow)).getIdVisible()
         evaluateGuess(guess)
 
    if loc.y == currentRow and loc.x > 1 and loc.x < 6:
         if getOneActorAt(loc) == None:
              addActor(Actor("sprites/peg.png", 6), loc)
              placedPegs += 1
              if placedPegs == 4:
                   evaluateBtn = Actor("sprites/evalbutton.png")
                   addActor(evaluateBtn, Location(1, currentRow))                      
         else:   
              getOneActorAt(loc).showNextSprite()
    refresh()
    return True    
     
# ---------------- main ----------------------
makeGameGrid(7, 10, 60, None, "sprites/mastermindbg.png", False,  mousePressed = pressCallback)
addStatusBar(30)
setStatusText("Make your choice with mouse clicks")
setTitle("Mastermind")
placedPegs = 0
currentRow = 8 
secretCode = [0] * 4
for i in range(4):
   secretCode[i] = random.randint(0, 5)
marker = Actor("sprites/rowmarker.png")
addActor(marker, Location(1, currentRow))
show()
doRun()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

Das ganze Spiel wird vom Hauptprogramm gesteuert, es sind keine weiteren Klassen notwendig

   
def showTips(): definiert, wie die schwarzen und weissen Korrekturstifte gesetzt werden sollen
def finishRound(): wird aufgerugen, wenn eine Spielrunde fertig ist. Zeigt die Lösung an
def evaluateGuess(): vergleicht die gesetzten Farbstifte mit dem Geheimcode.
def pressCallback: definiert die Farbwahl und das Setzten der Farbstifte per Mausklick