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编写web API的教程
Apr 30 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
在Python的Django框架中编写编译函数
Jul 20 Python
Python编程之变量赋值操作实例分析
Jul 24 Python
基于python中pygame模块的Linux下安装过程(详解)
Nov 09 Python
学习Python selenium自动化网页抓取器
Jan 20 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 Python
PyQt5中QSpinBox计数器的实现
Jan 18 Python
python re模块常见用法例举
Mar 01 Python
python学习之panda数据分析核心支持库
May 07 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 创建标签云函数代码
2010/05/26 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
Position属性之relative用法
2015/12/14 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
跟老齐学Python之集合(set)
2014/09/24 Python
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
什么是Remote Module
2016/06/10 面试题
办公室经理岗位职责
2014/01/01 职场文书
安全生产投入制度
2014/01/29 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
国防教育标语
2014/10/08 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
MySQL开启事务的方式
2021/06/26 MySQL
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android