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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
使用python实现省市三级菜单效果
Jan 20 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
Python中enumerate()函数编写更Pythonic的循环
Mar 06 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
python3结合openpyxl库实现excel操作的实例代码
Sep 11 Python
使用python实现抓取腾讯视频所有电影的爬虫
Apr 15 Python
python多进程间通信代码实例
Sep 30 Python
原生python实现knn分类算法
Oct 24 Python
python3中numpy函数tile的用法详解
Dec 04 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
python实现简易自习室座位预约系统
Jun 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 快速生成 Flash 动画的方法
2007/03/06 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
python elasticsearch环境搭建详解
2019/09/02 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
国际礼品店:GiftsnIdeas
2018/05/03 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
2014年实验室工作总结
2014/12/03 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