Unity3d实现生命游戏(game Of Life)

直接上代码:
**生命游戏
生命游戏(game of life)为1970年由英国数学家J. H. Conway所提出,某一细胞的邻居包括上、下、左、右、左上、左下、右上与右下相邻之细胞。
规则
生命游戏中,对于任意细胞,规则如下:
每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。(如图,黑色为存活,白色为死亡)
当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟人口稀少)
当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟过度拥挤)**
`

public int mapSize = 100;//图的大小
private int[,] cellDataMap;//数据图 0=死亡 1=存活
private GameObject[,] cellObjeMap;//实物图

public GameObject cellPrefab;//细胞的预制体
public Transform createPosition;//创建图的起始点

float timer;
public float timeRate=1f;//时间间隔

private void Start()
{
    cellDataMap = new int[mapSize, mapSize];
    cellObjeMap = new GameObject[mapSize, mapSize];

    timer = 0;

    CreateMap();
}
private void Update()
{
    timer += Time.deltaTime;
    if (timer > timeRate)
    {
        UpdateMap();
        timer = 0;
    }
}




/// <summary>
/// 创建图
/// </summary>
private void CreateMap()
{
    for (int i = 0; i < mapSize; i++)
    {
        for (int j = 0; j < mapSize; j++)
        {
            cellDataMap[i, j] = Random.Range(0, 2);
            if (cellDataMap[i, j] == 1)
            {
                cellObjeMap[i, j] = Instantiate(cellPrefab, createPosition.position + new Vector3(j * 1, 0, i * 1), Quaternion.identity);
            }
        }
    }
}
/// <summary>
/// 更新图
/// </summary>
private void UpdateMap()
{
    int[,] tempMap = new int[mapSize, mapSize];
    tempMap = (int[,])cellDataMap.Clone();//克隆函数

    for (int i = 0; i < mapSize; i++)
    {
        for (int j = 0; j < mapSize; j++)
        {
            //当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
            //当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟人口稀少)
            //当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
            //当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟过度拥挤)
            int number = GetCellNumberInPos(i, j);
            if (tempMap[i, j] == 1)//存活状态
            {

                if (number < 2 || number > 3)//人口稀少和拥挤
                {
                    tempMap[i, j] = 0;
                }
            }
            else if (tempMap[i, j] == 0)//死亡状态
            {
                if (number == 3)//繁殖
                {
                    tempMap[i, j] = 1;
                }
            }
        }
    }

    ShowMap(tempMap);
}
/// <summary>
/// 显示图
/// </summary>
private void ShowMap(int[,] tempMap)
{
    for (int i = 0; i < mapSize; i++)
    {
        for (int j = 0; j < mapSize; j++)
        {
            if (tempMap[i, j] != cellDataMap[i, j])
            {
                cellDataMap[i, j] = tempMap[i, j];
                if (tempMap[i, j] == 0)
                {
                    Destroy(cellObjeMap[i, j]);
                }
                else if (tempMap[i, j] == 1)
                {
                    cellObjeMap[i, j] = Instantiate(cellPrefab, createPosition.position + new Vector3(j * 1, 0, i * 1), Quaternion.identity);
                }
            }
        }
    }
}
/// <summary>
/// 返回周围的存活的细胞的数量
/// </summary>
/// <param name="pos_y"></param>
/// <param name="pos_x"></param>
/// <returns>存货的细胞的数量</returns>
private int GetCellNumberInPos(int pos_y, int pos_x)
{
    int number = 0;
    for (int i = -1; i <= 1; i++)
    {
        for (int j = -1; j <= 1; j++)
        {
            if (pos_y + i < 0 || pos_y + i >= mapSize || pos_x + j < 0 || pos_x + j >= mapSize) continue;//细胞边界默认死亡
            if (i == 0 && j == 0) continue;//细胞本体不带入运算
            if (cellDataMap[pos_y + i, pos_x + j] == 1)
            {
                number++;
            }
        }
    }
    return number;
}`
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值