康威生命游戏

简介: 康威生命游戏

康威生命游戏

康威生命游戏(Conway’s Game of Life)是康威发明的细胞自动机。

生命游戏有几个简单的规则:

细胞有两种状态,存活或死亡,每个细胞以自身为中心与周围的八格细胞互动。

对于存活的细胞

  1. 当周围的细胞过少(<2)或过多(>3)时,细胞死亡。
  2. 周围细胞数量适中(2或3)时,细胞保持存活。

对于死亡的细胞(空白区域):

  1. 周围有3个细胞时,该区域生成细胞。(模拟繁殖)

参考:中文维基百科-康威生命游戏


康威生命游戏通过上述几条简单的规则,加上不同的初始状态,就可以演化出各种复杂的模式:

Python实现

由于生命游戏的规则非常简单,我们可以很容易的用Python实现。

可以用二维数组表示细胞状态,并根据生命游戏的规则计算下一次的细胞状态进行更新。

(当规模变大时,更新细胞会变得困难。可以考虑并行)

下面是一个简单的实现,使用pygame显示动画,借助numpy操作数组。

效果如下:

代码参考:https://www.youtube.com/watch?v=cRWg2SWuXtM完整代码:

import pygame
import numpy as np
import time


# 定义颜色和细胞大小
COLOR_BG = (10, 10, 10) # 背景,黑色
COLOR_GRID = (40, 40, 40) # 网格,黑灰色
COLOR_DIE_NEXT = (170, 170, 170) # 下一代死亡细胞,灰色
COLOR_ALIVE_NEXT = (255, 255, 255) # 下一代存活细胞,白色
SIZE = 10

# 更新细胞状态
def update(screen, cells, size, with_progress=False):
    '''更新细胞状态
    screen: pygame.Surface 对象
    cells: 细胞状态矩阵
    size: 细胞大小
    with_progress: 是否显示下一代细胞状态。
                   有时候我们只想(通过鼠标点击)修改当前细胞状态,而不想立即显示下一代细胞状态
    '''
    updated_cells = np.zeros_like(cells)
    # 遍历每一个细胞
    for row, col in np.ndindex(cells.shape):
        # 统计周围细胞的存活数量
        alive = np.sum(cells[row-1:row+2, col-1:col+2]) - cells[row, col]
        # 设置格子颜色,如果当前细胞处于死亡状态,颜色为背景色;否则为存活细胞颜色
        color = COLOR_BG if not cells[row, col] else COLOR_ALIVE_NEXT
        # 如果当前细胞处于存活状态
        if cells[row, col]:
            if alive < 2 or alive > 3:
                if with_progress:
                    color = COLOR_DIE_NEXT
            elif 2 <= alive <= 3:
                updated_cells[row, col] = 1
                if with_progress:
                    color = COLOR_ALIVE_NEXT
        # 如果当前细胞处于死亡状态
        else:
            if alive == 3:
                updated_cells[row, col] = 1
                if with_progress:
                    color = COLOR_ALIVE_NEXT
        # 在屏幕的(row, col)位置绘制细胞。size-1是为了留出边界
        pygame.draw.rect(screen, color, (col*size, row*size, size-1, size-1))
    return updated_cells

def main():
    pygame.init()
    screen = pygame.display.set_mode((800, 600))

    cells = np.zeros((60, 80))
    screen.fill(COLOR_GRID)
    update(screen, cells, SIZE)
    pygame.display.update()

    ruuning = False
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
            if event.type == pygame.KEYDOWN:
                # 空格键控制游戏暂停/继续
                if event.key == pygame.K_SPACE: 
                    ruuning = not ruuning
                    update(screen, cells, SIZE)
                    pygame.display.update()
            # 鼠标左键点击,添加活细胞
            if pygame.mouse.get_pressed()[0]:
                x, y = pygame.mouse.get_pos()
                cells[y//SIZE, x//SIZE] = 1
                update(screen, cells, SIZE)
                pygame.display.update()
                
        screen.fill(COLOR_GRID)
        if ruuning:
            cells = update(screen, cells, SIZE, with_progress=True)
            pygame.display.update() 
            time.sleep(0.1)

if __name__ == '__main__':
    main()
相关文章
|
Java 程序员 C++
大学生如果想从事游戏行业,游戏开发或者电竞选手,有哪些建议?
@[TOC](目录) 大学生如果想从事游戏行业,游戏开发或者电竞选手,有哪些建议? # 一、游戏行业概述 游戏行业是指以电子游戏为核心的产业链,包括游戏开发、游戏发行、游戏运营、游戏硬件设备等多个环节。近年来,随着互联网技术的飞速发展,游戏行业呈现出移动化、社交化、智能化的趋势,不断涌现出新的游戏类型和玩法。游戏行业已成为全球范围内最具活力和潜力的产业之一。 # 二、游戏开发 游戏开发是指游戏制作团队根据游戏设计方案,通过编程、美术、音效等手段将游戏构思转化为具体游戏产品的过程。游戏开发涉及多个领域,包括计算机科学、数学、物理学、艺术设计等。游戏开发团队通常包括程序员、美术设计师、音效师、策划
139 0
|
传感器 小程序 物联网
我们来这里只干一件事:养鱼!
我们来这里只干一件事:养鱼!
149 0
|
开发者
游戏要从简单做起
嗨!大家好,我是小蚂蚁。 做游戏要从简单做起,尤其是对于新手开发者,一定要从简单做起。如果在啥也不会的时候,一上来就想做个大而复杂的,那结果只能是以失败告终。 有目标是好事情,但是前提是目标要合理,登顶珠峰是一个好目标,但是对于一个从未登山的人来讲,很显然这不适合当作第一个目标。
90 0
|
Python
康威生命游戏的Python实现
康威生命游戏的Python实现
397 0
康威生命游戏的Python实现
站着编程两年后我身体上的变化
自从我使用站立式电脑桌工作以来已经有2年时间。不论一天要编程多少个小时,我都是站立在电脑前。也就是说,有些日子我会一天站立超过10个小时,虽然不是连续的——中间会有小憩,吃饭,冥想等。
179 0
站着编程两年后我身体上的变化
珍爱生命,远离大论战
  前几天小学聚会,想起来了一些小时候的趣事。有一同学,他学习能力强,学东西快,老师讲的课程他都会了,作业也都写完了。然后呢呆着没事,找他同桌闲聊,放学了还拉着他疯玩。结果呢,第二天要交作业,他是没事了,可是他同桌惨了,忘记写作业了。
934 0
我的生命该如何度过?
我的生命该如何度过? 很多人整天坐在办公桌前想我到底在这里做什么?但是大部分时候想归想,最后还是原地踏步。是因为他们不知道自己的生命应该如何度过,不知道自己还能干些其他什么事情,他们只知道自己不想在干当前这份工作了。
815 0
下一篇
无影云桌面