文档章节

《Python游戏趣味编程》 第11章 消灭星星 - 知乎

o
 osc_pb77a5sc
发布于 06/23 16:20
字数 1307
阅读 29
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

图书简介可以看这里:

童晶:《Python游戏趣味编程》新书上架了zhuanlan.zhihu.com图标

消灭星星是一款非常容易上瘾的消除类游戏,只需点击一个方块,如果和其连接的有两个或两个以上颜色相同的方块即可消除,游戏得分即为消除的方块数,如图11-1所示。首先利用二维数组存储所有小方块的信息并显示;然后实现鼠标点击小方块、连通方块序号的获取;接着实现方块消除及位置更新、得分的计算与显示。

本章案例最终代码一共98行,代码参看:配套资源\第11章\11-8.py,视频效果参看:配套资源\第11章\消灭星星.mp4。

知乎视频www.zhihu.com图标
import pgzrun  # 导入游戏库
import random  # 导入随机库
import copy  # 导入复制库

TILE_SIZE = 50  # 小方块的大小,50*50
WIDTH = 10*TILE_SIZE  # 设置窗口的宽度 500
HEIGHT = 11*TILE_SIZE  # 设置窗口的高度 500
score = 0 # 得分

stars = []  # 二维数组,开始为空列表,用于储存小方块编号
for i in range(10):  # 对行遍历
    row = []  # 存储一行的数据,开始为空列表
    for j in range(10):  # 对列遍历
        x = random.randint(1, 5) # 取1-5之间的随机数
        row.append(x)  # 把数据添加到行列表row中
    stars.append(row)  # 再把行列表row添加到二维数组stars中

Tiles = []  # 二维数组,开始为空列表,存放所有小方块图片信息
def updateTiles():  # 根据stars更新Tiles二维数组
    for i in range(10):
        for j in range(10):
            tile = Actor('star'+str(stars[i][j]))#小方块图片初始化
            tile.left = j * TILE_SIZE  # 小方块图片最左边的x坐标
            tile.top = i * TILE_SIZE  # 小方块图片最顶部的y坐标
            Tiles.append(tile)  # 将当前小方块加入到列表中
updateTiles()  # 根据stars更新Tiles二维数组

def draw():   # 绘制模块,每帧重复执行
    screen.clear()  # 每帧清除屏幕,便于重新绘制
    for tile in Tiles:
        tile.draw()  # 绘制所有小方块
    screen.draw.text("消除方块:"+str(score), (180, 510), fontsize=25, fontname='fangz', color='red')

def on_mouse_down(pos, button): # 当鼠标按键时执行
    global score
    iClicked = int(pos[1]/TILE_SIZE) #点击方块在二维数组中的行序号
jClicked = int(pos[0]/TILE_SIZE) #点击方块在二维数组中的列序号
# 创建集合,存储选中方块及其连通的点序号
    connectedSet = {(iClicked, jClicked)}  
    for k in range(20):  # 重复找多次,就可以把所有连通区域都找到了
        tempSet = copy.deepcopy(connectedSet) # 复制一份临时集合
        for each in tempSet: # 对集合中所有小方块处理
            i = each[0]  # 小方块对应的行序号
            j = each[1]  # 小方块对应的列序号
            #  找到上下左右四个方块,把颜色一致的添加到集合中
            #  注意数组下标不要越界
            colorId = stars[i][j]
            if i > 0 and stars[i-1][j] == colorId:
                connectedSet.add((i-1, j))
            if i < 9 and stars[i+1][j] == colorId:
                connectedSet.add((i+1, j))
            if j > 0 and stars[i][j-1] == colorId:
                connectedSet.add((i, j-1))
            if j < 9 and stars[i][j+1] == colorId:
                connectedSet.add((i, j+1))
        tempSet.clear() # 临时集合清空

    if len(connectedSet) >= 2:  # 连通方块个数最少两个,才消除        
        for each in connectedSet:  # 集合中的所有方块遍历
            if stars[each[0]][each[1]] != 0:
# 标记为0,对应黑色小方块图片
                stars[each[0]][each[1]] = 0  
                score = score + 1  # 得分等于消去的方块数目

