Python_208(一)
前言
Python的基本学习已经有一段时间了.如何更好的使用手上的工具,让我们的学习,能有所用.我觉得是一个非常重要的学习路线.
今天我们尝试写一个Python版的控件台游戏:2048
程序分析:
游戏规则介绍
- 一共有4*4 =16个格子
- 开局格子上有两个数字2,
- 每一次有效移动,在空格子会随机生成一个2或4的数字
- 有效移动是指至少有一个数字能够按照规则进行移动或者合并
- 移动的规则:所有数字按照同一个方向靠拢,在过程中如果有相同且相邻的数字,会被叠加后放到最靠近边上的位置
- 游戏失败的规:
- 16个格子全部有数字
- 四个方向都不能进行有效的操作
当同时满足以上两个条件时,游戏失败.
程序流程分析
- 初始化游戏
(1) 随机生成两个位置
(2) 画出游戏格子
(3) 等待玩家操作
(4)根据玩家的操作,选择相应的移动或者不移动
(5)移动完成后,生成一个新的数字
(6)判断游戏格子是否满了,
不满,则回到等待玩家的操作
满:判断游戏是否失败
失败:给出提示,结束游戏
否则:继续等待玩家操作
游戏模块设计
- 初始化模块
- 生成数字模块
- 画格子模块
- 四个方向的移动模块(可以四合一,也可以拆分开成四个)
- 游戏失败判断模块
模块实现
初始化游戏
- 调用两次<生成数字>
- 画出游戏格子
def init_game():
# 调用两次生成数字,参数为2,即生成数字是2数
add_num(2)
add_num(2)
# 画游戏界面
draw_grids()
生成数字:
- 第一个参数是游戏中的总的表格
- 第二个参数是不定长参数,如果有参数,则根据参数来新增数字,如果没有参数,则随机生成
- 随机生成的位置,要判断是否有数字了,如果有,要重新生成
- 随机生成的数字2 和 4 不是一比一生成的,可以根据实际情况做调节,这里行径比例7:3可以根据需要自己调节
def add_num(grids, *args):
''' 函数说明 '''
# 用来往表格新增数字
# grids: 二维四元素列表
# *args: 没有参数时,随机生成,有参数时用参数
while 1:
i = randint(0, 3)
j = randint(0, 3)
if grids[i][j] != 0:
break
if args:
grids[i][j] = args[0]
return
num = randint(0, 9) # 数字2的比例比数字4的比例稍大点.可以通过下述的条件来改变2者之间的比例
if num <7:
grids[i][j] = 2
return
grids[i][j] = 4
return
画表格
def draw_grids(grids):
'''函数说明'''
# 将游戏数据显示出来
# grids:二维四元素列表
print("#" * 25) # 上辚框
for i in range(4):
for j in range(4):
print("#" + str(grids[i][j]).rjust(5),end="") # 格式化输出数字
print("#")
print("#" * 25) # 下边框
移动
分析:
以左移为例,以第一行为例:
- 2220
合成以后的结果是
4200 - 2024
合成以后的结果是
4400 - 2048
移动以后的结果是
248 - 0224
合成后以的结果是
4400
整个操作逻辑:
准备一个临时的列表result = []
先将非0的数字依次装入result
第二步:
对result的数字进行分析:设置一个标识位n
当第n位的数字与n+1位可以合并时,就将n+1并入n,标识位设置到第n+2位,n+1位设置为0
如果第n位与n +1位不同,则直接设置标识为n+1,再判断 ,直到标识位设置到result的最后一位
设第一行的内容已经存入row1里
第一步:
for i in row1:
if i != 0:
result.append(i)
flag = 0
while flag < len(result)-1:
if result[flag] == result[flag + 1]:
result[flag] *= 2
result[flag+1] = 0
flag += 2
else:
flag += 1
完整代码:
def move_left(grids):
''' 函数说明 '''
# 左移操作响应
for i in range(4):
result = [x for x in grids[i] if x != 0]
print(result)
flag = 0
grids[i] = [0,0,0,0]
j = 0
while flag < len(result) -1:
if result[flag] == result[flag + 1]:
grids[i][j] = result[flag] * 2
j += 1
flag += 2
else:
grids[i][j] = result[flag]
j += 1
flag += 1
if flag == len(result)-1: grids[i][j] = result[flag]
后记
左移操作的响应,这里给出了代码,其他三个操作的代码,我们下期再讲
还有,游戏结束的代码,请先行思考