基于pygame的打砖块游戏,做到一半,不带做了
跟着一个博主做的,前面的变量的定义全是内个哥们的,没带任何改动,就做了个界面,背景音乐,绘制了个小球,绘制了挡板
小球可以撞到边界反弹,然后做了砖块,定义了一个存放砖块的列表,,,就没有下文了
原博主链接 Python+pyGame 打砖块游戏 - Python知识库 http://lib.csdn.net/article/python/1817
import pygame,sys,time
from pygame.locals import *
import random #游戏界面
WINDOWWIDTH=640
WINDOWHEIGHT=480 # 一些关于窗口的常量定义
WINDOW_WIDTH = 640
WINDOW_HEIGHT = 480 # 游戏状态常量定义
GAME_STATE_INIT = 0
GAME_STATE_START_LEVEL = 1
GAME_STATE_RUN = 2
GAME_STATE_GAMEOVER = 3
GAME_STATE_SHUTDOWN = 4
GAME_STATE_EXIT = 5 # 小球的常量定义
BALL_START_Y = (WINDOW_HEIGHT // 2)
BALL_SIZE = 4 # 挡板的常量定义
PADDLE_START_X = (WINDOW_WIDTH / 2 - 16)
PADDLE_START_Y = (WINDOW_HEIGHT - 32);
PADDLE_WIDTH = 32
PADDLE_HEIGHT = 8 # 砖块的常量定义
NUM_BLOCK_ROWS = 6
NUM_BLOCK_COLUMNS = 8
BLOCK_WIDTH = 64
BLOCK_HEIGHT = 16
BLOCK_ORIGIN_X = 8
BLOCK_ORIGIN_Y = 8
BLOCK_X_GAP = 80
BLOCK_Y_GAP = 32 # 一些颜色常量定义
BACKGROUND_COLOR = (0, 0, 0)
BALL_COLOR = (0, 0, 255)
PADDLE_COLOR = (128, 64, 64)
BLOCK_COLOR = (255, 128, 0)
TEXT_COLOR = (255, 255, 255) # 游戏的一些属性信息
TOTAL_LIFE = 5
FPS = 25 # # 初始化砖块数组
# def InitBlocks():
# # blocks = [[1] * NUM_BLOCK_COLUMNS] * NUM_BLOCK_ROWS
# blocks = []
# for i in range(NUM_BLOCK_ROWS): # @UnusedVarialbe
# blocks.append([i + 1] * NUM_BLOCK_COLUMNS)
# return blocks
# 初始化砖块数组
def InitBlocks():
blocks = [[1] * NUM_BLOCK_COLUMNS] * NUM_BLOCK_ROWS
return blocks # 检测小球是否与挡板或者砖块碰撞
def ProcessBall(blocks, ball_x, ball_y, paddle):
if (ball_y > WINDOW_HEIGHT // 2):
if (ball_x + BALL_SIZE >= paddle['rect'].left and \
ball_x - BALL_SIZE <= paddle['rect'].left + PADDLE_WIDTH and \
ball_y + BALL_SIZE >= paddle['rect'].top and \
ball_y - BALL_SIZE <= paddle['rect'].top + PADDLE_HEIGHT):
return None # 显示文字
def DrawText(text, font, surface, x, y):
text_obj = font.render(text, 1, TEXT_COLOR)
text_rect = text_obj.get_rect()
text_rect.topleft = (x, y)
surface.blit(text_obj, text_rect) # 退出游戏
def Terminate():
pygame.quit()
sys.exit() # 等待用户输入
def WaitForPlayerToPressKey():
while True:
for event in pygame.event.get():
if event.type == QUIT:
Terminate()
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
Terminate()
return # 游戏界面的初始化
pygame.init()
mainClock = pygame.time.Clock() # 小球的位置和速度
ball_x = 0
ball_y = 0
ball_dx = 0
ball_dy = 0 # 挡板的运动控制
paddle_move_left = False
paddle_move_right = False # 挡板的位置和颜色
paddle = {'rect': pygame.Rect(0, 0, PADDLE_WIDTH, PADDLE_HEIGHT),
'color': PADDLE_COLOR} # 游戏状态
game_state = GAME_STATE_INIT
blocks = []
life_left = TOTAL_LIFE
game_over = False
blocks_hit = 0
score = 0
level = 1 game_start_font = pygame.font.SysFont(None, 48)
game_over_font = pygame.font.SysFont(None, 48)
text_font = pygame.font.SysFont(None, 20) game_over_sound = pygame.mixer.Sound('game_over.wav')
game_hit_sound = pygame.mixer.Sound('get_point.wav')
pygame.mixer.music.load('bg_music.mp3') windowSurface = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT), 0, 32)
pygame.display.set_caption('打砖块') DrawText('pyFreakOut', game_start_font, windowSurface,
(WINDOW_WIDTH / 3), (WINDOW_HEIGHT / 3 + 50))
DrawText('Press any key to start.', game_start_font, windowSurface,
(WINDOW_WIDTH / 3) - 60, (WINDOW_HEIGHT) / 3 + 100)
pygame.display.update()
WaitForPlayerToPressKey() # 播放背景音乐
pygame.mixer.music.play(-1, 0.0) #游戏主循环
while True:
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
exit()
if event.type == KEYDOWN:
if event.key == K_LEFT:
paddle_move_left = True
if event.key == K_RIGHT:
paddle_move_right = True
if event.type == KEYUP:
if event.key == K_LEFT:
paddle_move_left = False
if event.key == K_RIGHT:
paddle_move_right = False if game_state==GAME_STATE_INIT:
ball_x=random.randint(8,WINDOW_WIDTH-8)
ball_y=BALL_START_Y
ball_dx=random.randint(-4,4)
ball_dy=random.randint(6,8) paddle['rect'].left = PADDLE_START_X
paddle['rect'].top = PADDLE_START_Y paddle_move_left = False
paddle_move_right = False game_state=GAME_STATE_START_LEVEL
elif game_state==GAME_STATE_START_LEVEL:
#新的一关
blocks = InitBlocks()
game_state=GAME_STATE_RUN
elif game_state==GAME_STATE_RUN:
ball_x += ball_dx
ball_y += ball_dy if ball_x > (WINDOW_WIDTH - BALL_SIZE) or ball_x < BALL_SIZE:
ball_dx = -ball_dx
ball_x += ball_dx;
elif ball_y > (WINDOW_HEIGHT - BALL_SIZE) or ball_y < BALL_SIZE:
ball_dy = -ball_dy
ball_y += ball_dy # 挡板的运动
if paddle_move_left:
paddle['rect'].left -= 8
if paddle['rect'].left < 0:
paddle['rect'].left = 0
if paddle_move_right:
paddle['rect'].left += 8
if paddle['rect'].left > WINDOW_WIDTH - PADDLE_WIDTH:
paddle['rect'].left = WINDOW_WIDTH - PADDLE_WIDTH
#绘制过程
windowSurface.fill(BACKGROUND_COLOR)
#绘制挡板
pygame.draw.rect(windowSurface, paddle['color'], paddle['rect'])
#绘制小球
pygame.draw.circle(windowSurface, BALL_COLOR, (ball_x, ball_y), BALL_SIZE, 0)
#绘制砖块
cur_x = BLOCK_ORIGIN_X
cur_y = BLOCK_ORIGIN_Y
for row in range(NUM_BLOCK_ROWS):
cur_x = BLOCK_ORIGIN_X
for col in range(NUM_BLOCK_COLUMNS):
#print(blocks[row][col])
if (blocks[row][col] == 1):
pygame.draw.rect(windowSurface, BLOCK_COLOR,
(cur_x, cur_y, BLOCK_WIDTH, BLOCK_HEIGHT))
cur_x += BLOCK_X_GAP
cur_y += BLOCK_Y_GAP elif game_state == GAME_STATE_SHUTDOWN:
game_state = GAME_STATE_EXIT pygame.display.update()
mainClock.tick(30)
基于pygame的打砖块游戏,做到一半,不带做了的更多相关文章
- 三维CAD塑造——基于所述基本数据结构一半欧拉操作模型
		
