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基础教程之数字处理(math)模块详解
Mar 25 Python
视觉直观感受若干常用排序算法
Apr 13 Python
Python之str操作方法(详解)
Jun 19 Python
利用python3随机生成中文字符的实现方法
Nov 24 Python
使用Python实现从各个子文件夹中复制指定文件的方法
Oct 25 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
python requests模拟登陆github的实现方法
Dec 26 Python
python实现tail -f 功能
Jan 17 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
Jun 05 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常用函数的用法详解
2013/05/10 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
jquery ztree实现下拉树形框使用到了json数据
2014/05/14 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
python生成随机mac地址的方法
2015/03/16 Python
python使用post提交数据到远程url的方法
2015/04/29 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python实现简易数码时钟
2021/02/19 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
联想瑞士官方网站:Lenovo Switzerland
2017/11/19 全球购物
为什么使用接口?
2014/08/13 面试题
夜大自我鉴定
2013/10/31 职场文书
安全大检查反思材料
2014/01/31 职场文书
大一新生学期自我评价
2014/04/09 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
荒岛余生观后感
2015/06/09 职场文书