pygame生命游戏模拟_python Game of life生命棋像素级别模拟作者:李兴球

"""Conway's Game of Life),又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。
本程序用pygame模拟这种现象,作者:李兴球,风火轮少儿编程 www.scratch8.net

以前早就听说过Game of Life,以为好高大上的样子,今天仔细看下,好简单的模拟啊,基本原理就是遍历一个二维表格,然后判断周围的点数达到什么要求就把自己设为什么状态即可。这里的二维表格就是图片上的像素,它们每个点都有X,Y坐标。设一种非黑的颜色,表示这个点是活的。黑色的像素点表示它是死的。每遍历一次后,显示一次。再加点代码就能把所有的帧输出到gif文件里做成gif动画了。
"""
import pygame 
from random import randint

pygame.init()
life_color = (222,211,0,255)          #有颜色的代表活的,黑色代表死的
width,height = 200,200
screen = pygame.display.set_mode((width,height))
pygame.display.set_caption("生命游戏模拟_风火轮少儿编程李兴球")

life_image = pygame.Surface((width,height))

for i in range(5000):                 #初始化5000个活的
    x = randint(0,width)
    y = randint(0,height)
    life_image.set_at((x,y),life_color)

def get_numbers(x,y):
    """得到周围颜色点数量,也就是活的数量"""
    counter = 0 
    for i in range(-1,2):
        for j in range(-1,2):
            if i==0 and j ==0 :continue    #自己就跳过
            x1 = x + i   ; y1 = y + j
            if x1 >= 0 and x1< width and y1>=0 and y1<height:
                color = life_image.get_at((x1,y1))                 
                if color == life_color:counter = counter + 1
 
    return counter


while True:     
    for  x in range(width):
        for y in range(height):
          cell = life_image.get_at((x,y))
          cell_number = get_numbers(x,y)         #得到周围活的细胞数量
          if cell == life_color:                              #该细胞为活的              
              if cell_number == 3 or cell_number==2 :continue   #周围有2个或3个,它还是活的
              if cell_number < 2 or cell_number >3 :life_image.set_at((x,y),(0,0,0)) #小于2个,大于3个,它死了
          else:
              if cell_number == 3 : life_image.set_at((x,y),life_color)  #周围有3个,复活
 
    screen.blit(life_image,(0,0))    #把life_image渲染到screen上.
    pygame.display.update()         #更新屏幕显示


"""
1、规则

生命游戏中,对于任意细胞,规则如下。每个细胞有两种状态:存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。

当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟生命数量稀少)
当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
--------------------- 

pygame.image.save(life_image,"te.png")
"""
          
          
 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一个基于Python生命游戏的图形界面实现。在这里,我们使用pygame库来创建图形化界面,并使用numpy库来处理生命游戏的逻辑。 首先,我们需要安装pygame和numpy库。可以使用以下命令进行安装: ``` pip install pygame numpy ``` 接下来,我们将创建一个游戏类,该类将包含所有游戏逻辑和图形化界面实现。在这个游戏中,我们将使用一个矩形网格来表示生命游戏细胞。网格中每个单元格都可以是活着的或死亡的,具体取决于它周围的细胞数量。 以下是完整的代码: ```python import pygame import numpy as np class GameOfLife: def __init__(self, width=640, height=480, cell_size=10, speed=10): self.width = width self.height = height self.cell_size = cell_size self.speed = speed pygame.init() pygame.display.set_caption("Game of Life") self.screen = pygame.display.set_mode((self.width, self.height)) self.cells = np.zeros((self.width // self.cell_size, self.height // self.cell_size), dtype=bool) self.running = False def handle_events(self): for event in pygame.event.get(): if event.type == pygame.QUIT: self.running = False elif event.type == pygame.MOUSEBUTTONDOWN: x, y = pygame.mouse.get_pos() col, row = x // self.cell_size, y // self.cell_size self.cells[col, row] = not self.cells[col, row] elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: self.running = not self.running elif event.key == pygame.K_c: self.cells = np.zeros((self.width // self.cell_size, self.height // self.cell_size), dtype=bool) elif event.key == pygame.K_r: self.cells = np.random.choice([False, True], size=(self.width // self.cell_size, self.height // self.cell_size), p=[0.8, 0.2]) def get_neighbors(self, x, y): left, right = max(0, x-1), min(x+2, self.cells.shape[0]) top, bottom = max(0, y-1), min(y+2, self.cells.shape[1]) return self.cells[left:right, top:bottom] def update(self): new_cells = np.copy(self.cells) for i in range(self.cells.shape[0]): for j in range(self.cells.shape[1]): neighbors = self.get_neighbors(i, j) count = np.count_nonzero(neighbors) - self.cells[i, j] if self.cells[i, j] and (count < 2 or count > 3): new_cells[i, j] = False elif not self.cells[i, j] and count == 3: new_cells[i, j] = True self.cells = new_cells def draw(self): self.screen.fill((255, 255, 255)) for i in range(self.cells.shape[0]): for j in range(self.cells.shape[1]): if self.cells[i, j]: pygame.draw.rect(self.screen, (0, 0, 0), (i*self.cell_size, j*self.cell_size, self.cell_size, self.cell_size)) else: pygame.draw.rect(self.screen, (255, 255, 255), (i*self.cell_size, j*self.cell_size, self.cell_size, self.cell_size)) pygame.display.flip() def run(self): clock = pygame.time.Clock() self.running = True while self.running: clock.tick(self.speed) self.handle_events() if self.running: self.update() self.draw() pygame.quit() if __name__ == '__main__': game = GameOfLife() game.run() ``` 在这个实现中,我们创建了一个名为 `GameOfLife` 的类,该类包含以下方法: - `__init__`: 用于初始化游戏界面和生命游戏的初始状态。 - `handle_events`: 用于处理用户交互,例如单击鼠标、按下空格键或重新开始游戏。 - `get_neighbors`: 用于计算指定单元格周围的细胞数量。 - `update`: 用于根据生命游戏规则更新每个单元格的状态。 - `draw`: 用于绘制矩形网格并填充每个单元格的颜色。 - `run`: 用于运行游戏循环,处理事件并更新和绘制游戏状态。 在主程序中,我们创建了一个 `GameOfLife` 实例,并运行游戏循环,直到用户退出游戏。 现在,您可以运行代码并尝试模拟生命游戏。您可以使用鼠标单击单元格来切换其状态,按下空格键来暂停或继续游戏,按下“c”键来清除所有单元格,按下“r”键来随机化单元格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李兴球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值