# 从下往上遍历,下面一个是0的话,上面的小色块就往下落
# 最顶上的空出来,变成黑色
    for j in range(10):
        templist = []  # 存储第j列的所有元素的列表
        for i in range(10):
            templist.append(stars[i][j])
        count = 0  # 记录列表中值为0的元素个数
        # 去除列表中的0元素
        while 0 in templist:
            templist.remove(0)
            count += 1
        # 把对应0元素移动到列表起始位置
        for i in range(count):
            templist.insert(0, 0)
        # 再赋值给原始的二维数组
        for i in range(10):
            stars[i][j] = templist[i]

    # 如果某一列都消除了,则右边列的方块向左移
    zeroColId = -1
    for j in range(10):
        templist = []  # 存储第j列的所有元素的列表
        for i in range(10):
            templist.append(stars[i][j])
        if sum(templist) == 0:
            zeroColId = j  # 这一列都为0了
            break
    if zeroColId != -1:  # 表示这一列元素都为0了
        for j in range(zeroColId, 9, 1):  # 所有右边的列向左移动
            for i in range(10):
                stars[i][j] = stars[i][j+1]
        for i in range(10):  # 最右边的一列都是0
            stars[i][9] = 0

    updateTiles()  # 根据stars更新Tiles二维数组

pgzrun.go()  # 开始执行游戏


分步骤代码、图片音效素材、讲解视频可以从异步社区下载:

https://www.epubit.com/bookDetails?id=UB72096d97d6149www.epubit.com


这一章主要实现了消灭星星游戏,学习了二维数组、元组、集合、while循环语句等知识点。读者可以尝试在本章代码基础上继续改进:

1、实现游戏结束的判断(也就是剩下的方块何时不能继续消除);

2、实现某一步操作的撤销功能(类似于下棋游戏中的悔棋功能)。

读者也可以参考本章的开发思路,尝试设计并分步骤实现五子棋、泡泡堂、消消乐等小游戏。

o
粉丝 2
博文 57
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
5.9K
18
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
在多个浏览器上运行脚本--Queen

假设你想和朋友们玩这么个游戏:你写下某个数字,然后让朋友们猜你写的是什么数字。你的朋友们将不断的给你一些猜测的数字,直到猜中为止。 现在想象你的朋友都是使用的浏览器,这个游戏就相...

匿名
2013/01/24
4.5K
1
跨平台 3D 游戏引擎--Castle Game Engine

Castle Game Engine 是一个用 Object Pascal 开发的跨平台 3D 游戏引擎。包含一个灵活的 3D 对象系统与开箱即用的水平,项目,智能生物等等。使用 X3D、VRML、Collada 和其他格式实现渲染和处理...

匿名
2013/02/05
2K
0
跨平台手机应用开发--Gideros

Gideros 可以让你轻松快速创建 iOS 和 Android 应用,提供用户友好的集成开发环境,内建模拟器对应用进行不同屏幕大小、分辨率下的测试,最大的优点是可即时修改代码即时进行测试,无需编译安...

匿名
2013/02/19
2.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

代理服务器和反向代理服务器之间有什么区别? - What's the difference between proxy server and reverse proxy server?

问题: 代理服务器和反向代理服务器有什么区别? 解决方案: 参考一: https://stackoom.com/question/wRc/代理服务器和反向代理服务器之间有什么区别 参考二: https://oldbug.net/q/wRc/W...

技术盛宴
51分钟前
16
0
第八讲:配置外界可以访问虚拟机里面的HDFS

本节通过配置实现外界访问虚拟机Centos6.4里面的HDFS。为后续的java读写HDFS做准备 步骤有: 1、修改主机Windos7的网络配置 2、修改虚拟机Centos6.4里面的网络配置 3、修改虚拟机Centos6.4里...

刘日辉
今天
26
0
OSChina 周四乱弹 —— 不劳而获的饭好吃么?好吃!非常好吃!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑推荐:《世界上不存在的歌 (2020重唱版)》- 陈奕迅 《世界上不存在的歌 (2020重唱版)》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
今天
31
2
从 GPU、TPU,到 Web 端、移动端,深度学习框架部署训练开始变简单

本文作者:o****0 早些时候的统计显示,今年3月,深度学习框架集中爆发。5月,有人发布可以直接在 iphone11上训练神经网络的开源项目。日前,百度开源国内首个可直接运行在 Web 端的深度学习...

百度开发者中心
昨天
16
0
如何从Git存储库中删除文件? - How can I delete a file from a Git repository?

问题: I have added a file named "file1.txt" to a Git repository. 我已将名为"file1.txt"的文件添加到Git存储库中。 After that, I committed it, added a couple of directories called......

富含淀粉
今天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部