【问题标题】:Make function return boolean and implement AI in tic/tac/toe game使函数返回布尔值并在tic/tac/toe游戏中实现AI
【发布时间】:2019-09-22 12:54:55
【问题描述】:

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

对于我代码中的clicked 函数,我试图返回一个布尔值,但我不确定我是否做得对。如果用户的点击操作成功,该函数返回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()


我正在尝试实现这个输出:

感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

    对于我的代码中的clicked 函数,我试图返回一个布尔值,但我 我不确定我是否做得对。

    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() 代码根本没有智能,它只是简单地记下所有空心方块并随机选择一个。您需要对此进行改进。

    【讨论】:

    • 我终于做到了!但现在我有这个可怕的错误
    • 我把它放在一个新问题中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多