Esempio n. 1
0
def randomMove(gameBoard):
    if glf.isFull( gameBoard ):
        return 0,0
    numrows, numcolumns= py.shape(gameBoard)
    randomRow= 5 #random.randint(0,numrows-1)
    randomColumn= random.randint(0,numcolumns-1)
    while not glf.isMoveValid( randomColumn, gameBoard):
        #randomRow= random.randint(0,numrows-1)
        randomColumn= random.randint(0,numcolumns-1)   
    #print "playing randomly at " ,randomRow, randomColumn 
    return randomRow, randomColumn
Esempio n. 2
0
def gamePlay(player1Mode, player2Mode,trainPlies=None, useGui=1):
    sequentialPositionsNeeded= 4
    playerModes= {1:player1Mode, 2:player2Mode}
    if useGui:
        plt.ion()
        boardHandler= gui.createBoard()
    else:
        boardHandler= None
        
    shape= (gui.NUM_ROWS, gui.NUM_COLUMNS)
    gameBoard= py.zeros(shape)
    winner= -1
    playerTurn= 1
    playerColor= gui.PLAYER1_COLOR
    cumulatedTime= 0.0
    numMoves= 0
    while winner == -1:
        moveValid= True
        #print "-------------------------------------------------Start Turn---------------------------------------------"
        #print playerTurn
        if playerModes[playerTurn] == "Human":
            res= boardHandler.ginput(n=1, timeout=9999999)
            x,y= res[0] 
            x,y= math.floor(x),math.floor(y)
            #update gameBoard if move valid
            if glf.isMoveValid( x, gameBoard ):
                matrixX,matrixY= glf.playMove( (x,y), gameBoard, boardHandler, playerColor, playerTurn, useGui )
            else:
                #request click from same player
                moveValid= False
                print "move not valid. please click in a cell"
        elif playerModes[playerTurn] == "Random":
                startTime= time.time()
                matrixX,matrixY= ai.randomMove(gameBoard)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "RandomPlus":
                startTime= time.time()
                matrixX,matrixY= ai.randomMovePlus(gameBoard)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "RandomPlus2":
                startTime= time.time()
                matrixX,matrixY= ai.randomMovePlus2(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "RandomPlusPlus":
                startTime= time.time()
                (matrixX,matrixY),isRandom= ai.randomMovePlusPlus(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "BestLocal":
                startTime= time.time()
                matrixX,matrixY= ai.bestLocalMove(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "BestLocalPlus":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrWin= ai.bestLocalMovePlus(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "lookAheadOne":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.lookAheadOne(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "lookAheadTwice":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrWin= ai.lookAheadTwice(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "lookAheadThrice":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrWin= ai.lookAheadThrice(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "lookAheadOnePlus":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.lookAheadOnePlus(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "lookAheadTwicePlus":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.lookAheadTwicePlus(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "lookAheadThricePlus":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.lookAheadThricePlus(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "randomOffense":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.randomOffense(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "randomOffenseWithTwicePlus":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.randomOffenseWithTwicePlus(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "randomOffenseOneWithTwicePlus":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.randomOffenseOneWithTwicePlus(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "forwardEval":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.forwardEval(gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "knnPlayer":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.knnPlayer( trainPlies[playerTurn], gameBoard, playerTurn )
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "minimaxKnn":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.minimaxKnn( trainPlies[playerTurn], gameBoard, playerTurn)
                endTime= time.time()
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
        elif playerModes[playerTurn] == "minimaxSeqCellsPlus":
                startTime= time.time()
                (matrixX,matrixY),isBlockOrwin= ai.minimaxSeqCellsPlus( None, gameBoard, playerTurn)
                endTime= time.time()
                #if not glf.isMoveValid( matrixX, gameBoard ):
                #    print "minimaxSeqCellsPlus returns invalid move: ", matrixX, matrixY
                matrixX,matrixY= glf.playMove( (matrixY,matrixX), gameBoard, boardHandler, playerColor, playerTurn, useGui )
                
        #print "-------------------------------------------------End Turn---------------------------------------------"
        if moveValid:
            if playerTurn == 2:
                cumulatedTime+= endTime-startTime
                numMoves+=1
            res,winner,pos= glf.moveYieldsWin( gameBoard, sequentialPositionsNeeded, (matrixX,matrixY), playerColor )
            if res:
                print "WE HAVE A WINNER!!"
                print winner
                print "positons are: "
                print pos
                fileText= "average time for " + str(playerModes[2]) + " = " + str( cumulatedTime / numMoves )
                with open( 'times', 'a' ) as f:
                    f.write( fileText + "\n" )
                return winner
            elif glf.gameContainsTie(gameBoard):
                print "Game is Tied!! GG"
                fileText= "average time for " + str(playerModes[2]) + " = " + str( cumulatedTime / numMoves )
                with open( 'times', 'a' ) as f:
                    f.write( fileText + "\n" )
                return 0
            #next player's turn
            if playerTurn == 1:
                playerTurn= 2
                playerColor= gui.PLAYER2_COLOR
            else:
                playerTurn= 1
                playerColor= gui.PLAYER1_COLOR