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进行TCP网络编程的教程
Apr 29 Python
Python如何获取系统iops示例代码
Sep 06 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
May 15 Python
numpy和pandas中数组的合并、拉直和重塑实例
Jun 28 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 Python
解决python中导入win32com.client出错的问题
Jul 26 Python
Django单元测试工具test client使用详解
Aug 02 Python
python判断自身是否正在运行的方法
Aug 08 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
Python切图九宫格的实现方法
Oct 10 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
Protoss兵种对照表
2020/03/14 星际争霸
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
PHP中strtr字符串替换用法详解
2014/11/26 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
js导出txt示例代码
2014/01/14 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
详细分析jsonp的原理和实现方式
2017/11/20 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
js实现漂亮的星空背景
2019/11/01 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
个人求职简历的自我评价
2013/10/19 职场文书
会议邀请书范文
2014/02/02 职场文书
《荷花》教学反思
2014/04/16 职场文书
历史学专业求职信
2014/06/19 职场文书
节电标语大全
2014/06/23 职场文书
刘公岛导游词
2015/02/05 职场文书
社区重阳节活动总结
2015/03/24 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
java设计模式--三种工厂模式详解
2021/07/21 Java/Android
golang使用map实现去除重复数组
2022/04/14 Golang
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android