zoukankan      html  css  js  c++  java
  • Python 100行代码实现2048小游戏

    首先我们来看看我们效果图:

     这是最简版后期可以去优化,后端自己写一个可视化页面,或者配上一个前端,可以使我们的程序变得更绚丽。

    下面我们开始我们的代码

    一、构造一个把0元素移至末尾的函数

    [2, 4, 0, 2] --> [2, 4, 2, 0]
     1 def zero_end():
     2     """
     3     0元素移至到末尾
     4     :param list_merge:
     5     :return:
     6     """
     7     for i in range(-1, -len(list_merge) - 1, -1):
     8         if list_merge[i] == 0:
     9             del list_merge[i]
    10             list_merge.append(0)
    11 
    12     return list_merge

    二、构造一个合并相邻的元素的函数

    [2, 2, 0, 0] --> [4, 0, 0, 0]
     1 def merge():
     2     """
     3     合并相邻的相同元素
     4     :param list_merge:
     5     :return:
     6     """
     7     for i in range(len(list_merge) - 1):
     8         if list_merge[i] == list_merge[i + 1]:
     9             list_merge[i] += list_merge[i + 1]
    10             del list_merge[i + 1]
    11             list_merge.append(0)
    12     return list_merge

    三、构造一个向左移动地图并合并的函数

     1 # @stochastic
     2 # @finish
     3 def move_left():
     4     """
     5     地图 向左移动 并合并
     6     :return:
     7     """
     8     for line in map_:
     9         global list_merge
    10         list_merge = line
    11         zero_end()
    12         merge()
    13     return map_

    四、构造一个向右移动地图并合并的函数(和向左移动差不多,就是相反放进去相反取出来就好)

     1 # @stochastic
     2 # @finish
     3 def move_right():
     4     """
     5     地图 向右移动 并合并
     6     :return:
     7     """
     8     for line in map_:
     9         global list_merge
    10         list_merge = line[::-1]
    11         zero_end()
    12         merge()
    13         line[::-1] = list_merge
    14     return map_

    五、构造一个向上(下)移动地图合并的函数

    首先我们写一个移动方阵的函数

    1 def square_matrix_transpose(sqr_matrix):
    2     for c in range(0, len(sqr_matrix) - 1):
    3         for r in range(c, len(sqr_matrix)):
    4             sqr_matrix[r][c], sqr_matrix[c][r] = sqr_matrix[c][r], sqr_matrix[r][c]
    5     return sqr_matrix

     然后我们开始构造向上移动并合并的函数

     1 # @stochastic
     2 # @finish
     3 def move_up():
     4     """
     5     向上移动方阵 并合并
     6     :return:
     7     """
     8     square_matrix_transpose(map_)
     9     for line in map_:
    10         global list_merge
    11         list_merge = line
    12         zero_end()
    13         merge()
    14     square_matrix_transpose(map_)
    15     return map_

    最后我们开始构造向下移动并合并的函数

     1 # @stochastic
     2 # @finish
     3 def move_down():
     4     """
     5     向下移动方阵 并合并
     6     :return:
     7     """
     8     square_matrix_transpose(map_)
     9     for line in map_:
    10         global list_merge
    11         list_merge = line[::-1]
    12         zero_end()
    13         merge()
    14         line[::-1] = list_merge
    15     square_matrix_transpose(map_)
    16     return map_

    到现在我们的总体代码就快写完了,还剩下两个装饰器就大功告成了

    首先我们来写每次移动我们随机添加一个数字2

     1 def stochastic(func, *args, **kwargs):
     2     def lnner(*args, **kwargs):
     3         try:
     4             global one_execute
     5             if not one_execute:
     6                 one_execute = True
     7                 print("欢迎体验2048小游戏")
     8                 return map_
     9             else:
    10                 p = []
    11                 data = func()
    12                 for k, v in enumerate(data):
    13                     for i, j in enumerate(v):
    14                         if j == 0:
    15                             p.append([k, i])
    16                 rand = random.choice(p)
    17                 data[rand[0]][rand[1]] = 2
    18                 return data
    19         except Exception as e:
    20             print(e)
    21         return "Game over"

    首先我们来写一个结束的装饰器

    1 def finish(func, *args, **kwargs):
    2     def lnner(*args, **kwargs):
    3         now_list = copy.deepcopy(map_)
    4         data = func()
    5         if now_list == data:
    6             return "Game over"
    7         return data
    8 
    9     return lnner

    现在我们所有的代码就都大功告成了,就剩下最后一步了,大快人心的时刻来了。启动

     1 if __name__ == '__main__':
     2     map_ = [
     3         [0, 0, 0, 0],
     4         [0, 0, 0, 0],
     5         [0, 0, 2, 0],
     6         [0, 0, 0, 0]
     7     ]
     8     while True:
     9         operate = input("请输入(上下左右):")
    10         if operate not in ["","","",""]:
    11             print("请输入(上下左右)其中一个。")
    12             continue
    13         sw = {
    14             operate=="":move_up,
    15             operate=="":move_down,
    16             operate=="":move_left,
    17             operate=="":move_right
    18         }
    19         res = sw[True]()
    20         if res == "Game over":
    21             break

    让我们开始我们的游戏吧!!!

  • 相关阅读:
    本地服务器连接不上解决过程!!!
    delete语句与reference约束 FK_subplan_job_id冲突问题,导致job无法删除解决办法
    设置手动批量删除数据库相关进程
    生成10位由大小写字母和数字组成的随机激活码
    修改表中某个字段区分大小写
    SQL获取时间戳流水号
    TypeError: Object(...) is not a function
    vue 中使用setTimeout
    Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber
    微信小程序 指定tabBar打开某个tab
  • 原文地址:https://www.cnblogs.com/shangwei/p/13925215.html
Copyright © 2011-2022 走看看