使用 Python 练习一个经典的小游戏,附60行完整代码下载

Python与算法社区

已原创 447 篇原创,干货满满

三步加星标

01

02

03

三步加星标

  你好,我是 zhenguo

   今晚使用 Python 练习一个经典的游戏:the game of life

英国数学家约翰·何顿·康威在1970年发明了 the game of life,在生命游戏中,对于任意细胞,规则如下:

每个细胞有两种状态 - 存活或死亡

每个细胞与以自身为中心的周围八格细胞产生互动

当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态。(模拟生命数量稀少)

当前细胞为存活状态时,当周围有2个或3个存活细胞时,该细胞保持原样。

当前细胞为存活状态时,当周围有超过3个存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)

当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。(模拟繁殖)

拿个例子阐述上述状态,如下种子时代:

[0, 0, 1, 0, 0]
[0, 1, 1, 0, 0]
[0, 0, 1, 1, 0]
[0, 1, 1, 1, 0]
[0, 0, 0, 0, 0]

坐标[0,2]为一个存活的细胞,因为周围细胞个数为2,所以繁衍后依然存活;

坐标[1,2]的存活细胞,因为周围有4个存活细胞,所以繁衍后死亡;

坐标[0,1]死亡细胞,因为周围恰好有3个存活细胞,所以[0,1]处出现生命,

繁衍一代后的,完整图如下:

[0, 1, 1, 0, 0]
[0, 1, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 1, 0, 1, 0]
[0, 0, 1, 0, 0]

第二代:

[0, 1, 1, 0, 0]
[0, 1, 1, 0, 0]
[0, 0, 1, 0, 0]
[0, 0, 1, 0, 0]
[0, 0, 1, 0, 0]

...

能到第几代结束呢?借用 Python 模拟了生命游戏,整个代码一共 60 行。

首先生成生命网格:

def get_board(size, alive_cons):
    return [[1 if (i, j) in alive_cons else 0
             for j in range(size)]
            for i in range(size)]

获得细胞的邻域:

def get_neighbors(con):
    x, y = con
    neighbors = [(x + i, y + j)
                 for i in range(-1, 2)
                 for j in range(-1, 2)
                 if not i == j == 0]
    return neighbors

判断下一代是否存活:

def is_alive_con(con, alive_cons):
    alive_neighbors = calculate_alive_neighbors(con, alive_cons)
    if (alive_neighbors == 3 or
            (alive_neighbors == 2 and con in alive_cons)):
        return True
    return False

生成下一代完整的生命网格:

def new_step(alive_cons):
    board = itertools.chain(*map(get_neighbors, alive_cons))
    new_board = set([con
                     for con in board
                     if is_alive_con(con, alive_cons)])
    return list(new_board)

以上就是几个核心的函数,下面主函数:

def main():
    size = 5
    board = [(0, 2), (1, 1), (1, 2), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
    print_board(get_board(size, board))
    for _ in range(10):
        board = correct_cons(size, new_step(board))
        print_board(get_board(size, board))

终止状态:所有网格细胞状态都为0

生命游戏的完整代码,下载请微信我,备注:生命游戏

不必打赏

给我点个赞

就心满意足了

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值