python开发元胞自动机之Game of Life

一、Game of Life 生命游戏

1. 简介

  • 生命游戏是英国数学家John Conway在1970年发明的细胞自动机。它最初于1970年10月在《科学美国人》杂志中马丁·葛登(Martin Gardner,1914年11月21日-2010年5月22日。又译:马丁·加德纳)的“数学游戏”专栏出现。
  • 生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。实际中,你可以设定周围活细胞的数目怎样时才适宜该细胞的生存。如果这个数目设定过高,世界中的大部分细胞会因为找不到太多的活的邻居而死去,直到整个世界都没有生命;如果这个数目设定过低,世界中又会被生命充满而没有什么变化。实际中,这个数目一般选取2或者3;这样整个生命世界才不至于太过荒凉或拥挤,而是一种动态的平衡。

2. 游戏规则

  1. 活细胞周围的细胞数如果小于2个或多于3个则会死亡;(离群或过度竞争导致死亡)
  2. 活细胞周围如果有2或3个细胞可以继续存活;(正常生存)
  3. 死细胞(空格)周围如果恰好有3个细胞则会诞生新的活细胞。(繁殖)

二、实现思路

  1. 利用Python面向对象编程,定义三个类:
  • Cell类,用于创建单个元胞对象,根据其邻居元胞的生命状态判断它的生死。
  • CellGrid类,定义整体的网格大小,遍历循环每个元胞计算其下一时刻的状态。
  • Game类,用到pygame模块,用于在屏幕上绘制网格以及元胞,并设定迭代的频率。
  1. 定义一个main函数作为程序入口,在执行函数时需要注意顺序,先执行计算邻居存活数的函数 circulate_nbcount(),再执行根据规则判断元胞生命状态的函数 circulate_rule。

三、代码部分

import random

class Cell:
    """
    细胞类,单个细胞
    """
    def __init__(self, ix, iy, is_live):
        self.ix = ix
        self.iy = iy
        self.is_live = is_live
        self.neighbour_count = 0

    def __str__(self):
        return "[{},{},{:5}]".format(self.ix, self.iy, str(self.is_live))

    # 计算周围活的邻居的个数,计算机中屏幕左上角的坐标为(0,0)
    def calc_neighbour_count(self):
        count = 0
        pre_x = self.ix - 1 if self.ix > 0 else 0  # 某元胞左邻居的x值
        for i in range(pre_x, self.ix+1+1):     # 循环的x坐标范围是从某元胞的左邻居到右邻居
            pre_y = self.iy - 1 if self.iy > 0 else 0 # 某元胞上邻居的y值
            for j in range(pre_y, self.iy+1+1): # 循环的y坐标范围是从某元胞的上邻居到下邻居
                # 该元胞是自己,continue,不统计count
                if i ==
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值