HomeTurtlegrafikGPanelRobotikGameGrid WebTigerPython
 Python - Online
nimmGame

NIM SPIEL

 

 

SPIELBESCHREIBUNG

 

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.

Programm:

# NimGame.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()
doRun()
► In Zwischenablage kopieren

 

 

Erklärungen zum Programmcode

 
1. if loc.x > 46 and loc.x < 50 and loc.y > 2 and loc.y < 6) :  Falls Ok-Button gedrückt wird

2. 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

3.
actor.removeSelf(): Ein Zündholz wird entfernt

4. f = ((n - 1) // 4) * 4 + 1 : Gewinnstrategie. Der Computer versucht diese Anzahl Zündholzer zu erreichen

5. matches = getActors(Match): Liste der verbliebenen Zündholzer

6. k = int(random.random() * len(matches)): Der Computer wählt zufällig aus der noch vorhandenen Zündhölzer eins aus