python实现打砖块游戏


Posted in Python onFebruary 25, 2020

本文实例为大家分享了Python实现打砖块游戏的具体代码,供大家参考,具体内容如下

#导入模块
import pygame
from pygame.locals import *
import sys,random,time,math

class GameWindow(object):
 '''创建游戏窗口类'''
 def __init__(self,*args,**kw): 
 self.window_length = 600
 self.window_wide = 500
 #绘制游戏窗口,设置窗口尺寸
 self.game_window = pygame.display.set_mode((self.window_length,self.window_wide))
 #设置游戏窗口标题
 pygame.display.set_caption("CatchBallGame")
 #定义游戏窗口背景颜色参数
 self.window_color = (135,206,250)

 def backgroud(self):
 #绘制游戏窗口背景颜色
 self.game_window.fill(self.window_color)

class Ball(object):
 '''创建球类'''
 def __init__(self,*args,**kw):
 #设置球的半径、颜色、移动速度参数
 self.ball_color = (255,215,0) 
 self.move_x = 1
 self.move_y = 1
 self.radius = 10

 def ballready(self):
 #设置球的初始位置、
 self.ball_x = self.mouse_x
 self.ball_y = self.window_wide-self.rect_wide-self.radius
 #绘制球,设置反弹触发条件 
 pygame.draw.circle(self.game_window,self.ball_color,(self.ball_x,self.ball_y),self.radius)

 def ballmove(self):
 #绘制球,设置反弹触发条件 
 pygame.draw.circle(self.game_window,self.ball_color,(self.ball_x,self.ball_y),self.radius) 
 self.ball_x += self.move_x
 self.ball_y -= self.move_y
 #调用碰撞检测函数
 self.ball_window()
 self.ball_rect()
 #每接5次球球速增加一倍
 if self.distance < self.radius:
 self.frequency += 1
 if self.frequency == 5:
 self.frequency = 0
 self.move_x += self.move_x
 self.move_y += self.move_y
 self.point += self.point
 #设置游戏失败条件
 if self.ball_y > 520:
 self.gameover = self.over_font.render("Game Over",False,(0,0,0))
 self.game_window.blit(self.gameover,(100,130))
 self.over_sign = 1

