模拟一下细胞的繁殖

原贴地址 原帖:

1. 如果一个细胞只有0或1个邻居,它将因为孤独而死;
2. 如果一个细胞有4到8个邻居,它将因为拥挤而死;
3. 如果一个细胞恰有2或者3个邻居,它将继续生存下去;
4. 如果一个空格子恰有3个邻居,将“生”出一个新细胞;
5. 其他的空格子继续维持原状。

提示:

细胞,可以用对象来存储, 属性是: 编号随机不重复,死,活,邻居数量,邻居集合
( 用链表来存放其他细胞集合) 开始输入随机个细胞和邻居随机组合,然后每1秒一个周期,演示发展结果

我的实现:

Code
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

namespace ArtificialLife
{
    public partial class FormMain : Form
    {
        int[,] Cells; //状态(1生,0死)
        int[,] CellCounts; //周边细胞数量(最大8个)
        int[,] Temp; //缓冲(切换生死状态)
        Bitmap memBitmap; //画布
        Random rand = new Random((int)DateTime.Now.Ticks); 
        System.Windows.Forms.Timer updateTimer;
        public FormMain()
        {
            InitializeComponent();
            //宽高
            Width = 320; 
            Height = 240;
            memBitmap = new Bitmap(Width, Height);
            Cells = new int[memBitmap.Width, memBitmap.Height];
            CellCounts = new int[memBitmap.Width, memBitmap.Height];
            //初始化,随机决定
            for (var x = 0; x < memBitmap.Width; x++)
                for (var y = 0; y < memBitmap.Height; y++)
                    Cells[x, y] = rand.Next(memBitmap.Width) % 3 == 0 ? 1 : 0;
            Temp = (int[,])Cells.Clone();
            updateTimer = new Timer();
            updateTimer.Tick += new EventHandler(updateTimer_Tick);
            updateTimer.Interval = 1000;
            updateTimer.Start();
        }

void updateTimer_Tick(object sender, EventArgs e)
        {
            DoCalc();
            DoDraw();
        }

private void DoCalc()
        {
          /*
           1. 如果一个细胞只有0或1个邻居,它将因为孤独而死; 
            2. 如果一个细胞有4到8个邻居,它将因为拥挤而死; 
            3. 如果一个细胞恰有2或者3个邻居,它将继续生存下去; 
            4. 如果一个空格子恰有3个邻居,将“生”出一个新细胞; 
            */
           int nCount = 0;//用以统计每个细胞周围的细胞个数
            for (var x = 0; x < memBitmap.Width; x++)
                for (var y = 0; y < memBitmap.Height; y++)
                {
                    //每个细胞的前后左右八个方向的
                    nCount = 0;
                    if (x > 0) nCount += Cells[x - 1, y];
                    if (x > 0 && y > 0) nCount += Cells[x - 1, y - 1];
                    if (x < memBitmap.Width - 1 && y < memBitmap.Height - 1) nCount += Cells[x + 1, y + 1];
                    if (y > 0) nCount += Cells[x, y - 1];
                    if (y > 0 && x < memBitmap.Width - 1) nCount += Cells[x + 1, y - 1];
                    if (x > 0 && y < memBitmap.Height - 1) nCount += Cells[x - 1, y + 1];
                    if (x < memBitmap.Width - 1) nCount += Cells[x + 1, y];
                    if (y < memBitmap.Height - 1) nCount += Cells[x, y + 1];
                    CellCounts[x, y] = nCount; //放入计数器
                    if (nCount < 2 || nCount > 3)//决定生死
                        Temp[x, y] = 0;
                    if (nCount == 3)
                        Temp[x, y] = 1;
                }
            for (var x = 0; x < memBitmap.Width; x++)
                for (var y = 0; y < memBitmap.Height; y++)
                    Cells[x, y] = Temp[x, y];
        }

protected override void OnPaint(PaintEventArgs e)
        {
            DoDraw();
        }

private void DoDraw()
        {
            //开启编译选项 unsafe+
            BitmapData bmData = memBitmap.LockBits(new Rectangle(0, 0, memBitmap.Width, memBitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int stride = bmData.Stride;
            IntPtr Scan0 = bmData.Scan0;
            unsafe
            {
                byte* p = (byte*)(void*)Scan0;
                int nOffset = stride - memBitmap.Width * 3;
                for (int y = 0; y < memBitmap.Height; ++y)
                {
                    for (int x = 0; x < memBitmap.Width; ++x)
                    {
                        //blue = p[0];
                        //green = p[1];
                        //red = p[2];
                        //当周边细胞数越多则颜色越亮
                        p[0] = p[1] = p[2] = (byte)Math.Max(Math.Min(CellCounts[x, y] * 30, 255), 0);
                        if (Cells[x, y] == 1) p[0] = 255; //生存的细胞
                        p += 3;
                    }
                    p += nOffset;
                }
            }
            memBitmap.UnlockBits(bmData);
            Graphics g = this.CreateGraphics();
            g.DrawImage(memBitmap, ClientRectangle);
            g.Dispose();
        }

}
}

只所以用数组,是为了简单和执行效率;运行效果如图:

局部放大效果

源码(visual studio 2008 项目工程)

ArtificialLife.rar

出处:http://www.cnblogs.com/Chinasf/archive/2008/11/26/1341399.html

时间: 2024-08-01 05:17:02

模拟一下细胞的繁殖的相关文章

NOIP模拟题——细胞分裂

[问题描述]小 A 养了一大坨细胞. 最初小 A 只有 1 个细胞.每秒,小 A 的每个细胞都会分裂成 2 个细胞. 已知:现在离“最初”已经过去了x秒,那么现在的细胞数当然是可以计算的. 小 A 想知道的当然不是当前的细胞数.小 A 知道他养的细胞的习性:每 y 个细胞会聚成一团.经常会有剩下的细胞,那么我们称这些细胞是孤独的. 小 A 想知道的就是孤独的细胞个数.[输入文件]输入文件为 cell.in. 输入文件共一行,为两个整数 xy,以空格隔开.[输出文件]输出文件为 cell.out.

抗生素快速查找

单词 Amoxicillin  [?,mɑks?'s?l?n]阿莫西林 阿莫西林,又名安莫西林或安默西林,是一种最常用的青霉素类广谱β-内酰胺类抗生素,为一种白色粉末,半衰期约为61.3分钟.在酸性条件下稳定,胃肠道吸收率达90%.阿莫西林杀菌作用强,穿透细胞膜的能力也强.是目前应用较为广泛的口服青霉素之一,其制剂有胶囊.片剂.颗粒剂.分散片等等. Cephalosporins [sef?l??s'p?:r?nz] 头孢 头孢菌素类(Cephalosporins)是由冠头孢菌培养液中分离的头孢菌

Houdini 中 Gray Scott Reaction-Diffusion算法的实现

这篇文章是吧很久以前学的一个神奇算法归一下档,在公交车上突然想起来了,觉得还是很有必要再仔细梳理一遍,对以后也许有用. 先看图再说话: Gray Scott Reaction-Diffusion算法, 在模拟微观细胞的运动或者类似的效果是非常神奇. 理论链接:http://www.karlsims.com/rd.html 原理:模拟两种物质之间在平面(暂时是平面)上的相互作用,动作分为反应与扩散. 公式: 右手边第一项为扩散,第二项为反应,第三项是供给,DA与DB为分散率,▽2A或B为相邻位置扩

“恶意软件”会产生危害的危害

因为互联网技术的快速发展,恶意软件现在越来越多,让我们防不胜防.关注信息安全的本安全网下面为大家分享下恶意软件特征相关的安全知识,希望大家在使用电脑手机过程中多留意,以防受到恶意软件的攻击.安全卫士提醒用户,要堤防以下几种恶意软件: 1.病毒 病毒是一种恶意软件,它能自我复制,并感染其他文件,就像生物学上的病毒那样,病毒先感染细胞,然后利用这些细胞不断繁殖. 病毒能做许多事情.例如它能隐藏自己,窃取密码,强制弹出广告,使电脑重启.光有这些还不足以称之为病毒.病毒之所以称为病毒是因为他们的繁殖能力

抗生素药物汇总

抗细菌药(英语:antibacterial)也称为“抗细菌剂”,是一类用于抑制细菌生长或杀死细菌的药物.[1]在不引起歧义的情况下,抗细菌药也可简称为“抗菌药”. 抗生素(英语:antibiotic) 由微生物(包括细菌.真菌.放线菌属)所产生的具有抑制其它类微生物生长.生存的一类次级代谢产物,以及用化学方法合成或半合成的类似化合物.在定义上是一较广的概念,包括抗细菌抗生素.抗真菌抗生素以及对付其他微小病原之抗生素:但临床实务中,抗生素常常是指抗细菌抗生素. 目录 [隐藏] 1 用途 2 制造方

神经网络(1)

神经网络(Neural Network)是一种模仿生物神经网络构造的数学模型.很多文章喜欢从生物的神经元结构方面入手,展开对人工神经网络的介绍.但那样会引入更多意味不明的单词,比如突触,树突,轴突……所以这里并不会深入的介绍生物的神经网络是怎么工作的,只会说明为什么人工神经网络要构造成这样.本文按照时间顺序依次介绍神经网络中的几个重要概念,并在当中穿插一些思考,大致分为以下几个部分: MP神经元 感知机 多层前馈神经网络 误差逆传播算法(BP算法) 总结 1. MP神经元 MP神经元是神经网络的

编程模拟自然(九):元胞自动机

序 旧书有云:发鸠之山,其上多柘木.有鸟焉,其状如乌,文首.白喙.赤足,名曰精卫,其鸣自詨. 一日,精卫游于码海,溺而不返,后常衔西山之木石,以堙于海.有诗为证: 万事有不平,尔何空自苦: 长将一寸身,衔木到终古? 我愿平码海,身沉心不改: 码海无平期,我心无绝时. 呜呼!君不见,西山衔木众鸟多,鹊来燕去自成窠! (前情提要:主角元乘坐返回舱降落到了码海上,随后遇到了个鸟人...) “咳咳,远道的客人,我名精卫XIV,乃是先祖精卫鸟的第十四代后裔...”鸟人作自我介绍 “...你是谁,从哪里来又

【模拟】 兔农

免农 CH Round #54 - Streaming #5 (NOIP模拟赛Day1) 描述 (如果你想更好地理解本题,请先阅读NOI2011第一试“兔农”一题)萌蛋近年收入不景气,正在她发愁如何能多赚点钱时,她听到隔壁的小朋友在讨论免子繁殖的问题.(注:免子是一种简单的单细胞生物)问题是这样的:时刻0有2只刚出生的免子.每一时刻,每只免子都会分裂成为2只免子.问时刻n共有多少只免子?聪明的你可能已经发现,时刻n的免子数正好是第n+1个2的幂次.萌蛋不懂什么叫幂,但她也发现了规律:时刻n+1的

组装细胞

组装细胞,实际上就是要人工组装生命.因为大多数科学家将生命定义为一个可以独立于其他细胞而生存.生长和复制的细胞. 中文名 实际上就是 要人工组装生命 1990年 发现人体生殖道支原体 1995年 文特尔对其的基因组成进行了测序 1990年,科学家发现人体生殖道支原体可能是最小.最简单的细胞.1995年,美国科学家文特尔(C.Venter)领导的研究小组,对这种支原体的基因组成进行了测序,发现它仅有480个基因.如果在480个基因中辨认出细胞生活必不可少的“基本基因”,那么就有希望人工合成这些基因