[英]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()
我只創建一次播放器,並將其分配給變量p1
, p2
。
稍后,我將p1
或p2
分配給變量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.