Unity3d实现生命游戏(game Of Life)
2017-09-25 16:54
555 查看
直接上代码:
**生命游戏
生命游戏(game of life)为1970年由英国数学家J. H. Conway所提出,某一细胞的邻居包括上、下、左、右、左上、左下、右上与右下相邻之细胞。
规则
生命游戏中,对于任意细胞,规则如下:
每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。(如图,黑色为存活,白色为死亡)
当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
当前细胞为存活状态时,当周围低于2个(不包含2个)存活细胞时, 该细胞变成死亡状态。(模拟人口稀少)
当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟过度拥挤)**
`
**生命游戏
生命游戏(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) 4000 { 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; }`
相关文章推荐
- 康威生命游戏(Conway's Game of Life)的一种实现
- 生命游戏/Game of Life的Java实现(转)
- python实现生命游戏的示例代码(Game of Life)
- 详解Python 实现元胞自动机中的生命游戏(Game of life)
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
- 在Unity3D的网络游戏中实现资源动态加载
- Unity3D实现动态加载游戏资源
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
- (Java) LeetCode 289. Game of Life —— 生命游戏
- [LeetCode] 289. Game of Life 生命游戏
- Unity3D实现动态加载游戏资源
- Unity3D中关于游戏摇杆的实现方法
- unity3d 中实现猜拳游戏
- [unity基础教程]Unity3D实现动态加载游戏资源(转)
- Unity3D 游戏引擎之实现平面多点触摸(二)
- [Unity3D]手机3D游戏开发:如何实现最高分的存储与显示(五)----使用TextField 输入并调整排名
- [Unity3D]手机3D游戏开发:如何实现最高分的存储与显示(六)----实现文字闪烁效果
- 【转】【UNITY3D 游戏开发之四】有关实现2D帧序列帧播放相关—Animating Tiledtexture
- LeetCode 289. Game of Life(生命游戏)
- 在Unity3D的网络游戏中实现资源动态加载