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自动化构建工具scons使用入门笔记
Mar 10 Python
利用python模拟实现POST请求提交图片的方法
Jul 25 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
Python实现句子翻译功能
Nov 14 Python
python八皇后问题的解决方法
Sep 27 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
python实现用户名密码校验
Mar 18 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
python实现简易版学生成绩管理系统
Jun 22 Python
python中取绝对值简单方法总结
Jul 24 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 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给图片加水印
2016/10/12 PHP
php 访问oracle 存储过程实例详解
2017/01/08 PHP
checkbox使用示例
2013/08/23 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
JS交换变量的方法
2015/01/21 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
javascript数组定义的几种方法
2017/10/06 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
python lambda的使用详解
2021/02/26 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
BIBLOO波兰:捷克的一家在线服装店
2018/03/09 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
音乐器材管理制度
2014/01/31 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
法院个人总结
2015/03/03 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android
php去除数组中为0的元素的实例分析
2021/11/17 PHP
P站美图推荐——变身女主角特辑
2022/03/20 日漫