python实现生命游戏的示例代码(Game of Life)


Posted in Python onJanuary 24, 2018

生命游戏的算法就不多解释了,百度一下介绍随处可见。

因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用numpy,使用起来学习成本比较高,所以闲暇之余写一个不用外部依赖库,console输出的版本。

# -*- coding: utf-8 -*- 
from time import sleep 
from copy import deepcopy 
 
WORLD_HIGH = 20 #世界长度 
WORLD_WIDE = 40 #世界宽度 
ALIVE_CON = 3 #复活条件 
KEEP_CON = 2 #保有条件 
 
class Cell(object): 
  '''''细胞对象''' 
  def __init__(self, pos): 
    '''''自身坐标x,y, 已经是否还存活''' 
    self.point, self.is_alive = pos, False 
    self.x, self.y = self.point 
   
  def setAlive(self): 
    self.is_alive = True 
     
  def setDied(self): 
    self.is_alive = False 
     
  def display(self): 
    if self.is_alive: 
      return '*' 
    return ' ' 
     
  def displayLinux(self): 
    '''''在linux环境下可以打印黑白块''' 
    if self.is_alive: 
      return '\033[0;37;47m \033[0m' 
    return '\033[0;30;40m \033[0m' 
     
class GameManager(object): 
  def __init__(self): 
    self.world = self.initWorld() 
    self.initAliveCell() 
    
  def initWorld(self): 
    world = [] 
    for pos_x in xrange(WORLD_WIDE): 
      column = [] 
      for pos_y in xrange(WORLD_HIGH): 
        column.append(Cell((pos_x, pos_y))) 
      world.append(column) 
    return world 
   
  def initAliveCell(self): 
    from random import choice 
    for high in self.world: 
      for cell in high: 
        if choice((0, 1)) == 0: 
          continue 
        cell.setAlive() 
   
  def getNeighbours(self, cell_obj): 
    alive_count = 0 
    for x_of in xrange(-1, 2): 
      for y_of in xrange(-1, 2): 
        c_x, c_y = cell_obj.x + x_of, cell_obj.y + y_of 
        if ((c_x, c_y) == cell_obj.point) or \ 
          (c_x < 0 or c_x >= WORLD_WIDE) or \ 
          (c_y < 0 or c_y >= WORLD_HIGH): 
          '''''排除自身和越界的点''' 
          continue 
        if self.world[c_x][c_y].is_alive: 
          alive_count += 1 
    return alive_count 
        
  def display(self): 
    print '='*WORLD_WIDE #等号分割线 
    for index in xrange(WORLD_HIGH): 
      print ''.join([high[index].displayLinux() for high in self.world]) 
    print '='*WORLD_WIDE 
 
  def gameStart(self): 
    while True: 
      self.display() 
      new_world = deepcopy(self.world) 
      for p_x, wide_list in enumerate(self.world): 
        for p_y, _ in enumerate(wide_list): 
          current_cell = new_world[p_x][p_y] 
          nei_num = self.getNeighbours(current_cell) 
          if nei_num == ALIVE_CON: 
            current_cell.setAlive() 
          elif nei_num != KEEP_CON: 
            current_cell.setDied()        
      self.world = new_world 
      sleep(0.2) 
 
if __name__ == '__main__': 
  world = GameManager() 
  try: 
    world.gameStart() 
  except KeyboardInterrupt: 
    '''''防止ctrl+c退出报错''' 
    pass

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python升级提示Tkinter模块找不到的解决方法
Aug 22 Python
Python获取文件ssdeep值的方法
Oct 05 Python
详解Python的Django框架中的通用视图
May 04 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
Python中将dataframe转换为字典的实例
Apr 13 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
Oct 16 Python
浅谈python写入大量文件的问题
Nov 09 Python
python使用xlrd模块读取xlsx文件中的ip方法
Jan 11 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
Python 获得命令行参数的方法(推荐)
Jan 24 #Python
Python实现的rsa加密算法详解
Jan 24 #Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
Jan 24 #Python
python做量化投资系列之比特币初始配置
Jan 23 #Python
python在非root权限下的安装方法
Jan 23 #Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 #Python
Python 查看文件的读写权限方法
Jan 23 #Python
You might like
网络资源
2006/10/09 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
jquery购物车实时结算特效实现思路
2013/09/23 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
jquery图片切换插件
2015/03/16 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
详解Python 解压缩文件
2019/04/09 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
Python中格式化字符串的四种实现
2020/05/26 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
Collection和Collections的区别
2016/05/02 面试题
介绍下java.util.Arrays类
2012/10/16 面试题
怎么写自荐书范文
2014/02/12 职场文书
商业项目策划方案
2014/06/05 职场文书
公司外出活动方案
2014/08/14 职场文书
农业生产宣传标语
2014/10/08 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
暂住证明怎么写
2015/06/19 职场文书
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python