簡體   English   中英

井字游戲播放器在python中的問題

[英]problem with Tic-Tac-Toe player in python

我正在為井字游戲編寫程序,作為我正在上課的作業。 目前,我正在嘗試使用pycharm中的烏龜創建井字游戲。 我的意圖是讓我在其中運行程序的游戲開始,該程序首先隨機選擇要啟動的玩家,然后顯示所選玩家的烏龜,一旦該玩家開始,他們就可以使用箭頭鍵在屏幕上移動烏龜。板,然后按空格畫X或O,然后它自動結束回合並開始下一個玩家回合。 這應該繼續進行,直到一個或另一個已經連續宣布3個獲勝者為止。 到目前為止,我已經在烏龜中創建了一個3x3的棋盤,制作了一只玩家烏龜,並賦予了它移動到9個正方形中任意一個的中心的能力,然后在空間上繪制了x或o。

我的問題是從切換播放器開始,我的意圖是讓一個for循環運行5次(將轉10圈,只有9個空格),而在該for循環中,我希望有兩個while循環(每個循環一個)播放器)。 我已經定義了播放器烏龜,因此我只需要在while循環中調用player_1即可創建一個可以在程序中控制的烏龜。 然后,我計划在一個true或false變量上設置while循環,每當按下空格鍵以將玩家標記放到板上時,該變量將被更改,以便while循環結束並移至下一個玩家。 但是我很快發現這種方法的問題在於,當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()

我只創建一次播放器,並將其分配給變量p1p2

稍后,我將p1p2分配給變量player並將其用作當前玩家。

我不使用while循環,因為我在set_positon()內計算了移動(玩家的變化set_positon() 我還更改了set_positon() player。

它不會在行/列中檢查3,但也應該在set_positon()執行此操作

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM