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实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
Python解决鸡兔同笼问题的方法
Dec 20 Python
Python实现Linux命令xxd -i功能
Mar 06 Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 Python
python实现可视化动态CPU性能监控
Jun 21 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
python实现贪吃蛇双人大战
Apr 18 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Python Opencv图像处理基本操作代码详解
Aug 31 Python
Python常用GUI框架原理解析汇总
Dec 07 Python
OpenCV绘制圆端矩形的示例代码
Aug 30 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的urlencode()URL编码函数浅析
2011/08/09 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
图片自动更新(说明)
2006/10/02 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
微信小程序用canvas画图并分享
2020/03/09 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
ES6 async、await的基本使用方法示例
2020/06/06 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
Python实现读取Properties配置文件的方法
2018/03/29 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
python通过移动端访问查看电脑界面
2020/01/06 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
生产副总岗位职责
2013/11/28 职场文书
企业总经理任命书
2014/06/05 职场文书
庐山导游词
2015/02/03 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis