直接上代码:
**生命游戏
生命游戏(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;
}`