zoukankan      html  css  js  c++  java
  • python学习笔记(五) 200行实现2048小游戏

    用前文提到的基础知识,和网上流行的2048源码,用python实现该游戏。

    先将用户操作和游戏逻辑绑定。

    WASD分别对应移动方向上、左、下、右

    然后实现矩阵的转置和逆置,这样只要实现一个方向的移动,通过转置和逆置就可以得到其他方向

    的移动。

    基本的函数声明完成了,下面定义GameField类,主要实现游戏逻辑和状态转换。

    GameField类和其中包含的一些函数。先看构造函数。

     构造棋盘并且刷新棋盘,作为初次游戏的布局。

    spawn函数为随机某个位置设置随机值。

    移动函数,这个函数比较复杂,代码也比较多。

     move函数内部先定义了左移的函数move_row_left,move_row_left内部定义了tighten和merge函数。

    tighten函数作用是先将一行中非0的元素移动到左边排列,剩余的0元素放在右边,可以理解为压缩。

    如[0,2,2,4]经过tighten调用后就变为[2,2,4,0]。merge函数的功能是将相邻的相等的元素进行合并,

    比如[2,2,8,0]经过merge后变为[0,4,8,0],[0,4,8,0]经过再次tighten调用后变为[4,8,0,0]

    所以move_row_left内部实现的就是先对一个队列tighten,然后merge再次tighten达到左侧都是非0,右侧都是0。

    move函数最后定义了一个dict,dict的key为方向,value为二维list。这个二维list是通过lambda表达式调用

    左移函数以及矩阵逆置和转置等操作生成的。

    举例说明右移:通过右移要达到的效果是[2,2,4,4]=>[0,0,4,8],为达到该目的,通过逆置矩阵,左移,再次逆置矩阵即可。
    先逆转矩阵
    [2,2,4,4]=>[4,4,2,2]
    再执行左移函数
    [4,4,2,2]=>[8,4,0,0]
    再执行矩阵逆置
    [8,4,0,0]=>[0,0,4,8]达到最初效果
    上移和下移都是类似。

    move函数最后通过判断传入direction是否符合标准,如果符合再次判断元素是否可以移动,如果可以移动则取出dict中方向key对应

    的value,即二维list,从而得出移动后的棋盘界面。如果所有元素都不能移动,那么判断失败。

    判断某个方向是否有元素可以移动,定义了如下函数。

    同样是先判断是否可以左移,其他方向能否移动可以通过左移操作和矩阵的转置,逆置判断。

     row_is_left_movable是判断是否可以左移操作的函数,内部定义了change函数,

    change函数的功能为判断有左右相邻元素可以合并,或者该行有含有0的元素,则返回true,表示该行可以左移。

    反之为不可左移,返回false。any函数判断该行所有元素,如果都没有可移动的元素,返回false。

    同样是通过check这个dict,结合逆转和转置判断其他方向是否可以移动。如果某个方向所有行都不能移动,

    表示矩阵中所有元素不能按照该方向移动了。

    下面是判断输赢的函数。

    到此为止GameField类介绍完了,下面是main函数。

     

    定义了几个状态,通过状态机的方式运行游戏。 curses.wrapper模块。这个函数做了一些初始化的工作,包括上面提到的和颜色的初始化。

    然后再执行main函数,最后重置。

    源码下载地址:

    http://download.csdn.net/detail/secondtonone1/9852914

    运行上述代码效果如下:

     我的公众号,谢谢关注

  • 相关阅读:
    JPA与Hibernate的关系
    EJB里的问题解答
    EJB与JPA的关系
    EJB的魅惑来源
    EJB简介
    MyEclipse如何恢复删掉的文件
    EasyUI的功能树之扁平化
    EasyUI的功能树之异步树
    Spring AOP的日志记录
    简单理解IoC与DI
  • 原文地址:https://www.cnblogs.com/secondtonone1/p/6907195.html
Copyright © 2011-2022 走看看