Хотите добавить AI-игрока в Python Pong, используя Turtle - PullRequest
2 голосов
/ 23 апреля 2019

Я не могу заставить свой пинг-понг работать на Python 3.7.1.Я признаю, что я новичок в этом, поэтому исправление может быть проще, чем я делаю.

Я пробовал различные способы настройки циклов, но я думаю, что мне не хватает чего-то маленького, чтоиграет большую роль в обработке кода.

import turtle

# build window
win = turtle.Screen()

# window title/color/size
win.title("csc2280 Project")
win.bgcolor("black")
win.setup(width=800, height=800)
win.tracer(0)

# user paddle
user_paddle = turtle.Turtle()
# user paddle build
user_paddle.shape('square')
user_paddle.shapesize(stretch_wid=5, stretch_len=1)
user_paddle.speed('fastest')
user_paddle.color("white")
# user paddle position
user_paddle.penup()
user_paddle.goto(-350, 0)

# ai paddle
AI_paddle = turtle.Turtle()
# ai paddle build
AI_paddle.shape('square')
AI_paddle.shapesize(stretch_wid=5, stretch_len=1)
AI_paddle.speed('fastest')
AI_paddle.color('white')
#ai paddle position
AI_paddle.penup()
AI_paddle.goto(350, 0)
AI_paddle.speed = 15

# ball 
ball = turtle.Turtle()
ball.speed(0)
# ball shape
ball.shape('circle')
ball.color('white')
# ball position
ball.penup()
ball.goto(0, 0)
# ball movement
ball.dx = 2
ball.dy = 2

# Pen
pen = turtle.Turtle()
pen.speed(0)
pen.shape("square")
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)
pen.write("Player A: 0  Player B: 0", align = "center", font = ("Calibri", 24, "normal"))

# Keeping Score
score_p1 = 0
score_p2 = 0

# move user paddle up and down

# user paddle up
def user_paddle_up():
    y = user_paddle.ycor()
    y += 20
    user_paddle.sety(y)

# user paddle down
def user_paddle_down():
    y = user_paddle.ycor()
    y -= 20
    user_paddle.sety(y)

# actually moving the paddle
win.listen()
win.onkeypress(user_paddle_up, "Up")
win.onkeypress(user_paddle_down, "Down")

AI_paddle.forward(AI_paddle.speed)
y = AI_paddle.ycor()
if y < -300 or y > 300:
    AI_paddle.speed *= -1

Я думаю, что проблема где-то здесь.

# game loop
while True:
    win.update()

# moving the ball
    ball.setx(ball.xcor() + ball.dx)
    ball.sety(ball.ycor() + ball.dy)

    # create border
    if ball.ycor() > 290:
        ball.sety(290)
        ball.dy *= -1

    if ball.ycor() < -290:
        ball.sety(-290)
        ball.dy *= -1

    if ball.xcor() > 390:
        ball.goto(0,0)
        ball.dx *= -1

        # updating score
        score_p1 += 1    
        pen.clear()
        pen.write("Player A: {}  Player B: {}".format(score_p1, score_p2), align = "center", font = ("Calibri", 24, "normal"))

    if ball.xcor() < -400:
        ball.goto(0,0)
        ball.dx *= -1

        # updating score
        score_p2 += 1
        pen.clear()
        pen.write("Player A: {}  Player B: {}".format(score_p1, score_p2), align = "center", font = ("Calibri", 24, "normal"))


    # paddle/ball interaction
    if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < AI_paddle.ycor() + 40 and ball.ycor() > AI_paddle.ycor() -40):
        ball.setx(340)
        ball.dx *= -1

    if (ball.xcor() < -340 and ball.xcor() > -350) and (ball.ycor() < user_paddle.ycor() + 40 and ball.ycor() > user_paddle.ycor() -40):
        ball.setx(-340)
        ball.dx *= -1

Любая помощь будет очень признательна, так как это мой последний проект длясеместр, и это буквально единственное, что держит меня.

1 Ответ

0 голосов
/ 23 апреля 2019

