用Pyhton Turtle 模块做小游戏

本小妞迷上赌 提交于 2020-11-23 07:38:49

前面我们用 Turtle模块模拟了贪吃蛇的游戏,现在我们来模拟另外一个经典的小游戏 Pong Game。这个经典的乒乓球游戏在手机和文群星上面当年也是风靡一时的。现在看看怎么实现。

当然界面是比较丑一点,我是随便找了一个贴图当背景,主要看看功能怎么实现的。这个游戏很多地方设计和贪吃蛇相似,关键点搞定反弹角度的数学关系,其他都很容易。

用Pyhton Turtle 模块做小游戏 - 乒乓球

分解一下基本功能:
1.设计2个拍子,可以上下控制移动
2.球会自己跑
3.球碰墙壁会反弹
4.球碰拍子会反弹
5.球出界算分
6.接球以后会加速





解决方案:

  1. 2个拍子就是2个海龟的对象,通过监听事件控制
  2. 球是另外一个海龟对象,设定x坐标和y坐标的初始值,每次goto移动一下就好了
  3. 球到了边界反弹,注意他的Y坐标其实还是按照初始的方向递增,X方向反过来了,因此我们修改一下x,y的递增方向就好了
  4. 球到了拍子反弹,这是X坐标不变化,Y坐标反过来
  5. 显示牌是一个新的海龟对象,每次更新里面的显示参数就是了
  6. 加速的效果其实是修改timeout sleep的时间,每次改小一点点刷新快了看起来就更快了

直接上源代码:

main.py

from turtle import Turtle, Screen
from paddle import Paddle
import time
from ball import Ball
from scoreboard import Scoreboard

#初始化一下界面,背景图,长度宽度,关掉动画
screen = Screen()
screen.setup(width=800, height=600)
screen.bgcolor("black")
screen.title("Pong Game")
screen.tracer(0)
screen.bgpic("pong.png")

#初始化两个拍子
r_paddle = Paddle(350,0)
l_paddle = Paddle(-350,0)

#初始化显示牌,球
scoreboard= Scoreboard()
ball = Ball()
screen.update()

#监听键盘事件
screen.listen()
screen.onkey(r_paddle.up,'Up')
screen.onkey(r_paddle.down,'Down')
screen.onkey(l_paddle.up,'w')
screen.onkey(l_paddle.down,'s')

game_is_on = True

while game_is_on:
    #设定延时,定时刷新界面
        time.sleep(ball.move_speed)
    screen.update()
    ball.move()

        #如果到达边界,那么反弹,本质是修改x坐标
    if ball.ycor() >= 250 or ball.ycor() < -250:
        print('bounce')
        ball.bounce_x()

        #如果右边的拍子接到球了,反弹,本质是修改y坐标
    if ball.xcor() > 320 and ball.distance(r_paddle)<50:
        # print("hit right paddle")
        ball.bounce_y()
        ball.move_speed*0.9

        #如果右边的拍子接到球了,反弹,本质是修改y坐标
    if ball.xcor() < -320 and ball.distance(l_paddle) < 50:
        # print("hit left paddle")
        ball.bounce_y()
        ball.move_speed * 0.9

    #如果球跑出左 右边界了,那么重置,计分
    if ball.xcor() > 380:

        ball.reset_posiiton()
        scoreboard.l_score()

    if ball.xcor() < -380:
        ball.reset_posiiton()
        scoreboard.r_score()

screen.exitonclick()

scoreboard.py

from turtle import Turtle
#初始化记分牌
class Scoreboard(Turtle):
    def __init__(self):
        super().__init__()
        self.color("gold")
        self.penup()
        self.hideturtle()
        self.lscore=0
        self.rscore=0
        self.update_score()

    def update_score(self):
        self.goto(-80, 250)
        self.write(self.lscore, align="center", font=("Courier", 40, "normal"))
        self.goto(80, 250)
        self.write(self.rscore, align="center", font=("Courier", 40, "normal"))
        self.goto(0,0)
#左边得分
    def l_score(self):
        self.lscore+=1
        self.clear()
        self.update_score()

#右边得分
    def r_score(self):
        self.rscore+=1
        self.clear()
        self.update_score()

ball.py

from turtle import  Turtle

class Ball(Turtle):
    def __init__(self):
        super().__init__()
        self.shape("circle")
        self.color("white")
        self.penup()
        self.x=10
        self.y=10
        self.move_speed=0.1

    def move(self):
        # 通过X,Y坐标来设定下一步移动
        self.goto(self.xcor()+self.x,self.ycor()+self.y)

    def bounce_x(self):
            # Y坐标反向增加
        self.y*=-1

    def bounce_y(self):
        # X 坐标 反向增加
        self.x *= -1

    def reset_posiiton(self):
        self.goto(0,0)
        self.bounce_x()
        self.move_speed=0.1

paddle.py

from turtle import Turtle

class Paddle(Turtle):

    def __init__(self,x,y):
        super().__init__()
                # 初始化球拍,这个不需要像贪吃蛇那样组合,因为不需要变形,所以直接一个大的海龟对象就好了
        self.shape("square")
        self.color("white")
        self.shapesize(stretch_wid=5,stretch_len=1)
        self.penup()
        self.goto(x, y)

    def up(self):
        #self.pad.setheading(90)
        new_y=self.ycor()+20
        # print("UP")
        self.goto(self.xcor(),new_y)

    def down(self):
        new_y = self.ycor() - 20
        self.goto(self.xcor(), new_y)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!