python - 使函数返回 bool 值并在 tic/tac/toe 游戏中实现 AI

标签 python python-3.x turtle-graphics tic-tac-toe

我制作了一个 tic/tac/toe 游戏,但我想创建一个控制“O”而用户控制“X”的计算机播放器。

对于我的代码中的 clicked 函数,我试图返回一个 bool 值,但我不确定我是否做得正确。如果用户的点击操作成功,该函数返回True。如果用户点击的位置已经在棋盘区域之外,则移动无效,并且该函数应返回 False。我的代码:

import turtle
import time
import random 

pieces = ["_", "_", "_", "_", "_", "_", "_", "_", "_"]
turn = "X"
def drawgame(brd):
    # draw board
    turtle.setup(600, 600)
    turtle.bgcolor("silver")
    turtle.color("white")
    turtle.hideturtle()
    turtle.speed('fastest')
    turtle.width(10)
    turtle.up()

    # Horizontal bars
    turtle.goto(-300, 100)
    turtle.down()
    turtle.forward(600)
    turtle.up()
    turtle.goto(-300, -100)
    turtle.down()
    turtle.forward(600)
    turtle.up()

    # Vertical bars
    turtle.goto(-100, 300)
    turtle.setheading(-90)
    turtle.down()
    turtle.forward(600)
    turtle.up()
    turtle.goto(100, 300)
    turtle.down()
    turtle.forward(600)
    turtle.up()
    turtle.color("blue")
    x, y = -300, 300
    for pos in pieces:
        if pos == "X":
            # Draw X
            turtle.up()
            turtle.goto(x + 20, y - 20)
            turtle.setheading(-45)
            turtle.down()
            turtle.forward(226)
            turtle.up()
            turtle.goto(x + 180, y - 20)
            turtle.setheading(-135)
            turtle.down()
            turtle.forward(226)
            turtle.up()

        elif pos == "O":
            #Draw O
            turtle.up()
            turtle.goto(x + 100, y - 180)
            turtle.setheading(0)
            turtle.down()
            turtle.circle(80)
            turtle.up()
        x += 200
        if x > 100:
            x = -300
            y -= 200


def clicked(board, x, y):
    #sig: list(str), int, int -> NoneType
    global turn, pieces
    turtle.onscreenclick(None)  # disabling handler when inside handler
    column = (x + 300) // 200
    row = (y - 300) // -200
    square = int(row * 3 + column)
    print("User clicked ", x, ",", y, " at square ", square)

    if pieces[square] == "_":
        pieces[square] = turn
        if turn == "X":
            turn = "O"
        else:
            turn = "X"
        drawgame(pieces)
    else:
        print("That square is already taken")
    turtle.onscreenclick(clicked)

def computer_AI(board):
    #sig: list(str) -> NoneType

def gameover(board):
    #sig: list(str) -> bool
    #checks gameover on board if there is a three in a row pattern or not

def handler(x, y):
    #sig: int, int -> NoneType
    if clicked(the_board, x, y):
        drawgame(the_board)
        if not gameover(pieces):
            computer_AI(pieces)
            drawgame(pieces)
            gameover(pieces)


def main():
    #Runs the game 
    turtle.tracer(0,0)
    turtle.hideturtle()
    turtle.onscreenclick(handler)
    drawgame(pieces)
    turtle.mainloop()

main()


我正在尝试实现此输出:enter image description here

感谢任何帮助。

最佳答案

For my clicked function in my code, I am trying to return a bool but I am not sure if I am doing it right.

clicked() 函数是一个事件处理程序,它不会向任何人返回任何内容。我们必须基于此进行设计。我修改了下面的代码,结合了 hander()clicked() 函数,使其现在可以“播放”。即用户先走,并且是“X”,然后计算机响应玩家“O”:

import turtle
import random

board = ["_", "_", "_", "_", "_", "_", "_", "_", "_"]

def drawgame(board):
    # draw board
    turtle.setup(600, 600)
    turtle.bgcolor("silver")
    turtle.color("white")
    turtle.hideturtle()
    turtle.speed('fastest')
    turtle.width(10)
    turtle.up()

    # Horizontal bars
    turtle.goto(-300, 100)
    turtle.down()
    turtle.forward(600)
    turtle.up()
    turtle.goto(-300, -100)
    turtle.down()
    turtle.forward(600)
    turtle.up()

    # Vertical bars
    turtle.setheading(-90)
    turtle.goto(-100, 300)
    turtle.down()
    turtle.forward(600)
    turtle.up()
    turtle.goto(100, 300)
    turtle.down()
    turtle.forward(600)
    turtle.up()

    turtle.color("blue")
    x, y = -300, 300

    for pos in board:
        if pos == "X":
            # Draw X
            turtle.up()
            turtle.goto(x + 20, y - 20)
            turtle.setheading(-45)
            turtle.down()
            turtle.forward(226)
            turtle.up()
            turtle.goto(x + 180, y - 20)
            turtle.setheading(-135)
            turtle.down()
            turtle.forward(226)
            turtle.up()
        elif pos == "O":
            # Draw O
            turtle.up()
            turtle.goto(x + 100, y - 180)
            turtle.setheading(0)
            turtle.down()
            turtle.circle(80)
            turtle.up()

        x += 200
        if x > 100:
            x = -300
            y -= 200

def handler(x, y):
    # sig: list(str), int, int -> NoneType

    turtle.onscreenclick(None)  # disabling handler when inside handler

    column = (x + 300) // 200
    row = (y - 300) // -200
    square = int(row * 3 + column)

    if board[square] == "_":
        board[square] = "X"
        drawgame(board)
        if not gameover(board):
            computer_AI(board)
            drawgame(board)

            if not gameover(board):
                turtle.onscreenclick(handler)  # allow player to take a turn
    else:
        print("That square is already taken!")
        turtle.onscreenclick(handler)  # allow player to retake turn

def computer_AI(board): # sig: list(str) -> NoneType

    """ stupid robot player, just picks randomly from what's available """

    available = [index for index, character in enumerate(board) if character == "_"]

    if available:
        index = random.choice(available)
        board[index] = "O"

def gameover(board):
    # sig: list(str) -> bool
    # checks game over on board if there is a three in a row pattern or not

    pass  # to be implemented!

    return False

def main():
    # Runs the game
    turtle.hideturtle()
    turtle.onscreenclick(handler)
    drawgame(board)
    turtle.mainloop()

main()

要做的事情:确定游戏是否结束以及谁赢了的逻辑仍然不存在,因此您需要编写它。目前它只返回 False 来指示游戏尚未结束。 computer_AI() 代码根本没有智能,它只是记下所有空心方 block 并随机选择一个。您需要改进这一点。

关于python - 使函数返回 bool 值并在 tic/tac/toe 游戏中实现 AI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55978919/

相关文章:

python - 父进程死亡时如何终止Python `ProcessPoolExecutor`?

python - scipy.stats.pearsonr(x, y) 中的非相关检验是什么?

python - 为什么相同数据的 pandas.DataFrame.cov() 方法比 numpy.dot(...) 快几个数量级?

python - 如果任何列值不在 pandas 的列表中,则删除组

python - 用python与 turtle 画星星

python - turtle 颜色不随变量和列表而改变

python - 在 Pandas 数据框中每个日期只有 1 条记录

python - 在 Python 3.7+ 中查找字典中第一项的时间复杂度

python - 导入错误 : cannot import name 'binary_type'

python - 如何防止 turtle 向相反方向移动