class Rect(object):
 '''创建球拍类'''
 def __init__(self,*args,**kw):
 #设置球拍颜色参数
 self.rect_color = (255,0,0)
 self.rect_length = 100
 self.rect_wide = 10

 def rectmove(self):
 #获取鼠标位置参数
 self.mouse_x,self.mouse_y = pygame.mouse.get_pos()
 #绘制球拍,限定横向边界 
 if self.mouse_x >= self.window_length-self.rect_length//2:
 self.mouse_x = self.window_length-self.rect_length//2
 if self.mouse_x <= self.rect_length//2:
 self.mouse_x = self.rect_length//2
 pygame.draw.rect(self.game_window,self.rect_color,((self.mouse_x-self.rect_length//2),(self.window_wide-self.rect_wide),self.rect_length,self.rect_wide))

class Brick(object):
 def __init__(self,*args,**kw):
 #设置砖块颜色参数
 self.brick_color = (139,126,102)
 self.brick_list = [[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1],[1,1,1,1,1,1]]
 self.brick_length = 80
 self.brick_wide = 20

 def brickarrange(self): 
 for i in range(5):
 for j in range(6):
 self.brick_x = j*(self.brick_length+24)
 self.brick_y = i*(self.brick_wide+20)+40
 if self.brick_list[i][j] == 1:
 #绘制砖块
 pygame.draw.rect(self.game_window,self.brick_color,(self.brick_x,self.brick_y,self.brick_length,self.brick_wide)) 
 #调用碰撞检测函数
 self.ball_brick()  
 if self.distanceb < self.radius:
 self.brick_list[i][j] = 0
 self.score += self.point
 #设置游戏胜利条件
 if self.brick_list == [[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]]:
 self.win = self.win_font.render("You Win",False,(0,0,0))
 self.game_window.blit(self.win,(100,130))
 self.win_sign = 1

class Score(object):
 '''创建分数类'''
 def __init__(self,*args,**kw): 
 #设置初始分数
 self.score = 0
 #设置分数字体
 self.score_font = pygame.font.SysFont('arial',20)
 #设置初始加分点数
 self.point = 1
 #设置初始接球次数
 self.frequency = 0

 def countscore(self):
 #绘制玩家分数 
 my_score = self.score_font.render(str(self.score),False,(255,255,255))
 self.game_window.blit(my_score,(555,15))

class GameOver(object):
 '''创建游戏结束类'''
 def __init__(self,*args,**kw):
 #设置Game Over字体
 self.over_font = pygame.font.SysFont('arial',80)
 #定义GameOver标识
 self.over_sign = 0

class Win(object):
 '''创建游戏胜利类'''
 def __init__(self,*args,**kw):
 #设置You Win字体
 self.win_font = pygame.font.SysFont('arial',80)
 #定义Win标识
 self.win_sign = 0

class Collision(object):
 '''碰撞检测类'''
 #球与窗口边框的碰撞检测
 def ball_window(self):
 if self.ball_x <= self.radius or self.ball_x >= (self.window_length-self.radius):
 self.move_x = -self.move_x
 if self.ball_y <= self.radius:
 self.move_y = -self.move_y

 #球与球拍的碰撞检测
 def ball_rect(self):
 #定义碰撞标识
 self.collision_sign_x = 0
 self.collision_sign_y = 0

 if self.ball_x < (self.mouse_x-self.rect_length//2):
 self.closestpoint_x = self.mouse_x-self.rect_length//2
 self.collision_sign_x = 1
 elif self.ball_x > (self.mouse_x+self.rect_length//2):
 self.closestpoint_x = self.mouse_x+self.rect_length//2
 self.collision_sign_x = 2
 else:
 self.closestpoint_x = self.ball_x
 self.collision_sign_x = 3

 if self.ball_y < (self.window_wide-self.rect_wide):
 self.closestpoint_y = (self.window_wide-self.rect_wide)
 self.collision_sign_y = 1
 elif self.ball_y > self.window_wide:
 self.closestpoint_y = self.window_wide
 self.collision_sign_y = 2
 else:
 self.closestpoint_y = self.ball_y
 self.collision_sign_y = 3
 #定义球拍到圆心最近点与圆心的距离
 self.distance = math.sqrt(math.pow(self.closestpoint_x-self.ball_x,2)+math.pow(self.closestpoint_y-self.ball_y,2))
 #球在球拍上左、上中、上右3种情况的碰撞检测
 if self.distance < self.radius and self.collision_sign_y == 1 and (self.collision_sign_x == 1 or self.collision_sign_x == 2):
 if self.collision_sign_x == 1 and self.move_x > 0:
 self.move_x = - self.move_x
 self.move_y = - self.move_y
 if self.collision_sign_x == 1 and self.move_x < 0:
 self.move_y = - self.move_y
 if self.collision_sign_x == 2 and self.move_x < 0:
 self.move_x = - self.move_x
 self.move_y = - self.move_y
 if self.collision_sign_x == 2 and self.move_x > 0:
 self.move_y = - self.move_y
 if self.distance < self.radius and self.collision_sign_y == 1 and self.collision_sign_x == 3:
 self.move_y = - self.move_y
 #球在球拍左、右两侧中间的碰撞检测
 if self.distance < self.radius and self.collision_sign_y == 3:
 self.move_x = - self.move_x

 #球与砖块的碰撞检测
 def ball_brick(self):
 #定义碰撞标识
 self.collision_sign_bx = 0
 self.collision_sign_by = 0

 if self.ball_x < self.brick_x:
 self.closestpoint_bx = self.brick_x
 self.collision_sign_bx = 1
 elif self.ball_x > self.brick_x+self.brick_length:
 self.closestpoint_bx = self.brick_x+self.brick_length
 self.collision_sign_bx = 2
 else:
 self.closestpoint_bx = self.ball_x
 self.collision_sign_bx = 3

 if self.ball_y < self.brick_y:
 self.closestpoint_by = self.brick_y
 self.collision_sign_by = 1
 elif self.ball_y > self.brick_y+self.brick_wide:
 self.closestpoint_by = self.brick_y+self.brick_wide
 self.collision_sign_by = 2
 else:
 self.closestpoint_by = self.ball_y
 self.collision_sign_by = 3
 #定义砖块到圆心最近点与圆心的距离
 self.distanceb = math.sqrt(math.pow(self.closestpoint_bx-self.ball_x,2)+math.pow(self.closestpoint_by-self.ball_y,2))
 #球在砖块上左、上中、上右3种情况的碰撞检测
 if self.distanceb < self.radius and self.collision_sign_by == 1 and (self.collision_sign_bx == 1 or self.collision_sign_bx == 2):
 if self.collision_sign_bx == 1 and self.move_x > 0:
 self.move_x = - self.move_x
 self.move_y = - self.move_y
 if self.collision_sign_bx == 1 and self.move_x < 0:
 self.move_y = - self.move_y
 if self.collision_sign_bx == 2 and self.move_x < 0:
 self.move_x = - self.move_x
 self.move_y = - self.move_y
 if self.collision_sign_bx == 2 and self.move_x > 0:
 self.move_y = - self.move_y
 if self.distanceb < self.radius and self.collision_sign_by == 1 and self.collision_sign_bx == 3:
 self.move_y = - self.move_y
 #球在砖块下左、下中、下右3种情况的碰撞检测
 if self.distanceb < self.radius and self.collision_sign_by == 2 and (self.collision_sign_bx == 1 or self.collision_sign_bx == 2):
 if self.collision_sign_bx == 1 and self.move_x > 0:
 self.move_x = - self.move_x
 self.move_y = - self.move_y
 if self.collision_sign_bx == 1 and self.move_x < 0:
 self.move_y = - self.move_y
 if self.collision_sign_bx == 2 and self.move_x < 0:
 self.move_x = - self.move_x
 self.move_y = - self.move_y
 if self.collision_sign_bx == 2 and self.move_x > 0:
 self.move_y = - self.move_y
 if self.distanceb < self.radius and self.collision_sign_by == 2 and self.collision_sign_bx == 3:
 self.move_y = - self.move_y
 #球在砖块左、右两侧中间的碰撞检测
 if self.distanceb < self.radius and self.collision_sign_by == 3:
 self.move_x = - self.move_x

class Main(GameWindow,Rect,Ball,Brick,Collision,Score,Win,GameOver):
 '''创建主程序类'''
 def __init__(self,*args,**kw): 
 super(Main,self).__init__(*args,**kw)
 super(GameWindow,self).__init__(*args,**kw)
 super(Rect,self).__init__(*args,**kw)
 super(Ball,self).__init__(*args,**kw)
 super(Brick,self).__init__(*args,**kw)
 super(Collision,self).__init__(*args,**kw) 
 super(Score,self).__init__(*args,**kw)
 super(Win,self).__init__(*args,**kw)
 #定义游戏开始标识
 start_sign = 0

 while True: 
 self.backgroud()
 self.rectmove()
 self.countscore() 
 
 if self.over_sign == 1 or self.win_sign == 1:
 break
 #获取游戏窗口状态
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 sys.exit()
 if event.type == MOUSEBUTTONDOWN:
 pressed_array = pygame.mouse.get_pressed()
 if pressed_array[0]:
 start_sign = 1
 if start_sign == 0:
 self.ballready()
 else:
 self.ballmove()

 self.brickarrange()

 #更新游戏窗口
 pygame.display.update()
 #控制游戏窗口刷新频率
 time.sleep(0.010)

if __name__ == '__main__':
 pygame.init()
 pygame.font.init()
 catchball = Main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中用Descriptor实现类级属性(Property)详解
Sep 18 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
python函数局部变量用法实例分析
Aug 04 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
Python 中的Selenium异常处理实例代码
May 03 Python
详解python中docx库的安装过程
Nov 08 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
python实现简单学生信息管理系统
Apr 09 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 Python
Python实现企业微信机器人每天定时发消息实例
Feb 25 #Python
Django 设置多环境配置文件载入问题
Feb 25 #Python
python中resample函数实现重采样和降采样代码
Feb 25 #Python
python实现的分层随机抽样案例
Feb 25 #Python
Python可变对象与不可变对象原理解析
Feb 25 #Python
Python 使用 environs 库定义环境变量的方法
Feb 25 #Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 #Python
You might like
php的计数器程序
2006/10/09 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
常用PHP封装分页工具类
2017/01/14 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
javascript 文档的编码问题解决
2009/03/01 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
js+css实现打字效果
2020/06/24 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
django利用request id便于定位及给日志加上request_id
2018/08/26 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
python生成requirements.txt的两种方法
2019/09/18 Python
Python使用贪婪算法解决问题
2019/10/22 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
国际知名设计师时装商店:Coggles
2016/09/05 全球购物
旅游管理毕业生自荐书
2014/02/02 职场文书
建设工地安全标语
2014/06/07 职场文书
拔河比赛口号
2014/06/10 职场文书
干部作风建设心得体会
2014/10/22 职场文书
放弃遗产继承公证书
2015/01/26 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
整理Python中常用的conda命令操作
2021/06/15 Python