TigerJython xx
für Gymnasien

Online Pearl Game mit MQTT

Zu Beginn sind 18 Perlen in 4 Reihen angeordnet. Der erste Spieler entfernt mit Mausklick eine beliebige Anzahl Perlen, allerdings nur aus der gleichen Reihe und drückt "Ok". Danach kommt der zweite Spieler zum Zug. Wer die letzte Perle entfernen muss, hat verloren. Die Gewinnstrategie lässt sich bei diesem Spiel nicht so einfach ermitteln.

  Player 0

Player 1


Die beiden Spieler verwenden das gleiche Topic /swissgame/pearlgame und müssen vor dem Spielbeginn die Programmzeile player = 0 bzw. player = 1 ergänzen. Der Player 0 beginnt. So wie in den vorhergehenden Spielen, wird jeweils die x- und y-Koordinaten des Mausklicks übermittelt. Wenn mehrere Perlen entfernt werden, muss überprüft werden, ob alle aus der gleichen Reihe stammen. Dazu wird die y-Koordinate der ersten Perle als activeRow bezeichnet. Die y-Koordinaten der nächsten Perlen werden mit dieser verglichen. Mit Klick auf den Ok-Button wird die Spielberechtigung an den Partner übergeben.

# PearlGame.py

from gamegrid import *
from mqttclient import GameClient

player = x # set player = 0 or player = 1
myTopic = "/swissgame/pearlgame"
                           
def initGame():
    nbRows = 4
    nb = 6
    for k in range(nbRows):
        for i in range(nb):
            pearl = Actor("sprites/token_1.png")
            addActor(pearl, Location(i + 1, k + 1))
        nb -= 1    
    btn = Actor("sprites/btn_ok_0.gif")
    addActor(btn, Location(6, 5))
                
def onMousePressed(e):
    global isMyMove, nbPearl, isOver, activeRow, nbRemoved
    if not isMyMove or isOver:
         return
    btnLoc = Location(6,5)    
    loc = toLocationInGrid(e.getX(), e.getY())
    if loc != btnLoc:
        x = loc.x
        y = loc.y  
        if activeRow != -1 and activeRow != y:
            setStatusText("You must remove pearls from the same row.")
        else:
            actor = getOneActorAt(loc)
            if actor != None:      
                actor.removeSelf()
                client.sendMessage(str(x) + str(y))
                activeRow = y 
                nbPearl -= 1
                nbRemoved += 1
                refresh()        
                if nbPearl == 0:    
                    isOver = True                    
                    setStatusText("End of game. You lost!")
    elif nbRemoved == 0: # ok btn pressed
        setStatusText("You have to remove at least 1 pearl!")
    else:
        client.sendMessage("ok")  
        setStatusText("Wait!")
        nbRemoved = 0
        activeRow = -1
        isMyMove = False          

def onNotifyExit():
    client.disconnect()
    dispose()
    
def onStateChanged(state):
    global isMyMove
    if state == "CONNECTING":
        setStatusText("Connecting to broker...")    
    elif state == "CONNECTED":
        setStatusText("Connected. Waiting for partner...")    
    elif state == "READY":
        if player == 0:
            setStatusText("Remove any number of pearls from same row and click OK!")
            isMyMove = True    
        else:
           setStatusText("Wait for partner's move!")    
    elif state == "DISCONNECTED":
        setStatusText("Partner disconnected!")    
        isMyMove = False

def onMessageReceived(msg):
    global isMyMove, nbPearl, isOver    
    if msg == "DISCONNECT":
        setStatusText("Partner disconnected")
        isMyMove = False
        return
    if msg == "ok":
        isMyMove = True
        setStatusText("Remove any number of pearls from same row and click OK!")
    else:
         x = int(msg[0])
         y = int(msg[1])
         loc = Location(x, y)            
         getOneActorAt(loc).removeSelf()
         refresh()
         nbPearl -=1
         if nbPearl == 0:
             isOver = True                    
             setStatusText("End of game. You win!")                     
 
makeGameGrid(8, 6, 70, False, mousePressed = onMousePressed, notifyExit = onNotifyExit)
addStatusBar(30)
initGame()
show()
activeRow = -1
nbPearl = 18
nbRemoved = 0
isMyMove = False
isOver = False     
setTitle("Player #" + str(player))
host = "m2m.eclipse.org"
client = GameClient(onStateChanged, onMessageReceived, myTopic)
client.connect(host)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

Erklärungen zum Programmcode:

initGame(): Erzeugt 18 Perlen, die in 4 Reihen angeordnet sind und den OK-Button in der Zelle (6, 5). Dieser Programmteil ist im Server- und Clientprogramm identisch und könnte in einer separaten Datei gespeichert werden
activeRow = -1: Vor der Wahl der ersten Perle, ist activeRow auf - 1 gesetzt (ausserhalb des Spielfensters)
elif nbRemoved == 0: Wenn OK-Button gedrückt wurde, ohne vorher mindestens eine Perle entfernt zu haben, ist der Zug ungültig
client.sendMessage("ok") : Wenn der OK-Button gedrückt wurde wird der String "ok" gesendet und dadurch die Spielberechtigung an den Partner übergeben