2048总结 python_Python_2048(一)

本文介绍了如何使用Python编写2048游戏。通过分析游戏规则,详细讲解了游戏初始化、生成数字、画格子、移动操作等关键模块的设计与实现,并提供了左移操作的代码示例。
摘要由CSDN通过智能技术生成

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]

后记

左移操作的响应,这里给出了代码,其他三个操作的代码,我们下期再讲

还有,游戏结束的代码,请先行思考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值