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 相关文章推荐
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
tensorflow实现逻辑回归模型
Sep 08 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Python的matplotlib绘图如何修改背景颜色的实现
Jul 16 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
python3.7通过thrift操作hbase的示例代码
Jan 14 Python
pandas和spark dataframe互相转换实例详解
Feb 18 Python
python中get和post有什么区别
Jun 19 Python
Python 实现PS滤镜的旋涡特效
Dec 03 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
PHP IF ELSE简化/三元一次式的使用
2011/08/22 PHP
php缩小png图片不损失透明色的解决方法
2013/12/25 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
PHP微商城开源代码实例
2019/03/27 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
python实现人人网登录示例分享
2014/01/19 Python
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
详解用python实现简单的遗传算法
2018/01/02 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
Python模块常用四种安装方式
2020/10/20 Python
python时间time模块处理大全
2020/10/25 Python
毕业生多媒体设计求职信
2013/10/12 职场文书
大学生专科毕业生自我评价
2013/11/17 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
平安校园建设方案
2014/05/02 职场文书
简单租房协议书范本
2014/08/20 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
二年级上册数学教学计划
2015/01/20 职场文书