python

超轻量级php框架startmvc

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

更新时间:2020-05-19 02:36:01 作者:startmvc
生命游戏的算法就不多解释了,百度一下介绍随处可见。因为网上大多数版本都是基于pygame

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

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