首页 > 编程 > Python > 正文

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

2020-01-04 16:04:58
字体:
来源:转载
供稿:网友

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到python教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表