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 文件操作技巧(File operation) 实例代码分析
Aug 11 Python
python正则表达式re模块详解
Jun 25 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
详解python3 + Scrapy爬虫学习之创建项目
Apr 12 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
python自动生成model文件过程详解
Nov 02 Python
python如何安装下载后的模块
Jul 03 Python
解决python打开https出现certificate verify failed的问题
Sep 03 Python
python在协程中增加任务实例操作
Feb 28 Python
Python进行区间取值案例讲解
Aug 02 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实现可逆加密的方法
2015/08/11 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
react中使用css的7中方式(最全总结)
2019/02/11 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
JS如何监听div的resize事件详解
2020/12/03 Javascript
Python中的yield浅析
2014/06/16 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
解读! Python在人工智能中的作用
2017/11/14 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
CSS3选择器新增问题的实现
2021/01/21 HTML / CSS
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
Asics日本官网:鬼冢八喜郎创立的跑鞋运动品牌
2017/10/18 全球购物
《雷雨》教学反思
2014/02/20 职场文书
技术比武方案
2014/05/19 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
会议接待欢迎标语
2014/10/08 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
先进班组事迹材料
2014/12/25 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
python 实现两个变量值进行交换的n种操作
2021/06/02 Python