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

Python与算法社区

共 2063字,需浏览 5分钟

 ·

2020-12-13 08:10

Python与算法社区
已原创 447 篇原创,干货满满
三步加星标


01

02

03

三步加星标







  你好,我是 zhenguo

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

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

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

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

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

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

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

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

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

[00100]
[01100]
[00110]
[01110]
[00000]

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

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

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

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

[01100]
[01000]
[00000]
[01010]
[00100]

第二代:

[01100]
[01100]
[00100]
[00100]
[00100]

...

能到第几代结束呢?借用 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(-12)
                 for j in range(-12)
                 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 = [(02), (11), (12), (22), (23), (31), (32), (33)]
    print_board(get_board(size, board))
    for _ in range(10):
        board = correct_cons(size, new_step(board))
        print_board(get_board(size, board))

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

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

不必打赏
给我点个赞
就心满意足了
浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报