猫史档案馆


生命游戏(附代码)

用户:1111101011111010查看:0 回复:2 评论:0 创建时间:2020-11-14T16:54:36


什么是生命游戏:

 

细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的。所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有N*N个格子。而每一个格子都可以看成是一个生命体,每个生命都有两种状态,如果该格子生就显示蓝色,喵则显示白色。每一个格子旁边都有邻居格子存在,如果我们把3*3的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。   每个格子的生喵遵循下面的原则: 1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为喵,则转为生,若原先为生,则保持不变) 。   2. 如果一个细胞周围有2个细胞为生,则该细胞的生喵状态保持不变;   3. 在其它情况下,该细胞为喵(即该细胞若原先为生,则转为喵,若原先为喵,则保持不变)   设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。   这样就把这些若干个格子(生命体)构成了一个复杂的动态世界。运用简单的3条作用规则构成的群体会涌现出很多意想不到的复杂行为,这就是复杂性科学的研究焦点。 细胞自动机有一个通用的形式化的模型,每个格子(或细胞)的状态可以在一个有限的状态集合S中取值,格子的邻居范围是一个半径r,也就是以这个格子为中心,在距离它r远的所有格子构成了这个格子的邻居集合,还要有一套演化规则,可以看成是一个与该格子当前状态以及邻居状态相关的一个函数,可以写成f:S*S^((2r)^N-1)->S。这就是细胞自动机的一般数学模型。   最早研究细胞自动机的科学家是冯·诺伊曼,后来康韦发明了上面展示的这个最有趣的细胞自动机程序:《生命游戏》,而wolfram则详尽的讨论了一维世界中的细胞自动机的所有情况,认为可以就演化规则f进行自动机的分类,而只有当f满足一定条件的时候,系统演化出来的情况才是有活力的,否则不是因为演化规则太喵板而导致生命的喵亡,就是因为演化规则太复杂而使得随机性无法克服,系统乱成一锅粥,没有秩序。后来人工生命之父克里斯·朗顿进一步发展了元胞自动机理论。并认为具有8个有限状态集合的自动机就能够涌现出生命体的自复制功能。他根据不同系统的演化函数f,找到了一个参数lamda用以描述f的复杂性,得出了结论只有当lamda比混沌状态的lamda相差很小的时候,复杂的生命活系统才会诞生,因此,朗顿称生命诞生于“混沌的边缘”!并从此开辟了“人工生命”这一新兴的交叉学科! 如今细胞自动机已经在地理学、经济学、计算机科学等领域得到了非常广泛的应用!

 

kitten生命游戏:

 

python生命游戏:

 

1.代码

import pygame
import math
import time
import sys
big=int(input('请输入大小:'))
t=int(input('请输入执行次数:'))
s=int(input('请输入帧数:'))
GREEN, WHITE, GRAY = (0, 0, 0), (255, 255, 255), (200, 200, 200)
pygame.init()
screen = pygame.display.set_mode((700, 700))
pygame.display.set_caption("生命游戏")


def init_screen():
    screen.fill(WHITE)
    for i in range(math.ceil(700/big)):
        pygame.draw.line(screen, GRAY, (i*big, 0), (i*big, 700))
        pygame.draw.line(screen, GRAY, (0, i*big), (700, i*big))
    pygame.display.update()


def kin_count(x, y):
    count = 0
    kins = [
        (x-big, y-big), (x, y-big), (x+big, y-big), (x-big, y),
        (x+big, y), (x-big, y+big), (x, y+big), (x+big, y+big)
    ]
    kins = [(x, y) for x, y in kins if 0 < x < 700 and 0 < y < 700]
    for kin in kins:
        if screen.get_at(kin) == GREEN:
            count += 1
    return count


init_screen()
cells = []
while 1:
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONUP:
            if screen.get_at(event.pos) == WHITE:
                x, y = event.pos
                cellx, celly = x-x % big, y-y % big
                cell = pygame.Rect(cellx, celly, big, big)
                pygame.draw.rect(screen, GREEN, cell)
                cells.append((cellx, celly))
                pygame.display.update()


                
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                turn = 0
                while len(cells) > 0 and turn < t:
                    turn += 1
                    for x in range(math.ceil(big/2), 700, big):
                        for y in range(math.ceil(big/2), 700, big):
                            if screen.get_at((x, y)) == GREEN:
                                if kin_count(x, y) not in [2, 3]:
                                    cells.remove((x-math.ceil(big/2), y-math.ceil(big/2)))
                            else:
                                if kin_count(x, y) == 3:
                                    cells.append((x-math.ceil(big/2), y-math.ceil(big/2)))
                    init_screen()
                    for cellx, celly in cells:
                        cell = pygame.Rect(cellx, celly, big, big)
                        pygame.draw.rect(screen, GREEN, cell)
                    pygame.display.update()
                    time.sleep(1/s)
            else:
                sys.exit()

 

2.说明

鼠标点击放置细胞

按空格键演化

 

3.效果

center_image发帖真不容易!

不喜勿喷!

有错误记得回复!

感谢支持!


回复

上一页1 页 / 共 1下一页
溪谷VALLEY溪谷VALLEY

24到27字节应该用括号

点赞0


评论


麟_月麟_月

书上抄的,我家也有这本书

点赞0


评论