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中使用 Selenium 实现网页截图实例
Jul 18 Python
零基础写python爬虫之抓取百度贴吧代码分享
Nov 06 Python
python去除所有html标签的方法
May 05 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
Python3 pandas 操作列表实例详解
Sep 23 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
简单了解Python读取大文件代码实例
Dec 18 Python
学习Python列表的基础知识汇总
Mar 10 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
Python anaconda安装库命令详解
Oct 16 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中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
JavaScript使用cookie
2007/02/02 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
python如何为被装饰的函数保留元数据
2018/03/21 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
python判断输入日期为第几天的实例
2018/11/13 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Django单元测试工具test client使用详解
2019/08/02 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
求网格中的黑点分布
2013/11/06 面试题
水污染治理专业毕业生推荐信
2013/11/14 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
中学生英语演讲稿
2014/04/26 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
国际贸易专业自荐信
2014/06/10 职场文书
离婚协议书格式范本
2016/03/18 职场文书
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server