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数组条件过滤filter函数使用示例
Jul 22 Python
python中对list去重的多种方法
Sep 18 Python
python通过shutil实现快速文件复制的方法
Mar 14 Python
Python 功能和特点(新手必学)
Dec 30 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
python scrapy重复执行实现代码详解
Dec 28 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 Python
Python 如何创建一个线程池
Jul 28 Python
Python中Selenium模块的使用详解
Oct 09 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
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
php中动态调用函数的方法
2015/03/16 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
js简单时间比较的方法
2016/08/02 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
Python运行的17个时新手常见错误小结
2012/08/07 Python
python中字符串的操作方法大全
2018/06/03 Python
python使用turtle绘制分形树
2018/06/22 Python
flask中过滤器的使用详解
2018/08/01 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
招商经理岗位职责
2013/11/16 职场文书
公司年会演讲稿范文
2014/01/11 职场文书
一体化教学实施方案
2014/05/10 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
学生个人评语大全
2015/01/04 职场文书
总经理司机岗位职责
2015/04/10 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
元宵节晚会主持词
2015/07/01 职场文书
市级三好生竞选稿
2015/11/21 职场文书
2016十一国庆节感言
2015/12/09 职场文书
社会实践心得体会范文
2016/01/14 职场文书
《春酒》教学反思
2016/02/22 职场文书
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP