Py学习  »  Python

python中tic tac toe player的问题

Zoga Zela • 6 年前 • 1819 次点击  

我正在为tic tac toe写一个程序,作为我正在上的一门课的作业。目前,我正在尝试创建一个使用海龟在皮查姆井字游戏。我的目的是有一个游戏,我运行程序,它开始随机选择一个玩家开始,然后显示被选择的玩家的海龟,一旦该玩家开始,他们可以使用箭头键移动海龟在棋盘周围,并按空格绘制一个x或o,然后它自动结束他们的回合并开始下一个玩家转身。这应该持续到一个或另一个连续三次宣布胜利者为止。到目前为止,我已经在Turtle中创建了一个3x3板,制作了一个玩家Turtle,并让它能够移动到9个方格中的任何一个方格的中心,然后在空间上绘制一个X或O。

我的问题开始于球员的转换我的意图是有一个for循环,将运行5次(这将给10个回合,只有9个空间),在这个for循环,我想有两个while循环(每个球员一个)。我定义了player turtles,这样我只需要在while循环中调用player_1,它就会创建一个可以在我的程序中控制的turtle。然后,我计划将while循环设置在一个true或false变量上,每当按下空格键将players标记放在板上时,变量将被更改,以便while循环结束并移动到下一个player。但我很快发现这个方法的问题是,我的玩家乌龟被无限地重新创建为while命令循环,因此当玩家试图移动这个片段时,它很快就会重置为其原始状态。

我可以看到需要发生的是,我需要找到一种方法,使while语句在等待玩家做出决定时保持不变,但我不知道什么样的命令可以做到这一点。有人知道我如何告诉程序等待while语句,直到海龟做出选择?

import turtle


Window = turtle.Screen()
Window.bgcolor()
Window.title("Tic Tac Toe")

# Drawing the Board
def border():
    border_outer = turtle.Turtle()
    border_outer.speed(0)
    border_outer.penup()
    border_outer.setposition(-375, -375)
    border_outer.pendown()
    border_outer.pensize(3)
    for num in range(4):
        border_outer.forward(750)
        border_outer.left(90)
        border_outer.hideturtle()

        # inside border
        border_inner1 = turtle.Turtle()
        # border_inner1.color("red")
        border_inner1.speed(0)
        border_inner1.penup()
        border_inner1.setposition(-125, 375)
        border_inner1.pendown()
        border_inner1.pensize(3)
        border_inner1.right(90)
        border_inner1.forward(750)
        border_inner1.left(90)
        border_inner1.forward(250)
        border_inner1.left(90)
        border_inner1.forward(750)
        border_inner1.hideturtle()

        border_inner2 = turtle.Turtle()
        # border_inner2.color("red")
        border_inner2.speed(0)
        border_inner2.penup()
        border_inner2.setposition(-375, 125)
        border_inner2.pendown()
        border_inner2.pensize(3)
        border_inner2.forward(750)
        border_inner2.right(90)
        border_inner2.forward(250)
        border_inner2.right(90)
        border_inner2.forward(750)
        border_inner2.hideturtle()

# Player 1 Turtle
def player_1():
    # Player 1
    global player
    player = turtle.Turtle()
    player.shape("circle")
    player.penup()
    player.color("blue")
    player.speed()

playerspeed = 250

# Moving the player #1
def move_left():
    x = player.xcor()
    x -= playerspeed
    if x < -375:
        x = -250
        player.setx(x)

def move_right():
    x = player.xcor()
    x += playerspeed
    if x > 375:
        x = 250
        player.setx(x)

def move_down():
    y = player.ycor()
    y -= playerspeed
    if y < -375:
        y = -250
        player.sety(y)

def move_up():
    y = player.ycor()
    y += playerspeed
    if y > 375:
        y = 250
        player.sety(y)

def set_position():
    x = player.xcor()
    y = player.ycor()
    player.goto(x, y - 50)
    player.pendown()
    player.pensize(10)
    player.circle(50, None, None)
    player.penup()
    player.goto(x, y)
    global flag
    flag = False


# Keyboard Bindings for player 1
turtle.listen()
turtle.onkey(move_left, "Left")
turtle.onkey(move_right, "Right")
turtle.onkey(move_up, "Up")
turtle.onkey(move_down, "Down")
turtle.onkey(set_position, "space")

flag = 'false'

border()

while flag == True:
    player_1


turtle.mainloop()
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46297
文章 [ 1 ]  |  最新文章 6 年前
furas
Reply   •   1 楼
furas    6 年前

我只创建一次播放器并分配给变量 p1 , p2 是的。

后来我指派 P1号 P2页 到变量 player 作为当前玩家使用。

我不用 while 循环因为我在里面数移动(玩家的变化) set_positon() 是的。我也在里面换球员 设置位置() 是的。

它不检查第3行/列,但也应该检查 设置位置()

import turtle

window = turtle.Screen()
window.bgcolor()
window.title("Tic Tac Toe")

# Drawing the Board
def draw_border():
    t = turtle.Turtle()
    t.speed(0)
    t.pensize(3)

    t.penup()
    t.home()   
    t.setposition(-375, -375)
    t.pendown()

    for num in range(4):
        t.forward(750)
        t.left(90)
        t.hideturtle()

    t.penup()
    t.home()   
    t.setposition(-125, 375)
    t.pendown()

    t.right(90)
    t.forward(750)
    t.left(90)
    t.forward(250)
    t.left(90)
    t.forward(750)
    t.hideturtle()

    t.penup()
    t.home()   
    t.setposition(-375, 125)
    t.pendown()

    t.forward(750)
    t.right(90)
    t.forward(250)
    t.right(90)
    t.forward(750)
    t.hideturtle()

def create_player(color):
    p = turtle.Turtle()

    p.shape("circle")
    p.penup()
    p.color(color)
    p.speed()
    p.hideturtle()

    return p

# Moving the player

def move_left():
    x = player.xcor()
    x -= playerspeed
    if x < -375:
        x = -250
    player.setx(x)

def move_right():
    x = player.xcor()
    x += playerspeed
    if x > 375:
        x = 250
    player.setx(x)

def move_down():
    y = player.ycor()
    y -= playerspeed
    if y < -375:
        y = -250
    player.sety(y)

def move_up():
    y = player.ycor()
    y += playerspeed
    if y > 375:
        y = 250
    player.sety(y)

def set_position():
    global player
    global count_changes

    x = player.xcor()
    y = player.ycor()

    if (x,y) in occupied_places:
        print("Can't put here")
        return

    occupied_places.append( (x,y) )

    #TODO: check board if place is empty (using list with occupied places)        
    player.goto(x, y - 50)
    player.pendown()
    player.pensize(10)
    player.circle(50, None, None)
    player.penup()
    player.goto(x, y)

    #TODO: check board if player win (using list with occupied places)

    # change player
    if player == p1:
        player.hideturtle()
        player = p2
        player.showturtle()
    else:
        player.hideturtle()
        player = p1
        player.showturtle()

    # count changes
    count_changes += 1
    if count_changes >= 9:
        print("END")
        #exit()

# Keyboard Bindings for active player 
turtle.listen()
turtle.onkey(move_left, "Left")
turtle.onkey(move_right, "Right")
turtle.onkey(move_up, "Up")
turtle.onkey(move_down, "Down")
turtle.onkey(set_position, "space")

draw_border()

# create players
p1 = create_player('blue')
p2 = create_player('red')
playerspeed = 250

# select first player
player = p1
player.showturtle()

occupied_places = []

# count how many times player was changed
count_changes = 0

turtle.mainloop()