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编程之gui程序实现简单文件浏览器代码
Dec 08 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
python实现多张图片拼接成大图
Jan 15 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
Python正则表达式急速入门(小结)
Dec 16 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
Python 列表中的修改、添加和删除元素的实现
Jun 11 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
python爬虫beautifulsoup解析html方法
Dec 07 Python
Python Selenium XPath根据文本内容查找元素的方法
Dec 07 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 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
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
session 加入redis的实现代码
2016/07/15 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
更正确的asp冒泡排序
2007/05/24 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Python3最长回文子串算法示例
2019/03/04 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
机电工程专业应届生求职信
2013/10/03 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
小班秋游活动方案
2014/02/22 职场文书
学校三节实施方案
2014/06/09 职场文书
世界气象日活动总结
2015/02/27 职场文书
2015教师节通讯稿
2015/07/20 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
施工安全协议书
2016/03/22 职场文书
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL