Jython HomeDruckenJava-Online

Nim Spiel


Das Nim Spiel ist eines der beliebtesten Spiele der Spieltheorie, da sich die Gewinnstrategie relativ einfach herausfinden lässt. In unserem Beispiel spielt der Benutzer gegen Computer, wobei der Computer nach der Gewinnstrategier vorgeht.

Zu Beginn des Spieles sind 15 Zündhölzer vorhanden. Der Benutzer entfernt mit einem Mausklick auf Zündhölzer 1, 2, oder 3 Zündhölzer, danach kommt der Computer zum Zug. Wer das letzte Hölzchen entfernt, hat verloren.


  Webstart


# NimmGame.py

from gamegrid import *
import random
            
class Match(Actor):
    def __init__(self):
         Actor.__init__(self, True, "sprites/match.gif")
         
def pressCallback(e):
    global nbMatches
    global nbTakenMatches
    loc = toLocationInGrid(e.getX(), e.getY()) 
    if loc.x > 46 and loc.x < 50 and loc.y > 2 and loc.y < 6:
        if nbTakenMatches == 0:
            setTitle("You have to remove at least 1 match!")
        else:
            nbTakenMatches = 0
            if nbMatches > 0: 
                setTitle("Computer play")
                computerMove()
    else: 
        actor = None
        for y in range(2, 8): 
            actor = getOneActorAt(Location(loc.x, y))
            if actor != None:
                break
        if actor != None:
            if nbTakenMatches == 3:
                setTitle("Take a maximum of 3. Click 'OK' to continue!")
            else:     
                actor.removeSelf()
                nbMatches -= 1
                nbTakenMatches += 1
                setTitle(str(nbMatches) + " matches remaining. Click 'OK' to continue.")
                if nbMatches == 0:
                    setTitle("You lost!")
                    addActor(Actor("sprites/gameover.gif"), Location(15, 4))
        refresh()
    return True  

def nbWin(n):
    f = ((n - 1) // 4) * 4 + 1
    return f
     
def computerMove():
    global nbMatches
    nbRemovedMatches = nbMatches - nbWin(nbMatches)
    if nbRemovedMatches == 0:
      nbRemovedMatches = 1 # optimal strategy impossible
    nbMatches = nbMatches - nbRemovedMatches
    for x in range(nbRemovedMatches):
        matches = getActors(Match)
        if len(matches) > 0:
            k = int(random.random() * len(matches))
            removeActor(matches[k])   
            setTitle(str(nbMatches) + " matches remaining. Your move now.")
    if nbMatches == 0:
        setTitle("You win.")
        addActor(Actor("sprites/gameover.gif"), Location(15, 4))
    refresh()

makeGameGrid(52, 9, 12, False, mousePressed = pressCallback)
nbMatches = 15
nbTakenMatches = 0 
for i in range(15):
    match = Match()
    addActor(match, Location(2 + 3 * i , 4))
addActor(Actor("sprites/btn_ok_0.gif"), Location(48 , 4)) 
setTitle(str(nbMatches) + " matches. Click on 1, 2 or 3 matches to remove, then click 'OK'.")  
show()
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

if loc.x > 46 and loc.x < 50 and loc.y > 2 and loc.y < 6): Falls Ok-Button gedrückt wird
for y in range(2, 8):
     actor = getOneActorAt(Location(loc.x, y))

Damit die Zündhölzer auf der ganzen Länge (nicht nur in der Mitte) angeklickt werden können
actor.removeSelf()): Ein Zündholz wird entfernt
f = ((n - 1) // 4) * 4 + 1: Gewinnstrategie. Der Computer versucht diese Anzahl Zündholzer zu erreichen
matches = getActors(Match) : Liste der verbliebenen Zündholzer
k = int(random.random() * len(matches)): Der Computer wählt zufällig aus der noch vorhandenen Zündhölzer eins aus