用Python写个弹球的游戏

原创: xinxin 菜鸟学Python
我们前面讲了几篇关于类的知识点,为了让大家更好的掌握类的概念,并灵活的运用这些知识,我写了一个有趣又好玩的弹球的游戏,一来可以把类的知识融会一下,二来加深对Python的兴趣.你会发现哎呀Python写小游戏还是蛮方便的,蛮有意思的~~

先看一下我们的最终效果图
在这里插入图片描述
我们分9步来讲解如何写这个小游戏

  1. 创建游戏的主界面
    我们用Python的内置模块Tkinter来完成了,它是Python的标准GUI工具包,可以非常方便在制作GUI小工具,因为是跨平台的,可以方便的在win和linux下运行,我们用Tk里的canvas绘图功能来制作一个小游戏.先来把主界面画出来
    在这里插入图片描述
    1).创建一个tk的实例
    2).然后给这个窗口取一个名字叫game
    3).通知窗口管理器调整布局大小,0,0表示不能被拉升
    4).创建一个长为400*500的界面,背景色为默认,边框为厚度为0
    5).通知窗口管理器注册组件
    6).刷新一下界面

  2. 创建一个Ball球的类
    好主界面有了,我们就开始创建球
    1)首先我们创建一个Ball的类,这个类的初始化参数有两个:
    一个canvas也就是画图用来画一个球,一个是color,表示球的颜色
    2)在类的初始化的函数里面
     初始化canvas,
     画一个实心的球并记录下它的id
     创建球的默认在主界面上的位置,我们把它放屏幕中间
    然后让球出现在主界面上:
    在这里插入图片描述
    在这里插入图片描述

  3. 我们让球向上动起来
    刚才在Ball类里面有一个draw函数,我们现在在draw里面加点东西,让球向上运动

  4. 让球能回弹
    1).第三步我们球能向上运动,现在我们要让它能碰到墙壁反弹
     我们刚才是把self.canvas.move(self.id,0,-1)写死0,-1,表示x坐标不动,y坐标不断的-1也就是球在向上运动
     现在我们把这两个值设成两个变量self.x,self.y,当我们的球运动到上边界的时候,就把self.y加1,也就向下运行,
     当运动到下边界的时候,就把self.y减1,表示向上运行
    在这里插入图片描述
    2).那么如何判断球已经碰壁了,很简单,我们动态的去球的坐标[x1,y1,x2,y2],
     x1,y1 表示top-left 左上角的坐标
     x2,y2 表示bottom-right右下角的坐标
    获取了球的坐标之后(它是一个list),判断一下pos[1]和pos[3]就可以了
    在这里插入图片描述

  5. 增加球的运行方向
    现在我们的球的运动方向是固定的,我们希望每次球的运动方向要随机,不然太low了,怎么做呢,很简单增加一个随机函数就可以了
    在__init__()函数里面,我们改一下

    self.x = 0
    self.y = -1

变成:

starts=[-3,-2,-1,1,1,2,3]
random.shuffle(starts)
self.x=starts[0]#从list里面随机取一个
self.y=-3#-3表示y轴运动的速度

6.增加小木板
现在我们的球已经可以在界面上到处乱窜了,我们现在增加一个木板来打弹球
在这里插入图片描述
在这里插入图片描述

7.让木板可以移动
我们通过绑定一些键盘事件,让木板可以移动
增加2个函数,左移和右移,有同学会问evt是啥,不急下面会说.

def turn_left(self, evt):
	self.x = -2
def turn_right(self, evt):
	self.x = 2

在Paddle的初始化函数里面绑定两个键盘事件:
 就是按键盘左键就是响应self.turn_left
 就是按键盘右键就是响应self.turn_right
 evt是向系统注册的事件
在这里插入图片描述

8.增加球和木板的碰撞
现在球也有了,木板也有了,而且可以左右挪动,现在最精彩的部分要上演了,就是增加球碰到木板之后反弹,那么如何判断球碰到木板了,简单我们只要在球的类里面增加一个函数来判断是否碰撞了

