首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > 高性能WEB开发 >

模拟一下细胞的繁殖,编程语言不限,该如何解决

2012-05-21 
模拟一下细胞的繁殖,编程语言不限1. 如果一个细胞只有0或1个邻居,它将因为孤独而死;2. 如果一个细胞有4到8

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

提示:

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


[解决办法]

C# code
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Drawing.Drawing2D;namespace ArtificialLife{    public partial class FormMain : Form    {        const int MAX_X = 50;        const int MAX_Y = 50;        int[,] Cells = new int[MAX_X, MAX_Y];        int[,] Temp = new int[MAX_X, MAX_Y];        PaintEventArgs param;        Random rand = new Random((int)DateTime.Now.Ticks);        System.Windows.Forms.Timer updateTimer;        System.Windows.Forms.Timer drawTimer;        public FormMain()        {            InitializeComponent();            param = new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle);            DoubleBuffered = true;            for (var x = 0; x < MAX_X; x++)                for (var y = 0; y < MAX_Y; y++)                {                    Cells[x, y] = rand.Next(6) % 2 == 0 ? 1 : 0;                    Temp[x, y] = Cells[x, y];                }            updateTimer = new Timer();            updateTimer.Tick += new EventHandler(updateTimer_Tick);            updateTimer.Interval = 1000;            updateTimer.Start();            drawTimer = new Timer();            drawTimer.Tick += new EventHandler(drawTimer_Tick);            drawTimer.Interval = 100;            drawTimer.Start();        }        void drawTimer_Tick(object sender, EventArgs e)        {            Invalidate();        }        void updateTimer_Tick(object sender, EventArgs e)        {            DoCalc();        }        private void DoCalc()        {            /*            1. 如果一个细胞只有0或1个邻居,它将因为孤独而死;             2. 如果一个细胞有4到8个邻居,它将因为拥挤而死;             3. 如果一个细胞恰有2或者3个邻居,它将继续生存下去;             4. 如果一个空格子恰有3个邻居,将“生”出一个新细胞;              */            int nCount = 0;//用以统计每个细胞周围的细胞个数            for (var x = 0; x < MAX_X; x++)                for (var y = 0; y < MAX_Y; y++)                {                    //每个细胞的前后左右的                    nCount = 0;                    if (x > 0) nCount += Cells[x - 1, y];                    if (y > 0) nCount += Cells[x, y - 1];                    if (x < MAX_X - 1) nCount += Cells[x + 1, y];                    if (y < MAX_Y - 1) nCount += Cells[x, y + 1];                    if (nCount < 2 || nCount > 3)                        Temp[x, y] = 0;                    if (nCount == 3)                        Temp[x, y] = 1;                }            for (var x = 0; x < MAX_X; x++)                for (var y = 0; y < MAX_Y; y++)                    Cells[x, y] = Temp[x, y];        }        protected override void OnPaint(PaintEventArgs e)        {            base.OnPaint(e);            DoDraw(param);        }        private void DoDraw(PaintEventArgs e)        {            e.Graphics.FillRectangle(Brushes.Black, e.ClipRectangle);            Rectangle cellRect = new Rectangle();            cellRect.X = 0;            cellRect.Y = 0;            cellRect.Width = e.ClipRectangle.Width / MAX_X;            cellRect.Height = e.ClipRectangle.Height / MAX_Y;            for (var x = 0; x < MAX_X; x++)                for (var y = 0; y < MAX_Y; y++)                {                    cellRect.X = cellRect.Width * x + cellRect.Width;                    cellRect.Y = cellRect.Height * y + cellRect.Height;                    e.Graphics.FillRectangle(new LinearGradientBrush(cellRect, (Cells[x, y] == 1 ? Color.Red : Color.Green), Color.White, 0f), cellRect);                }        }    }} 


[解决办法]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace ArtificialLife
{
public partial class FormMain : Form
{
const int MAX_X = 50;
const int MAX_Y = 50;
int[,] Cells = new int[MAX_X, MAX_Y];
int[,] Temp = new int[MAX_X, MAX_Y];
PaintEventArgs param;
Random rand = new Random((int)DateTime.Now.Ticks);
System.Windows.Forms.Timer updateTimer;
System.Windows.Forms.Timer drawTimer;

public FormMain()
{
InitializeComponent();
param = new PaintEventArgs(this.CreateGraphics(), this.ClientRectangle);

DoubleBuffered = true;

for (var x = 0; x < MAX_X; x++)
for (var y = 0; y < MAX_Y; y++)
{
Cells[x, y] = rand.Next(6) % 2 == 0 ? 1 : 0;
Temp[x, y] = Cells[x, y];
}

updateTimer = new Timer();
updateTimer.Tick += new EventHandler(updateTimer_Tick);
updateTimer.Interval = 1000;
updateTimer.Start();
drawTimer = new Timer();
drawTimer.Tick += new EventHandler(drawTimer_Tick);
drawTimer.Interval = 100;
drawTimer.Start();
}

void drawTimer_Tick(object sender, EventArgs e)
{
Invalidate();
}


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

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

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);

DoDraw(param);
}

private void DoDraw(PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Black, e.ClipRectangle);
Rectangle cellRect = new Rectangle();
cellRect.X = 0;
cellRect.Y = 0;
cellRect.Width = e.ClipRectangle.Width / MAX_X;
cellRect.Height = e.ClipRectangle.Height / MAX_Y;
for (var x = 0; x < MAX_X; x++)
for (var y = 0; y < MAX_Y; y++)
{
cellRect.X = cellRect.Width * x + cellRect.Width;
cellRect.Y = cellRect.Height * y + cellRect.Height;
e.Graphics.FillRectangle(new LinearGradientBrush(cellRect, (Cells[x, y] == 1 ? Color.Red : Color.Green), Color.White, 0f), cellRect);


}
}
}
}
[解决办法]
第一类,可有可无。

