Python_208(一)

Python_208(一)

前言

Python的基本学习已经有一段时间了.如何更好的使用手上的工具,让我们的学习,能有所用.我觉得是一个非常重要的学习路线.
今天我们尝试写一个Python版的控件台游戏:2048

程序分析:

游戏规则介绍

  1. 一共有4*4 =16个格子
  2. 开局格子上有两个数字2,
  3. 每一次有效移动,在空格子会随机生成一个2或4的数字
  4. 有效移动是指至少有一个数字能够按照规则进行移动或者合并
  5. 移动的规则:所有数字按照同一个方向靠拢,在过程中如果有相同且相邻的数字,会被叠加后放到最靠近边上的位置
  6. 游戏失败的规:
  7. 16个格子全部有数字
  8. 四个方向都不能进行有效的操作
    当同时满足以上两个条件时,游戏失败.

程序流程分析

  1. 初始化游戏
    (1) 随机生成两个位置
    (2) 画出游戏格子
    (3) 等待玩家操作
    (4)根据玩家的操作,选择相应的移动或者不移动
    (5)移动完成后,生成一个新的数字
    (6)判断游戏格子是否满了,
    不满,则回到等待玩家的操作
    满:判断游戏是否失败
    失败:给出提示,结束游戏
    否则:继续等待玩家操作

游戏模块设计

  1. 初始化模块
  2. 生成数字模块
  3. 画格子模块
  4. 四个方向的移动模块(可以四合一,也可以拆分开成四个)
  5. 游戏失败判断模块

模块实现

初始化游戏

  1. 调用两次<生成数字>
  2. 画出游戏格子
def init_game():
    # 调用两次生成数字,参数为2,即生成数字是2数
    add_num(2)
    add_num(2)
    # 画游戏界面
    draw_grids()

生成数字:

  1. 第一个参数是游戏中的总的表格
  2. 第二个参数是不定长参数,如果有参数,则根据参数来新增数字,如果没有参数,则随机生成
  3. 随机生成的位置,要判断是否有数字了,如果有,要重新生成
  4. 随机生成的数字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)  # 下边框

移动

分析:

以左移为例,以第一行为例:

  1. 2220
    合成以后的结果是
    4200
  2. 2024
    合成以后的结果是
    4400
  3. 2048
    移动以后的结果是
    248
  4. 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]

后记

左移操作的响应,这里给出了代码,其他三个操作的代码,我们下期再讲
还有,游戏结束的代码,请先行思考

猜你喜欢

转载自blog.csdn.net/weixin_41810846/article/details/111827325
今日推荐