猫史档案馆


【Python作品分享】生命游戏(元胞自动机)

用户:BC_driverBC_driver查看:2 回复:3 评论:2 创建时间:2020-02-03T19:31:08


(之前是我太蠢了,没把完全代码发出来,补个档,抱歉!

会更新的!!!

center_image

【作品介绍】

生命游戏游戏规则只有四条:

 

1 当周围仅有1个或没有存活细胞时, 原来的存活细胞进入喵亡状态。(模拟生命数量稀少)

2 当周围有2个或3个存活细胞时, 网格保持原样。

3 当周围有4个及以上存活细胞时,原来的存活细胞亦进入喵亡状态。(模拟生命数量过多)

4 当周围有3个存活细胞时,空白网格变成存活细胞。(模拟繁殖)

操作:

1.不按下N时:

左键添加,

1,2,3键代表稀疏密铺,中等密铺,密集密铺

2.按下N时

左键删除

1,2,3键代表速度为慢,中,快

按下S为逐步运行

按下C为全部清除

按下SPACE为开始

左下角显示现在的代数

有BUG来找我@BC_driver

由于使用了pygame库,需要大家自行把代码贴入海龟编辑器中运行,谢谢大家

后期会更几个预置的好玩的图形

import pygame as G
import sys
import random as R

#size
window_size = 600
window_width = 700
block_size = 10

#color
WHITE = (255,255,255)
BLACK = (0,0,0)
GREY = (220,220,220)

#control
STOP = 0
MOVE = 0
GIVE = 1
delay = 50

#init
G.init()
window = G.display.set_mode([window_width, window_size])
window.fill(GREY)

#word
word = G.font.SysFont("Consolas",60)
word_喵all = G.font.SysFont("Consolas", 30)

#generation
ge_cnt = 0


#table
table = [[0 for i in range(60)] for j in range(50)]
change = [[0 for i in range(60)] for j in range(50)]

#draw
def draw():
    global GIVE
    global table
    global word
    global ge_cnt
    window.fill(GREY)
    for i in range(len(table)):
        for j in range(len(table[i])):
            if table[i][j]:
                G.draw.rect(window,BLACK,(i*block_size,j*block_size,block_size-2,block_size-2))
            else:
                G.draw.rect(window, WHITE, (i*block_size, j *block_size, block_size-2, block_size-2))
    ge_cnt_1 = str(ge_cnt % 1000//100)+str(ge_cnt %100//10)+str(ge_cnt % 10//1)
    ge_cnt_2 = str(ge_cnt % 1000000//100000)+str(ge_cnt %100000//10000)+str(ge_cnt % 10000//1000)
    generation_1 = word.render(str(ge_cnt_1), True, BLACK)
    generation_2 = word.render(str(ge_cnt_2), True, BLACK)
    generation = word_喵all.render("generation", True, BLACK)
    window.blit(generation_1, (550, 510))
    window.blit(generation_2, (550, 460))
    window.blit(generation, (520, 430))
    if GIVE:
        G.draw.rect(window,GREY,(500,0,100,100))
        BIGN = word.render("N",True,WHITE)
    else:
        G.draw.rect(window, WHITE, (500, 0, 100, 100))
        BIGN = word.render("N", True,GREY)
    window.blit(BIGN,(525,20))
#give_life
def give_life(life):
    global table
    x,y=G.mouse.get_pos()
    if x<500 and y<600:
        table[x//block_size][y//block_size]=life
#move
def move():
    global table
    global ge_cnt
    ge_cnt+=1
    for i in range(len(table)):
        for j in range(len(table[i])):
            cnt = 0
            for dx in [-1,0,1]:
                for dy in [-1,0,1]:
                    if (dx==0 and dy==0) or i+dx<0 or j+dy<0 or i+dx>=50 or j+dy>=60:
                        continue        
                    else:
                        if table[i+dx][j+dy]:
                            cnt+=1
            if table[i][j]:
                if cnt<2 or cnt>3:
                    change[i][j] = 1
            else:
                if cnt==3:
                    change[i][j] = 1
    for i in range(len(table)):
        for j in range(len(table[i])):
            table[i][j]=table[i][j]^change[i][j]
            change[i][j]=0
#clear
def clr():
    global ge_cnt
    global table
    global change
    ge_cnt = 0
    table = [[0 for i in range(60)] for j in range(50)]
    change = [[0 for i in range(60)] for j in range(50)]

#random fill
def fill(P):
    pool = [i for i in range(100)]
    global table
    for i in range(len(table)):
        for j in range(len(table[i])):
            if(R.choice(pool)<P):
                table[i][j]=1

#main
while not STOP:
    for event in G.event.get():
        if event.type == G.QUIT:
            STOP = 1
        elif event.type == G.KEYDOWN:
            if event.key == G.K_SPACE:
                MOVE = MOVE^1
            elif event.key == G.K_n:
                GIVE = GIVE^1
            elif event.key == G.K_s and not MOVE:
                move()
            elif event.key == G.K_c:
                clr()
            elif event.key == G.K_1:
                if GIVE:
                    fill(10)
                else:
                    delay = 100
            elif event.key == G.K_2:
                if GIVE:
                    fill(25)
                else:
                    delay = 50
            elif event.key == G.K_3:
                if GIVE:
                    fill(50)
                else:
                    delay = 20
        elif event.type == G.MOUSEBUTTONDOWN:
            if not MOVE:
                if GIVE:
                    give_life(1)
                else:
                    give_life(0)
    if MOVE:
        move()
    draw()
    G.display.flip()
    G.time.wait(delay)
sys.exit()


回复

上一页1 页 / 共 1下一页
QBZ_QBZ_

顶顶

点赞0


评论


QBZ_QBZ_

可以发个广告吗:https://shequ.codemao.cn/community/230932

点赞0


评论


YDSmnxYDSmnx

大佬大佬,帮顶

点赞0


评论