python实现生命游戏的示例代码(Game of Life)

作者:其实我是一头猪 时间:2023-11-02 21:33:35 

生命游戏的算法就不多解释了,百度一下介绍随处可见。

因为网上大多数版本都是基于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

来源:http://blog.csdn.net/valiensun/article/details/77533596

标签:python,生命游戏
0
投稿

猜你喜欢

  • 常用SQL语句(嵌套子查询/随机等等)详细整理

    2024-01-20 12:50:40
  • 聊聊Pytorch torch.cat与torch.stack的区别

    2021-05-07 02:07:39
  • Python3多线程版TCP端口扫描器

    2021-07-13 21:25:45
  • Golang加权轮询负载均衡的实现

    2024-02-01 04:41:57
  • 极致之美——百行代码实现全新智能语言Lisp

    2010-07-13 13:07:00
  • python3转换code128条形码的方法

    2021-01-07 07:14:47
  • vue3 使用defineAsyncComponent与component标签实现动态渲染组件思路详解

    2024-05-02 16:32:38
  • 简单介绍Python中的round()方法

    2023-05-01 11:57:10
  • python 使用socket传输图片视频等文件的实现方式

    2022-11-12 11:55:37
  • js中的replace方法使用介绍

    2024-04-10 13:54:58
  • 详解Appium+Python之生成html测试报告

    2022-12-21 22:38:51
  • SQL语句中LEFT JOIN的ON和WHERE有什么区别

    2024-01-21 04:33:00
  • Python 异步协程函数原理及实例详解

    2022-05-26 11:29:55
  • 利用python GDAL库读写geotiff格式的遥感影像方法

    2023-08-31 13:15:06
  • python中hashlib模块用法示例

    2023-03-20 12:20:13
  • 利用Python的tkinter模块实现界面化的批量修改文件名

    2023-08-30 20:45:15
  • 如何在Mac OS X中安装MySQL

    2009-09-01 10:16:00
  • Pygame Surface创建图像的实现

    2023-07-10 13:44:26
  • JavaScript 获得选中文本内容的方法

    2024-05-03 15:07:18
  • 用MySQL做站点时如何记录未知错误的发生

    2010-09-30 14:11:00
  • asp之家 网络编程 m.aspxhome.com