Проблема, которую я обнаружил с вашим AI-плеером, состоит в том, что этот код находится в неправильном месте:

AI_paddle.forward(AI_paddle.speed)
y = AI_paddle.ycor()
if y < -300 or y > 300:
    AI_paddle.speed *= -1

Это прямо перед основным циклом, поэтому он выполняется только один раз.Он должен быть внутри основного цикла, например, как последний элемент.

Мне показалось, что в вашу игру трудно играть, поэтому я немного подправил некоторые элементы, чтобы сделать ее более играбельной, и ясделал исправление, которое я описал выше:

from turtle import Screen, Turtle

FONT = ("Calibri", 24, "normal")

# move user paddle up and down

# user paddle up
def user_paddle_up():
    y = user_paddle.ycor() + 20
    user_paddle.sety(y)

# user paddle down
def user_paddle_down():
    y = user_paddle.ycor() - 20
    user_paddle.sety(y)

# build window
win = Screen()

# window title/color/size
win.title("csc2280 Project")
win.bgcolor("black")
win.setup(width=800, height=800)
win.tracer(0)

# user paddle
user_paddle = Turtle('square')
# user paddle build
user_paddle.shapesize(stretch_wid=5, stretch_len=1)
user_paddle.color("white")
# user paddle position
user_paddle.penup()
user_paddle.setx(-350)

# AI paddle
AI_paddle = Turtle('square')
# AI paddle build
AI_paddle.shapesize(stretch_wid=5, stretch_len=1)
AI_paddle.color('white')
# AI paddle position
AI_paddle.penup()
AI_paddle.setx(350)
AI_paddle.speed = 10

# ball
ball = Turtle('circle')
# ball shape
ball.color('white')
# ball position
ball.penup()
# ball movement
ball.dx = 2
ball.dy = 2

# Court
court = Turtle(visible=False)
court.color("white")
court.penup()
court.goto(-400, -300)
court.pendown()
court.forward(800)
court.penup()
court.goto(-400, 300)
court.pendown()
court.forward(800)
court.penup()

# Pen
pen = Turtle(visible=False)
pen.color("white")
pen.penup()
pen.sety(325)
pen.write("Player A: 0  Player B: 0", align="center", font=("Calibri", 24, "normal"))

# Keeping Score
score_p1 = 0
score_p2 = 0

# actually moving the paddle
win.onkeypress(user_paddle_up, "Up")
win.onkeypress(user_paddle_down, "Down")
win.listen()

# game loop
while True:
    win.update()

    # moving the ball
    ball.setx(ball.xcor() + ball.dx)
    ball.sety(ball.ycor() + ball.dy)

    # enforce boundaries
    if ball.ycor() > 290:
        ball.sety(290)
        ball.dy *= -1
    elif ball.ycor() < -290:
        ball.sety(-290)
        ball.dy *= -1

    if ball.xcor() > 390:
        ball.goto(0, 0)
        ball.dx *= -1

        # updating score
        score_p1 += 1
        pen.clear()
        pen.write("Player A: {}  Player B: {}".format(score_p1, score_p2), align="center", font=FONT)

    elif ball.xcor() < -390:
        ball.goto(0, 0)
        ball.dx *= -1

        # updating score
        score_p2 += 1
        pen.clear()
        pen.write("Player A: {}  Player B: {}".format(score_p1, score_p2), align="center", font=FONT)

    # paddle/ball interaction
    if (330 < ball.xcor() < 370) and (AI_paddle.ycor() - 60 < ball.ycor() < AI_paddle.ycor() + 60):
        ball.setx(330)
        ball.dx = - abs(ball.dx)

    if (-370 < ball.xcor() < -330) and (user_paddle.ycor() - 60 < ball.ycor() < user_paddle.ycor() + 60):
        ball.setx(-330)
        ball.dx = abs(ball.dx)

    y = AI_paddle.ycor() + AI_paddle.speed
    if y < -240 or y > 240:
        AI_paddle.speed *= -1
    AI_paddle.sety(y)

Удачи в том, чтобы ваш AI-игрок стал умнее!

...