Python turtle Reversi Othello

import turtle


# Initializing Board
# Dorost Kardane Board
def initialiseBoard(n):
    board = []
    board = [[0 for i in range(n)] for j in range(n)]
    half = int(n / 2)
    board[half - 1][half - 1] = 1
    board[half - 1][half] = -1
    board[half][half - 1] = -1
    board[half][half] = 1
    return board


# Making GUI Playing Board And User Interface With Turtle
# Dorost Kardane Mohit Bazi Va neveshtar haye marboot be mohit karbari
def drawBoard(boardSize, t):
    t.hideturtle()
    t.speed(0)
    t.penup()
    t.right(90)
    t.forward(240)
    t.left(90)
    t.forward(240)
    t.left(90)
    t.pendown()
    t.forward(480)
    t.left(90)
    for coln in range(boardSize):
        t.forward(480 / boardSize)
        t.left(90)
        t.forward(480)
        t.backward(480)
        t.right(90)

    t.left(90)

    for row in range(boardSize):
        t.forward(480 / boardSize)
        t.left(90)
        t.forward(480)
        t.backward(480)
        t.right(90)

    t.penup()

    for row in range(boardSize):
        t.pencolor("black")
        t.goto(-250, (240 - (row) * 480 / boardSize - 480 / boardSize / 3 * 2))
        t.write(str(row + 1), False, align='center', font=("Arial", 12, "normal"))

    for coln in range(boardSize):
        t.pencolor("red")
        t.goto((-240 + coln * 480 / boardSize + 480 / boardSize / 2), 250)
        t.write(chr(coln + 65), False, align='center', font=("Arial", 12, "normal"))


# Adding taws to the playing board
# Ezafe Kardane Mohre ha
def updateScreen(b):
    boardSize = len(b)
    t = turtle.Turtle()
    t.speed(0)
    t.hideturtle()
    t.shapesize(480 / boardSize / 25)
    t.pencolor("black")
    t.shape("circle")
    t.penup()
    for row in range(boardSize):
        for coln in range(boardSize):
            if (b[row][coln] > 0):
                t.goto(480 / boardSize * coln - 240 + 480 / boardSize / 2,
                       480 / boardSize * row - 240 + 480 / boardSize / 2)
                t.fillcolor("black")
                t.stamp()
            if (b[row][coln] < 0):
                t.goto(480 / boardSize * coln - 240 + 480 / boardSize / 2,
                       480 / boardSize * row - 240 + 480 / boardSize / 2)
                t.fillcolor("red")
                t.stamp()
    return


def move(b, m, p):
    r = m[0]
    c = m[1]
    if (len(m[2]) == 0):
        return
    else:
        for move in m[2]:
            newR = r + move[0]
            newC = c + move[1]
            while (b[newR][newC] != abs(b[newR][newC]) * p):
                b[newR][newC] = (abs(b[newR][newC]) + 1) * p
                newR = newR + move[0]
                newC = newC + move[1]
        b[r][c] = p
        # placePiece(b, r, c, p)
        updateScreen(b)


def legalDirection(r, c, b, p, u, v):
    foundOpponent = False
    while (r >= 0 and r <= len(b) and c >= 0 and c <= len(b)):
        r = r + u
        c = c + v
        if (r < 0 or r >= len(b) or c < 0 or c >= len(b)):
            return False
        if (b[r][c] == 0):
            return False
        if (b[r][c] == abs(b[r][c]) * p):
            if foundOpponent:
                return True
            else:
                return False
        if (b[r][c] != abs(b[r][c]) * p):
            foundOpponent = True
    return False


def legalMove(r, c, b, p):
    legalDirections = []
    if (b[r][c] != 0):
        return legalDirections
    if (legalDirection(r, c, b, p, -1, -1)):
        legalDirections.append((-1, -1))
    if (legalDirection(r, c, b, p, -1, 0)):
        legalDirections.append((-1, 0))
    if (legalDirection(r, c, b, p, -1, 1)):
        legalDirections.append((-1, 1))
    if (legalDirection(r, c, b, p, 0, -1)):
        legalDirections.append((0, -1))
    if (legalDirection(r, c, b, p, 0, 0)):
        legalDirections.append((0, 0))
    if (legalDirection(r, c, b, p, 0, 1)):
        legalDirections.append((0, 1))
    if (legalDirection(r, c, b, p, 1, -1)):
        legalDirections.append((1, -1))
    if (legalDirection(r, c, b, p, 1, 0)):
        legalDirections.append((1, 0))
    if (legalDirection(r, c, b, p, 1, 1)):
        legalDirections.append((1, 1))
    return legalDirections


