2048 总结
pygame模块
pygame是一个设计用来开发游戏的python模块
01游戏的初始化和退出
●要使用pygame提供的功能需要先调用init方法
● 游戏结束前调用一下quit方法
方法 说明
pygame.init() 导入并初始化所有pygame模块,使用其他模块之前,必须先调用init方法
pygame.quit() 卸载所有pygame模块,在游戏结束之前调用
理解游戏中的坐标系
● 坐标系
。原点在左上角(0,0)
。x轴水平向右,逐渐增加
。y轴垂直向下,逐渐增加
● 在游戏中,所有课件的元素都是以矩形来描述位置的
●要描述一个矩形有四要素(x,y) (width,height)
pygame专门提供了一个类pygame.Rect用于描述矩形区域
rect(x, y, width, height)
提示
●pygame.Rect 是一个比较特殊的类,内部只是封装了一些数字计算
●不执行pygane, init()方法同样能够直接使用
创建游戏主窗口
●Pygane 专门提供了一个模块pygane,display 用于创建、管理游戏窗口
| 方法 | 说明 |
| pygame.display.set .mode() | 初始化游戏显示窗口 |
| pygame,display,update() | 刷新屏幕内容显示,稍后使用|
set. snode方法
set _ node(resolution=(0,0),flags=0,depth=0) –> SurfaceI
●作用一创建游戏显示窗口
●参数
- resolution指定屏幕的宽和高,默认创建的窗口大小和屏幕大小一致
- flags参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
- depth 参数表示颜色的位数,默认自动匹配
●返回值
暂时可以理解为游戏的屏幕,游戏的元素都需要被绘制到游戏的屏幕上
注意必须使用变量记录set. node方法的返回结果!因为:后续所有的图像绘制都基于这个返回结果
#创建游戏主窗口
screen = pygane,display.set mode((40 700))
####简单的游戏循环
●为了做到游戏程序启动后,不会立即退出,通常会在游戏程序中增加个游戏循环
●所请游戏循环就是一个无限循环
●在创建游戏窗口代码下方增加一个无限循环
。注意游戏窗口不需要重复创建
#创建游戏主窗口
screen = pygane,display.set mode((48 700))
#游戏循环
while True:
pass
02.理解图像并实现图像绘制
●在游戏中,能看到的游戏元素大多都是图像
●图像文件初始是保存在磁盘上的, 如果需要使用,第一歩就需要被加载到内存
●要在屏幕上看到某- -个圏像的内容,需要按照三个歩骤:
1.使用pygame. image. load( ) 加载图像的数据
2.使用游戏屏幕対象,凋用blit方法將圏像绘制到指定位置
3.调用pygane.display. update( ) 方法更新整个屏幕的显示
pygame . image ==> pygame. Surface
load(file _ path) blit(图像,位置) ==>pygame.display.updatel)
提示:要想在屏幕上看到绘制的结果,就一定要凋用pygame.display.updatel方法
透明图像
● png格式的图像是支持透明的
●在绘制图像时,透明区域不会显示任何内容
●但是如果下方已经有内容,会透过透明区域显示出来
理解update()方法的作用
可以在screen 对象完成所有blit方法之后,统调用一次display.update方法,同样可以在屏幕上看到最终的绘制结果
●使用display.set _ mode() 创建的screen 对象是个内存中的屏幕数据对象
。可以理解成是油画的画布
●screen.blit 方法可以在画布上绘制很多图像
。这些图像有可能会彼此重叠或者覆盖
●display.update() 会将画布的最终结果绘制在屏幕上,这样可以提高屏幕绘制效率,增加游戏的流畅度
###03 游戏循环
游戏循坏的作用
1.保证游戏不会直接退出
2.变化图像位置—动画效果
·调用pygame.display.update更新屏幕显示
3.检测用户交互–按键、鼠标等.
简单的动画实现
需求
1.在游戏初始化定义一个pygame.Rect 的变量记录初始位置
Pygame 通过 Rect 对象存储和操作矩形区域。一个 Rect 对象可以由 left,top,width,height 几个值创建。Rect 也可以是由 Pygame 的对象所创建,它们拥有一个属性叫“rect”。任何需要一个 Rect 对象作为参数的 Pygame 函数都可以使用以上值构造一个 Rect。这样使得作为参数传递的同时创建 Rect 成为可能。
Rect 对象中的大部分方法在修改矩形的位置、尺寸后会返回一个新的 Rect 拷贝,原始的 Rect 对象不会有任何改变。但有些方法比较特殊,它们会“原地”修改 Rect 对象(也就是说它们会改动原始的 Rect 对象)。
常用的Rect参数有这个形式:pygame.Rect(left, top, width, height)
left,top,width,height对应的具体表示如下图,
其中粉色为图片尺寸,纵横坐标值分别表示像素值,对于要显示的图像是图片中的空白区域。
提示:
●每一次调用update()方法之前,需要把所有的游戏图像都重新绘制一遍
●而且应该最先重新绘制背景图像
事件event
●就是游戏启动后,用户针对游戏所做的操作
●例如:点击关闭按钮,点击鼠标,按下键盘…
监听
●在游戏循环中判断用户具体的操作
只有捕获到用户具体的操作,才能有针对性的做出响应
代码实现
●pygane 中通过pyame.event.get() 可以获得用户当前所做动作的事件列表
。用户可以同一时间做很多事情
提示:这段代码非常的固定,几乎所有的pygane 游戏都适用!
# 捕获事件
event_list = pygame.event.get()
if len(event_list) > 0:
print(event_list)
while True:
# 监听事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
print("游戏退出")
# quit卸载所有模块
pygame.quit()
# exit()终结程序
exit()
字体渲染
- font.render(显示内容,是否开启抗锯齿,就是说True的话字体会比较平滑, 字体颜色, 字体颜色背景)
- blit()函数pygame里没有pygame.display.set_ mode.blit()这个函数,blit()是Surface类下的方法,可以理解为就是把一个图案印章一样的印在surface上。这个pygame.display.set_ mode是用来初始化显示界面的,虽然他确实也返回一个surface, 但并不能在后面加blit使用,一般是先创建Surface,然后才blit()
举个例子:
screen = pygame.display.set_ mode((640,480))
screen.blit(my_surface)
random模块
可以生成随机整数(randint)、随机小数(uniform)、在递增数列中随机选数(randrange)、在序列中选取随机元素(choice)、随机取序列的子集(sample)等。
1.random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0
2.random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
3.rang(a)按序列生成0~a,不包括a
难点:在2048游戏中主要难点在于处理列表,不能直接处理列,得由列变为行再进行处理。考验了for循环的熟练使用,使用for循环进行遍历列表查找相邻且相同的数并进行叠加。
zip()函数:当然也可使用zip()函数进行处理,zip():用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回这些元组组成到列表中
如:
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
d = []
for i in zip(a, b, c):
d.append(list(i))
print(d)
输出为:[[1,4,7],[2,5,8],[3,6,9]]



