pygame代码大全_Python打砖块小游戏源代码

这次用Python实现的是一个接球打砖块的小游戏 ,最核心的就是:碰撞检测的数学模型
程序运行截图:

pygame代码大全_Python打砖块小游戏源代码

其实,编程问题到最后就是数学问题,这个游戏涉及到2D圆形与矩形的碰撞检测问题:

碰撞检测原理:通过找出矩形上离圆心最近的点,然后通过判断该点与圆心的距离是否小于圆的半径,若小于则为碰撞。

那如何找出矩形上离圆心最近的点呢?下面我们从 x 轴、y 轴两个方向分别进行寻找。为了方便描述,我们先约定以下变量:

(1)矩形上离圆心最近的点为变量:closestpoint = [x, y]
(2)矩形 rect = [x, y, l, w] 左上角与长宽 length,wide
(3)圆形 circle = [x, y, r] 圆心与半径

pygame代码大全_Python打砖块小游戏源代码

首先是 x 轴:
如果圆心在矩形的左侧(if circle_x < rect_x),那么 closestpoint_x = rect_x。
如果圆心在矩形的右侧(elif circle_x > rect_x + rect_l),那么 closestpoint_x = rect_x + rect_l。
如果圆心在矩形的正上下方(else),那么 closestpoint_x = circle_x。

同理,对于 y 轴:
如果圆心在矩形的上方(if circle_y < rect_y),那么 closestpoint_y = rect_y。
如果圆心在矩形的下方(elif circle_y > rect_y + rect_w)),那么 closestpoint_y = rect_y + rect_w。
圆形圆心在矩形的正左右两侧(else),那么 closestpoint_y = circle_y。

因此,通过上述方法即可找出矩形上离圆心最近的点了,然后通过”两点之间的距离公式”得出”最近点”与”圆心”的距离,最后将其与圆的半径相比,即可判断是否发生碰撞。
distance=math.sqrt(math.pow(closestpoint_x-circle_x,2)+math.pow(closestpoint_y-circle_y,2))

if distance < circle.r :
return True – 发生碰撞
else :
return False – 未发生碰撞

完整程序

&#x5BFC;&#x5165;&#x6A21;&#x5757;import pygamefrom pygame.locals import *import sys, random, time, mathclass GameWindow(object):    '''&#x521B;&#x5EFA;&#x6E38;&#x620F;&#x7A97;&#x53E3;&#x7C7B;'''    def __init__(self, *args, **kw):        self.window_length = 600        self.window_wide = 500        # &#x7ED8;&#x5236;&#x6E38;&#x620F;&#x7A97;&#x53E3;&#xFF0C;&#x8BBE;&#x7F6E;&#x7A97;&#x53E3;&#x5C3A;&#x5BF8;        self.game_window = pygame.display.set_mode((self.window_length, self.window_wide))        # &#x8BBE;&#x7F6E;&#x6E38;&#x620F;&#x7A97;&#x53E3;&#x6807;&#x9898;        pygame.display.set_caption("&#x6253;&#x7816;&#x5757;-Python&#x4EE3;&#x7801;&#x5927;&#x5168;")        # &#x5B9A;&#x4E49;&#x6E38;&#x620F;&#x7A97;&#x53E3;&#x80CC;&#x666F;&#x989C;&#x8272;&#x53C2;&#x6570;        self.window_color = (135, 206, 250)    def backgroud(self):        # &#x7ED8;&#x5236;&#x6E38;&#x620F;&#x7A97;&#x53E3;&#x80CC;&#x666F;&#x989C;&#x8272;        self.game_window.fill(self.window_color)class Ball(object):    '''&#x521B;&#x5EFA;&#x7403;&#x7C7B;'''    def __init__(self, *args, **kw):        # &#x8BBE;&#x7F6E;&#x7403;&#x7684;&#x534A;&#x5F84;&#x3001;&#x989C;&#x8272;&#x3001;&#x79FB;&#x52A8;&#x901F;&#x5EA6;&#x53C2;&#x6570;        self.ball_color = (255, 215, 0)        self.move_x = 1        self.move_y = 1        self.radius = 10    def ballready(self):        # &#x8BBE;&#x7F6E;&#x7403;&#x7684;&#x521D;&#x59CB;&#x4F4D;&#x7F6E;&#x3001;        self.ball_x = self.mouse_x        self.ball_y = self.window_wide - self.rect_wide - self.radius        # &#x7ED8;&#x5236;&#x7403;&#xFF0C;&#x8BBE;

Original: https://blog.csdn.net/weixin_32272937/article/details/113312281
Author: 耐撕儿
Title: pygame代码大全_Python打砖块小游戏源代码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/781415/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球