def moves(b, p):
    availableMoves = []
    for r in range(len(b)):
        for c in range(len(b)):
            legal = legalMove(r, c, b, p)
            if legal != []:
                availableMoves.append((r, c, legal))
    return availableMoves


def scoreBoard(b):
    blackScore = 0
    redScore = 0
    for r in range(len(b)):
        for c in range(len(b)):
            if (b[r][c] > 0):
                if b[r][c] > 0:
                    blackScore = blackScore + b[r][c]
            if (b[r][c] < 0):
                if b[r][c] < 0:
                    redScore = redScore - b[r][c]
    return (blackScore, redScore)


def checkMoveScore(b, m,
                   p):  # Goes through all possible moves and finds the one with the highest score. The computer will choose this one.
    moveScore = 1
    r = m[0]
    c = m[1]
    if (len(m[2]) == 0):
        return 0
    else:
        for move in m[2]:
            newR = r + move[0]
            newC = c + move[1]
            while (b[newR][newC] != abs(b[newR][newC]) * p):
                moveScore = moveScore + abs(b[newR][newC])
                newR = newR + move[0]
                newC = newC + move[1]
    return moveScore


def selectMove(b, availableMoves, p):
    bestMoveScore = 0
    bestMoveIndex = -1
    currentMoveIndex = 0
    for availableMove in availableMoves:
        currentMoveScore = checkMoveScore(b, availableMove, p)
        if (bestMoveScore < currentMoveScore):
            bestMoveIndex = currentMoveIndex
            bestMoveScore = currentMoveScore
        currentMoveIndex = currentMoveIndex + 1
    return availableMoves[bestMoveIndex]


def main():
    playing = True
    while playing:
        board = []
        while (board == []):
            try:
                screen = turtle.Screen()
                screen.clear()
                board = initialiseBoard(8)
            except:
                print("Enter a valid number.")
                pass

        t = turtle.Turtle()
        t.hideturtle()
        turtleText = turtle.Turtle()
        turtleText.hideturtle()
        turtleText.penup()
        turtleText.speed(0)
        turtle.title("Othello")
        turtle.setup(800, 600)
        screen.bgcolor("darkgreen")
        drawBoard(8, t)
        updateScreen(board)
        playerTurn = 1
        gameOver = False
        blackCanMove = True
        redCanMove = True
        while (not gameOver):
            if playerTurn == -1:
                print("Player Red's turn.")
            else:
                print("Player black's turn.")
            scores = scoreBoard(board)
            turtleText.clear()
            turtleText.pencolor("black")
            turtleText.goto(-280, 280)
            turtleText.write("Black: " + str(scores[0]), False, align='center', font=("Arial", 12, "bold"))
            turtleText.pencolor("Red")
            turtleText.goto(280, 280)
            turtleText.write("Red: " + str(scores[1]), False, align='center', font=("Arial", 12, "bold"))
            validMove = False

            if (not blackCanMove or not redCanMove):
                print("GAME OVER!")
                if scores[0] > scores[1]:
                    print("Black wins!")
                else:
                    print("Red wins!")
                gameOver = True

            while (not validMove):
                inRange = False
                while (not inRange):
                    r = -1
                    try:
                        r = 8 - int(input("Row of new piece: "))
                    except:
                        print("Enter a valid number in range.")
                        pass
                    if (r >= 0 and r < 8):
                        inRange = True
                    else:
                        print("Enter a valid number in range.")
                inRange = False
                while (not inRange):
                    c = input("Column of new piece: ")
                    c = c.upper()
                    try:
                        c = ord(c) - ord('A')
                        if (c >= 0 and c < 8):
                            inRange = True
                        else:
                            print("Enter a valid letter in range.")
                    except:
                        print("Enter a valid letter in range.")
                        pass
                availableMoves = [r, c, legalMove(r, c, board, playerTurn)]
                if (availableMoves[2] != []):
                    validMove = True
                    move(board, availableMoves, playerTurn)
                else:
                    print("Invalid move.")
            if playerTurn == -1:
                playerTurn = 1
            else:
                playerTurn = -1
        playAgain = -1
        while (playAgain < 1 or playAgain > 2):
            try:
                print("Play again?")
                print("1. yes")
                print("2. no")
                playAgain = int(input(""))
                if playAgain == 2:
                    playing = False
            except:
                pass
    return


main()

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值