Java code
public class mainapp {    /**     * 1. 如果一个细胞只有0或1个邻居,它将因为孤独而死;      * 2. 如果一个细胞有4到8个邻居,它将因为拥挤而死;      * 3. 如果一个细胞恰有2或者3个邻居,它将继续生存下去;      * 4. 如果一个空格子恰有3个邻居,将“生”出一个新细胞;      * 5. 其他的空格子继续维持原状。     */    public static void main(String[] args) {        // TODO Auto-generated method stub        Cellsgroup test = new Cellsgroup();    }}
[解决办法]
以像素点为单位,并且考虑周围8个方向个体;4方向有稳定状态,8方向无最终稳定状态。优化了刷新。

http://files.cnblogs.com/Chinasf/ArtificialLife.rar

C# code
using System;using System.Drawing;using System.Drawing.Imaging;using System.Windows.Forms;namespace ArtificialLife{    public partial class FormMain : Form    {        int[,] Cells;        int[,] Temp;        Bitmap memBitmap;        Random rand = new Random((int)DateTime.Now.Ticks);        System.Windows.Forms.Timer updateTimer;        const int WIDTH = 100;        const int HEIGHT = 100;        public FormMain()        {            InitializeComponent();            DoubleBuffered = true;            memBitmap = new Bitmap(WIDTH, HEIGHT);            Cells = 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(WIDTH*HEIGHT) % 8 == 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];                    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] = 0;                        if (Cells[x, y] == 1) p[2] = 255;                        p += 3;                    }                    p += nOffset;                }            }            memBitmap.UnlockBits(bmData);            Graphics g = this.CreateGraphics();            g.DrawImage(memBitmap, ClientRectangle);            g.Dispose();        }    }} 


[解决办法]

HTML code
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><title> 模拟细胞的繁殖(CSDN-oyiboy出品) </title></head><body><div><SCRIPT Language="Javascript" type="text/javascript">var maxPoint = 80;var oneLine = 10;var map = new Array();for(var x = 0; x < maxPoint; map[x++] = false);var Calc={    iniArray:function(){        var mlen = Math.floor((Math.random() * maxPoint + maxPoint / 5) % maxPoint);        if(mlen > maxPoint) { mlen = Math.floor(maxPoint / 2); }        for(var x = 0;x < mlen;x++)        {            var nowPoint = Math.floor(Math.random() * maxPoint);                        for(var y = 0; y < maxPoint;y++)            {                if(map[nowPoint])                { nowPoint = (nowPoint + 1) % (maxPoint - 1) }                else                { map[nowPoint] = true;break; }            }        }    },    variationSatr:function(){        var newmap = new Array();        for(var x = 0;x < map.length;x++)        {            newmap[x] = Calc.setPoint(x);        }        map = newmap;        Calc.showMap();        setTimeout( "Calc.variationSatr();", 1000);    },    setPoint:function(point){        var neighbors = Calc.neighborsNumber(point);        return (map[point] && neighbors == 2) || neighbors == 3;    },    neighborsNumber:function(point){        var Neighbors = new Array();        var upCenter = point - oneLine; if(upCenter < 0) { upCenter = maxPoint - upCenter; } Neighbors[0] = upCenter;        var upRight = upCenter - 1; if( upRight < 0 ) { upRight = maxPoint - upRight; } Neighbors[1] = upRight;        var upLeft = (upCenter + 1) % maxPoint; Neighbors[2] = upLeft;        var right = point - 1; if( right < 0 ) { right = maxPoint - right; } Neighbors[3] = right;        var left = (point + 1) % maxPoint; Neighbors[4] = left;        var downCenter = (point + oneLine) % maxPoint; Neighbors[5] = downCenter;        var downRight = downCenter - 1; if( downRight < 0 ) { downRight = maxPoint - downRight; } Neighbors[6] = downRight;        var downLeft = (downCenter + 1) % maxPoint; Neighbors[7] = downLeft;        var backNumber = 0;        for(var x = 0;x < Neighbors.length; x++)        {            if(map[Neighbors[x]]){ backNumber++; }        }        return backNumber;    },    iniMap:function(){        Calc.iniArray();        var sHtml = new Array();        for(var x = 0;x < map.length;x++)        {            sHtml[x] = "<span style=\"width:11pt;margin: 1px;\" id=\"map" + x + "\">&nbsp;</span>";            if((x % oneLine) == 9) { sHtml[x]+="<br/>" }        }        document.write(sHtml.join(""));        Calc.showMap();    },    showMap:function(){        for(var x = 0;x < map.length;x++)        {            document.getElementById("map" + x).style.backgroundColor = map[x] ? "#000000" : "#999999";        }    }}Calc.iniMap();Calc.variationSatr();</SCRIPT></div></body></html> 

热点排行