Python案例(一):协程实现康威生命游戏,元胞自动机

from collections import namedtuple
import os,time
import random

Query=namedtuple(‘Query‘,(‘y‘,‘x‘))
Transition=namedtuple(‘Transition‘,(‘y‘,‘x‘,‘state‘))

ALIVE="*"
EMPTY="-"

def count_neighbors(y,x):
    n_=yield Query(y+1,x+0)
    ne=yield Query(y+1,x+1)
    e_=yield Query(y+0,x+1)
    se=yield Query(y-1,x+1)
    s_=yield Query(y-1,x+0)
    sw=yield Query(y-1,x-1)
    w_=yield Query(y+0,x-1)
    nw=yield Query(y+1,x-1)

    neighbor_states=[n_,ne,e_,se,s_,sw,w_,nw]
    count=0

    for state in neighbor_states:
        if state==ALIVE:
            count+=1
    return count

def game_logic(state,neighbors):
    if state==ALIVE:
        if neighbors<2:
            return EMPTY
        elif neighbors>3:
            return EMPTY
    else:
        if neighbors==3:
            return ALIVE
    return state

def step_cell(y,x):
    state=yield Query(y,x)
    neighbors=yield from count_neighbors(y,x)
    next_state=game_logic(state,neighbors)
    yield Transition(y,x,next_state)

TICK=object()

def simulate(height,width):
    while True:
        for y in range(height):
            for x in range(width):
                #推进每个格子的演化
                yield from step_cell(y,x)
        yield TICK

class Grid(object):
    def __init__(self,height,width):
        self.height=height
        self.width=width
        self.rows=[]
        for _ in range(self.height):
            self.rows.append([EMPTY]*self.width)

    def __str__(self):
        return "".join(["".join(row)+"\n" for row in self.rows])

    def query(self,y,x):
        return self.rows[y%self.height][x%self.width]

    def assgin(self,y,x,state):
        self.rows[y%self.height][x%self.width]=state

def live_a_generation(grid,sim):
    progeny=Grid(grid.height,grid.width)
    item=next(sim)
    while item is not TICK:
        if isinstance(item,Query):
            state=grid.query(item.y,item.x)
            item=sim.send(state)
        else:
            progeny.assgin(item.y,item.x,item.state)
            item=next(sim)
    return progeny

grid=Grid(50,50)
# grid.assgin(0,3,ALIVE)
# grid.assgin(1,5,ALIVE)
# grid.assgin(2,3,ALIVE)
# grid.assgin(2,4,ALIVE)
# grid.assgin(2,5,ALIVE)

#随机生成地图
for i in range(random.randint(20,30)):
    y=random.randint(0,49)
    x=random.randint(0,49)
    if random.randint(0,1):
        for i in range(random.randint(1,3)):
            rX=random.randint(-1,1)
            rY=random.randint(-1,1)
            grid.assgin(y+rY,x+rX,ALIVE)
    grid.assgin(y,x,ALIVE)

# class ColumnPrinter(object):
#     def __init__():

#columns=ColumnPrinter()
sim=simulate(grid.height,grid.width)
for i in range(30):
    print(str(grid))
    time.sleep(1)
    os.system(‘cls‘)
    grid=live_a_generation(grid,sim)
#print(columns)

原文地址:https://www.cnblogs.com/shitianfang/p/12616951.html

时间: 2024-10-09 18:21:45

Python案例(一):协程实现康威生命游戏,元胞自动机的相关文章

Python并发之协程

<python并发之协程>一: 单线程下实现并发,即只在一个主线程,并且cpu只有一个的情况下实现并发.(并发的本质:切换+保存状态) cpu正在运行一个任务,会在两种情况下切去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,第二种情况是该任务计算时间过长. 主线程的三种状态:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来大家都被执行的效果,如果多个程序都是纯计算任务,这种切换反而会降低效率.为此我们基于yield验证.yield本身就是一种在单线

python并发编程&amp;协程

0x01 前导 如何基于单线程来实现并发? 即只用一个主线程(可利用的cpu只有一个)情况下实现并发: 并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 1)其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多

协程及Python中的协程

阅读目录 1 协程 2 Python中如何实现协程 回到顶部 1 协程 1.1协程的概念 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.(其实并没有说明白~) 我觉得单说协程,比较抽象,如果对线程有一定了解的话,应该就比较好理解了. 那么这么来理解协程比较容易: 线程是系统级别的,它们是由操作系统调度:协程是程序级别的,由程序员根据需要自己调度.我们把一个线程中的一个个函数叫做子程序,那么子程序在执行过程中可以中断去执行别的子程序:别的子程

python 并发编程 协程 目录

python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 原文地址:https://www.cnblogs.com/mingerlcm/p/11148935.html

python 并发编程 协程 gevent模块

一 gevent模块 gevent应用场景: 单线程下,多个任务,io密集型程序 安装 pip3 install gevent Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程. Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度. gevent可以检测io,实现遇到io自动切换另外一个任务 #用法 g1=gevent.spawn(func,1,

Python与Golang协程异同

背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 进程和线程的关系: 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. CPU的最小调度单元是线程不是进程,所以单进程多线程也可以利用多核CPU. 协程的定义: 协

LeetCode:Game of Life - 康威生命游戏

1.题目名称 Game of Life(康威生命游戏) 2.题目地址 https://leetcode.com/problems/game-of-life 3.题目内容 英文: According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conw

关于康威生命游戏的学习

 康威生命游戏,又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.它最初于1970年10月在<科学美国人>杂志上马丁·葛登能的"数学游戏"专栏出现. 一个偶然机会发现了这个美妙的生命游戏.于是开始写程序来实现它,其实实现是很简单的,我现在还只能做到这个而已,不过还会继续深究下去的.先用Random来生成随机数,这样就可以在初始的时候在随机位置设定生死细胞了.输出的时候用2个for循环就是了.昨天做的时候遇到的问题是不知道最后该怎么判断了,因为判断

元胞自动机+生命游戏

元胞自动机 元胞自动机(Cellular Automaton,复数为Cellular Automata,简称CA,也有人译为细胞自动机.点格自动机.分子自动机或单元自动机).是一时间和空间都离散的动力系统.散布在规则格网 (Lattice Grid)中的每一元胞(Cell)取有限的离散状态,遵循同样的作用规则,依据确定的局部规则作同步更新.大量元胞通过简单的相互作用而构成动态系统的演化. 不同于一般的动力学模型,元胞自动机不是由严格定义的物理方程或函数确定,而是用一系列模型构造的规则构成.凡是满