Добавление пользовательских проверок в игру Python Tic-Tac-Toe - PullRequest
0 голосов
/ 13 октября 2018
import turtle
#1)draw board
sc= turtle.Screen()
sc.setup(300,300)
import turtle
sc= turtle.Screen()
sc.setup(300,300)

turtle.speed(0)
turtle.pensize(10)
turtle.bgcolor("black")
turtle.pencolor("white")
turtle.penup()
turtle.goto(-150,50)
turtle.pendown()
turtle.forward(300)
turtle.penup()
turtle.goto(-150,-50)
turtle.pendown()
turtle.forward(300)
turtle.penup()
turtle.goto(-50,150)
turtle.setheading(-90)
turtle.pendown()
turtle.forward(300)
turtle.penup()
turtle.goto(50,150)
turtle.pendown()
turtle.forward(300)
turtle.penup()



#2) X's and O's

turtle.pencolor("yellow")
def kreuz(x,y):
turtle.penup()
turtle.goto(x+30,y-45)
turtle.setheading(-45)
turtle.pendown()
turtle.forward(50)
turtle.penup()
turtle.goto(x+60,y-40)
turtle.setheading(-130)
turtle.pendown()
turtle.forward(50)
turtle.penup()
def kreis(x,y):
turtle.penup()
turtle.goto(x+50,y-80)
turtle.setheading(0)
turtle.pendown()
turtle.circle(20)
turtle.penup()



AlleTeile=["","","","","","","","",""]
nächsterZug="X"

def zeichneTeile (AlleTeile):
x = -150
y = 150
for einTeil in AlleTeile:
    if einTeil=="X":
        kreuz(x,y)
    elif einTeil=="O":
        kreis(x,y)
    else:
        print("leeres feld")
    x=x+100
    if x > 50:
        x=-150
        y=y-100



zeichneTeile(AlleTeile)

def geklickt(x,y):
global nächsterZug,AlleTeile
senkrecht= (x+150) // 100
waagrecht= (-y+150)// 100
Bereich= senkrecht+waagrecht*3
Bereich=int(Bereich)
print("Du klicktest auf Bereich-Nummer", Bereich)
AlleTeile[Bereich]=nächsterZug
if nächsterZug =="X":
    nächsterZug="O"
else:
    nächsterZug="X"
zeichneTeile(AlleTeile)

turtle.onscreenclick(geklickt)
turtle.mainloop()

Я хочу создать эту игру в крестики-нолики с использованием черепахи в Python, но я застрял.Проблема в том, что я продолжаю рисовать крестики и нолики на игровом поле после того, как все 9 полей заполнены крестиками и крестиками.Как я могу кодировать это так, чтобы после 9 ходов (9 полей) больше не было возможности рисовать?

1 Ответ

0 голосов
/ 13 октября 2018

Поскольку неиспользуемые квадраты состоят из пустой строки в AlleTeile, исправить это тривиально, поскольку пустые строки False в логическом контексте.В верхней части geklickt() после оператора global:

if all(AlleTeile):
    print("All taken!")
    return

Мы можем использовать тот же прием позже в этой функции, чтобы предотвратить перезапись существующих квадратов.После расчета Bereich мы можем сделать что-то вроде:

print("Du klicktest auf Bereich-Nummer", Bereich, end="")
if AlleTeile[Bereich]:
    print(" -- already taken!")
    return
else:
    print()

Вот моя полная переделка с вышеуказанными изменениями, некоторыми черепахами, чистотой кода и переводом на английский язык, любезно предоставленным Google (и здравым смыслом):

from turtle import Screen, Turtle

# X's and O's

def cross(x, y):
    turtle.penup()
    turtle.goto(x + 30, y - 35)
    turtle.setheading(-45)
    turtle.pendown()
    turtle.forward(50)
    turtle.penup()
    turtle.goto(x + 60, y - 30)
    turtle.setheading(-130)
    turtle.pendown()
    turtle.forward(50)
    turtle.penup()

def nought(x, y):
    turtle.penup()
    turtle.goto(x + 50, y - 70)
    turtle.setheading(0)
    turtle.pendown()
    turtle.circle(20)
    turtle.penup()

# Playing the game

def drawSquares():
    screen.tracer(False)  # because this routine is a graphics bottleneck

    x, y = -150, 150

    for square in AllSquares:
        if square == "X":
            cross(x, y)
        elif square == "O":
            nought(x, y)

        x += 100

        if x > 50:
            x = -150
            y -= 100

    screen.tracer(True)

def clicked(x, y):
    global turn

    if all(AllSquares):
        print("All taken!")
        return

    vertical = (x + 150) // 100
    horizontal = (150 - y) // 100

    Area = int(vertical + horizontal * 3)
    print("You clicked area number", Area, end="")
    if AllSquares[Area]:
        print(" -- already taken!")
        return
    else:
        print()

    AllSquares[Area] = turn

    if turn == "X":
        turn = "O"
    else:
        turn = "X"

    drawSquares()

# Draw the board

screen = Screen()
screen.setup(330, 330)
screen.bgcolor("black")

turtle = Turtle(visible=False)
turtle.pensize(10)
turtle.color("white")
turtle.speed('fastest')

turtle.penup()
turtle.goto(-150, 50)
turtle.pendown()
turtle.forward(300)
turtle.penup()
turtle.goto(-150, -50)
turtle.pendown()
turtle.forward(300)

turtle.setheading(-90)

turtle.penup()
turtle.goto(-50, 150)
turtle.pendown()
turtle.forward(300)
turtle.penup()
turtle.goto(50, 150)
turtle.pendown()
turtle.forward(300)
turtle.penup()

# Start the game

turtle.color("yellow")

AllSquares = ["", "", "", "", "", "", "", "", ""]

turn = "X"

drawSquares()

screen.onscreenclick(clicked)

screen.mainloop()
...