python实现生命游戏的示例代码(Game of Life)
发布时间:2020-05-24 18:25:08 所属栏目:Python 来源:互联网
导读:生命游戏的算法就不多解释了,百度一下介绍随处可见。因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用numpy,使用起来学习成本比较高,所以闲暇之余写一个不用外部依赖库,console输出
|
生命游戏的算法就不多解释了,百度一下介绍随处可见。 因为网上大多数版本都是基于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 ' 33[0;37;47m 33[0m'
return ' 33[0;30;40m 33[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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
