前面我们用 Turtle模块模拟了贪吃蛇的游戏,现在我们来模拟另外一个经典的小游戏 Pong Game。这个经典的乒乓球游戏在手机和文群星上面当年也是风靡一时的。现在看看怎么实现。
当然界面是比较丑一点,我是随便找了一个贴图当背景,主要看看功能怎么实现的。这个游戏很多地方设计和贪吃蛇相似,关键点搞定反弹角度的数学关系,其他都很容易。
分解一下基本功能:
1.设计2个拍子,可以上下控制移动
2.球会自己跑
3.球碰墙壁会反弹
4.球碰拍子会反弹
5.球出界算分
6.接球以后会加速
解决方案:
- 2个拍子就是2个海龟的对象,通过监听事件控制
- 球是另外一个海龟对象,设定x坐标和y坐标的初始值,每次goto移动一下就好了
- 球到了边界反弹,注意他的Y坐标其实还是按照初始的方向递增,X方向反过来了,因此我们修改一下x,y的递增方向就好了
- 球到了拍子反弹,这是X坐标不变化,Y坐标反过来
- 显示牌是一个新的海龟对象,每次更新里面的显示参数就是了
- 加速的效果其实是修改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)
来源:oschina
链接:https://my.oschina.net/u/4410124/blog/4733526