三维CAD塑造--基于所述基本数据结构一半欧拉操作模型(elar, B_REP) (欧拉操作 三维CAD建模课程 三维CAD塑造 高曙明老师 渲染框架 brep 带洞 带柄 B_REP brep ...
 - [年薪60W分水岭]基于Netty手写Apache Dubbo(带注册中心和注解)
		
阅读这篇文章之前,建议先阅读和这篇文章关联的内容. 1. 详细剖析分布式微服务架构下网络通信的底层实现原理(图解) 2. (年薪60W的技巧)工作了5年,你真的理解Netty以及为什么要用吗?(深度干 ...
 - 基于jQuery上下切换的焦点图—带缩略图悬浮
		
分享一款基于jQuery上下切换的焦点图,这款焦点图带有缩略图悬浮,它的切换效果比较简单,仅仅是作图片的上下切换,但是效果还是比较流畅的.这款jQuery焦点图插件的另外一个特点是在播放器上面可以悬浮 ...
 - C++基于模板顺序表的实现(带排序)
		
说明:代码是可以运行的,但是发表在博客上后复制到编译器里面报N多错误,找了半天原因是网页里面生成了一些空白字符,这些字符编译器无法识别. 因此使用了2种插入格式插入代码. 第二个带注释解释的代码不可复 ...
 - 基于pygame实现飞机大战【面向过程】
		
一.简介 pygame 顶级pygame包 pygame.init - 初始化所有导入的pygame模块 pygame.quit - uninitialize所有pygame模块 pygame.err ...
 - 基于pygame的一个小游戏
		
class GameStats(): """跟踪游戏的统计信息""" #def __int__(self, ai_settings): de ...
 - 基于Pygame写的翻译方法
		
发布时间:2018-11-01 技术:pygame+easygui 概述 实现一个翻译功能,中英文的互相转换.并可以播放翻译后的内容. 翻译接口调用的是百度翻译的api接口. 详细 代码下载: ...
 - 基于 Socket 的群聊聊天室(带图形界面,包含注册、登录、数据入库功能)
		
代码下载 https://github.com/juno3550/GroupChatRoom 实现框架 Chat 包: server.py:服务器端执行代码(TCP 服务器,根据客户端消息调用 mod ...
 - 基于pygame框架的打飞机小游戏
		
import pygame from pygame.locals import * import time import random class Base(object): "" ...
 
随机推荐
- Vbox安装CentOS7及网络配置
			
安装CentOS7及网络配置 Vbox和其他虚拟机一样,安装完成一个虚拟机,需要配置网络才能实现物理主机和虚拟机之间的访问.虚拟主机和Internet(外网)的访问 1.设置Vbox全局网络 单击主界 ...
 - Android DiskLruCache完全解析,硬盘缓存的最佳方案  --转载
			
概述 记得在很早之前,我有写过一篇文章 Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache ...
 - SVNKit学习——svn二次开发背景和闲谈(一)
			
开发背景: 简述现有流程:代码的合并.提交是以任务为最小单元的.例如A和B两个同学开发不同的任务,那就是两个任务号.合并的时候可能会先合并A的代码,在合并B的代码. 需求:SVN合并程序开发——一款能 ...
 - Java—IO流 File类的常用API
			
File类 1.只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. package cn.test; import java.io.File; import java.io.IOE ...
 - asyncio标准库6 Threads & Subprocess
			
Threads import asyncio def compute_pi(digits): # implementation return 3.14 async def main(loop): di ...
 - 关于java文件名字影响系统配置
			
测试OAM和OIF单点登录过程中,wlsh.sh中一个命令运行不过.查看一个java文件中有_en标示.修改名称,去掉_en后可以通过.
 - May 13th 2017 Week 19th Saturday
			
Mountains look beautiful from a distance. 远处看山山更美. This gnomic seems to circulate very long, its mor ...
 - Kubernetes Helm入门指南
			
什么是Helm?这可不是暗黑破坏神里装备的名称:头盔,而是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.我们Helm和Kubernetes的关系,我们可以理解成y ...
 - IDEA tomcat热部署方法及乱码问题解决
			
在项目开发过程中,我们一般希望在修改完代码之后不重启项目即可提现出修改的结果,那么热部署项目就显得十分必要了.在idea中将项目热部署至tomcat中的方法如下: 首先打开tomcat配置界面,在se ...
 - 【洛谷P1169】[ZJOI2007]棋盘制作
			
棋盘制作 题目链接 这个题是[USACO5.3]巨大的牛棚Big Barn和玉蟾宫的结合 一道顶两道毒瘤! 题解: 首先,棋盘有两种选法: 1.任意白格(x,y) (x+y)%2=0 ,任意黑格(x, ...