希望使用Turtle在Python Pong中添加AI播放器

时间:2019-04-23 00:49:56

标签: python turtle-graphics

我似乎无法让AI乒乓球拍在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 :(得分:0)

我在AI播放器中发现的问题是此代码在错误的位置:

var multiParamValues = new Dictionary<string, string[]>
{
    {"ParamA", new[] {"1", "2"}},
    {"ParamB", new[] {"55", "56"}}
};

foreach (var paramValue in multiParamValues)
{
    foreach (var value in paramValue.Value)
    {
        Console.WriteLine($"{paramValue.Key}, {value}");
    }
}

它就在主循环之前,因此只执行一次。它应该在主循环内 ,例如作为最后一项。

我发现您的游戏难以玩,因此我在下面进行了一些调整,以使其更加可玩,并做出了上述修正:

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

祝您的AI播放器更聪明!