def draw(self):
	--snip--
	if self.hit_paddle(pos) == True:
		self.y = -3
	--snip--

在这里插入图片描述

9.判断当球运动到底部游戏结束
经过上面8步,游戏大体功能已经有了,那么如何判断游戏结束呢,我们设定只要球运动底部的时候(可以认为是球碰到了地面),游戏就失败了,加几行代码就搞定了.

class Ball():
    def __init__(self,canvas,paddle,color):
        --snip--
        self.hit_bottom=False
    def draw(self):
        --snip--
        if pos[3]>=self.canvas_height:#判断当球的下沿大于等于主界面的高度
            self.hit_bottom=True
        --snip--

paddle=Paddle(canvas,"blue")
ball=Ball(canvas,paddle,"red")
while 1:
    if ball.hit_bottom==False and ball.paddle.started :
        ball.draw()
        paddle.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)

在这里插入图片描述

源码大概100行实现了简单的功能,其实这个游戏还可以增加很多功能,比如记录分数,增加游戏开始和结束的提示,增加木板和球的种类,增加管卡和难度等等大家可以自己发挥一下, 写完很有成就感~~
需要源码的同学请输入:弹球源码

这个代码还有不少问题,我后续会更新

以下是用Python实现弹球小游戏的代码和说明: ```python # 引入必要的库 import pygame import random # 初始化pygame pygame.init() # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) BLUE = (50, 153, 213) GREEN = (0, 255, 0) RED = (255, 0, 0) # 设置屏幕大小 SCREEN_WIDTH = 700 SCREEN_HEIGHT = 500 screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) # 设置游戏标题 pygame.display.set_caption("弹球小游戏") # 定义球的类 class Ball: def __init__(self, x, y, radius, color): self.x = x self.y = y self.radius = radius self.color = color self.speed_x = random.randint(3, 6) self.speed_y = random.randint(3, 6) def draw(self): pygame.draw.circle(screen, self.color, [self.x, self.y], self.radius) def move(self): self.x += self.speed_x self.y += self.speed_y # 碰到左右边界反弹 if self.x < self.radius or self.x > SCREEN_WIDTH - self.radius: self.speed_x = -self.speed_x # 碰到上边界反弹 if self.y < self.radius: self.speed_y = -self.speed_y # 碰到下边界游戏结束 if self.y > SCREEN_HEIGHT - self.radius: return True return False # 定义挡板的类 class Paddle: def __init__(self, x, y, width, height, color): self.x = x self.y = y self.width = width self.height = height self.color = color self.speed = 0 def draw(self): pygame.draw.rect(screen, self.color, [self.x, self.y, self.width, self.height]) def move(self): self.x += self.speed # 碰到左右边界停止移动 if self.x < 0: self.x = 0 elif self.x > SCREEN_WIDTH - self.width: self.x = SCREEN_WIDTH - self.width # 创建球和挡板对象 ball = Ball(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2, 10, WHITE) paddle = Paddle(SCREEN_WIDTH // 2 - 50, SCREEN_HEIGHT - 20, 100, 10, GREEN) # 设置游戏时钟 clock = pygame.time.Clock() # 游戏循环 done = False while not done: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: done = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: paddle.speed = -5 elif event.key == pygame.K_RIGHT: paddle.speed = 5 elif event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: paddle.speed = 0 # 清屏 screen.fill(BLACK) # 移动球和挡板 if ball.move(): done = True paddle.move() # 绘制球和挡板 ball.draw() paddle.draw() # 碰撞检测 if ball.y + ball.radius >= paddle.y and ball.x >= paddle.x and ball.x <= paddle.x + paddle.width: ball.speed_y = -ball.speed_y # 更新屏幕 pygame.display.flip() # 设置游戏帧率 clock.tick(60) # 退出游戏 pygame.quit() ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值