TigerJython | xx für Gymnasien |
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() |
Erklärungen zum Programmcode:
|
||||
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 |