c# 实现康威生命游戏(细胞自动机)的示例

规则(来自百度百科,康威生命游戏词条)

游戏开始时,每个细胞随机地设定为“生”或“死”之一的某个状态。然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图。
应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律。为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律;再进一步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中。
也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定。作了这些限制后,仍然还有很多方法来规定“生存定律”的具体细节。例如,在康威的生命游戏中,规定了如下生存定律。
(1)当前细胞为死亡状态时,当周围有3个存活细胞时,则迭代后该细胞变成存活状态(模拟繁殖);若原先为生,则保持不变。
(2)当前细胞为存活状态时,当周围的邻居细胞低于两个(不包含两个)存活时,该细胞变成死亡状态(模拟生命数量稀少)。
(3)当前细胞为存活状态时,当周围有两个或3个存活细胞时,该细胞保持原样。
(4)当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态(模拟生命数量过多)。

控制台实现的关键接口

设置控制台游标的函数:public static void SetCursorPosition (int left, int top); 其中left参数是列,top参数是行。

设置控制台背景色的属性:public static ConsoleColor BackgroundColor { get; set; } 黑色用来表示生存的细胞,白色用来表示死亡的细胞。

代码实现

using System;
using System.Threading;

namespace CellularAutomata
{
 class Program
 {
  private static int gridRowCol = 32;
  private static Cell[,] grid = new Cell[gridRowCol, gridRowCol];
  private static int sleepMs = 33;
  private static int initAlivePossibility = 4; // 4 means 1/4

  static void Main(string[] args)
  {
   try
   {
    Init();
    // Main loop
    while (true)
    {
     Update();
     Thread.Sleep(sleepMs);
    }
   }
   catch (Exception e)
   {
    Console.WriteLine(e);
    Console.ReadKey();
   }
  }

  private static void Init()
  {
   // Set Console Size
   Console.BufferHeight = 256;
   Console.BufferWidth = 256;
   Console.WindowWidth = 256;
   Console.WindowHeight = 80;

   Random random = new Random();
   for (int i = 0; i < grid.GetLength(0); i++)
   {
    for (int j = 0; j < grid.GetLength(1); j++)
    {
     grid[i, j] = new Cell();
     int value = random.Next(0, initAlivePossibility);
     if (value == 0)
     {
      grid[i, j].Value = true;
     }
     else
     {
      grid[i, j].Value = false;
     }
    }
   }
  }

  private static void Update()
  {
   for (int i = 0; i < grid.GetLength(0); i++)
   {
    for (int j = 0; j < grid.GetLength(1); j++)
    {
     int aliveCount = NeighborAliveCount(i, j);

     if (grid[i, j].Value) // Alive
     {
      if (aliveCount < 2 || aliveCount > 3)
      {
       grid[i, j].Value = false;
      }
     }
     else // Death
     {
      if (aliveCount == 3)
      {
       grid[i, j].Value = true;
      }
     }

     if (grid[i, j].Value)
     {
      SetAlive(i, j);
     }
     else
     {

      SetDeath(i, j);
     }
    }
   }
  }

  private static int NeighborAliveCount(int i, int j)
  {
   int count = 0;
   for (int m = i - 1; m <= i + 1; m++)
   {
    for (int n = j - 1; n <= j + 1; n++)
    {
     if (m == i && n == j) continue;
     if (m < 0 || m >= grid.GetLength(0)) continue;
     if (n < 0 || n >= grid.GetLength(1)) continue;
     if (grid[m, n].Value) count++;
    }
   }

   return count;
  }

  private static void SetAlive(int i, int j)
  {
   string aliveStr = " ";
   Console.SetCursorPosition(j * aliveStr.Length, i);
   Console.BackgroundColor = ConsoleColor.Black;
   Console.Write(aliveStr);
  }

  private static void SetDeath(int i, int j)
  {
   string deathStr = " ";
   Console.SetCursorPosition(j * deathStr.Length, i);
   Console.BackgroundColor = ConsoleColor.White;
   Console.Write(deathStr);
  }
 }

 public class Cell
 {
  public bool Value { get; set; }
 }
}

完整代码:https://github.com/jingjiangtao/CellularAutomata

Cell类是细胞类,其中有一个bool属性Value,true表示存活,false表示死亡。将细胞单独写成类而不是一个bool值是为了后续可能的扩展。

grid变量是一个二维数组,代表格子,大小可以通过gridRowCol设置,默认32,不宜太大。

sleepMs变量是循环之间的间隔时间,单位是毫秒,默认33ms.

initAlivePossibility变量决定格子中的细胞初始化时存活的概率,计算方式为 1/initAlivePossibility,如initAlivePossibility=4,表示初始化时每个细胞的存活概率是1/4.

Main()函数中先初始化了格子中的细胞和控制台大小。设置控制台大小这一步可能会抛出越界异常,如果出现的话需要修改这个值。 接着是主循环,每次循环的间隔是sleepMs。

Update()就是实现规则的函数。

NeighborAliveCount()函数获取指定细胞的相邻细胞存活数。

SetAlive()函数和SetDeath()函数设置控制台上的显示。

如有错误,欢迎指正,谢谢!

以上就是c# 实现康威生命游戏(细胞自动机)的示例的详细内容,更多关于c# 实现康威生命游戏的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解Python 实现元胞自动机中的生命游戏(Game of life)

    简介 细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的.所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有NN个格子.而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色.每一个格子旁边都有邻居格子存在,如果我们把33的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子. 每个格子的生死遵循下面的原则: 1. 如果一个细胞周围有3个细胞

  • python实现生命游戏的示例代码(Game of Life)

    生命游戏的算法就不多解释了,百度一下介绍随处可见. 因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用numpy,使用起来学习成本比较高,所以闲暇之余写一个不用外部依赖库,console输出的版本. # -*- coding: utf-8 -*- from time import sleep from copy import deepcopy WORLD_HIGH = 20 #世界长度 WORLD_WIDE = 40 #世界宽度 ALIVE_CON = 3 #复

  • C语言借助EasyX实现的生命游戏源码

    本文讲述C语言借助EasyX实现的生命游戏,具体操作流程如下: 1.生命游戏内容: 该游戏包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的细胞的数量.如果一个细胞周围的活细胞数量多于 3 个,这个细胞会因为资源匮乏而在下一个时刻死去:如果一个位置周围有 3 个活细胞,则该位置在下一个时刻将诞生一个新的细胞:如果一个位置周围有 2 个活细胞,则该位置的细胞生死状态保持不变:如果一个细胞周围的活细胞少于 2 个,那么这个细胞会

  • Python生命游戏实现原理及过程解析(附源代码)

    1. 生命游戏是什么 生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量.如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去:相反,如果周围活细胞过少,这个细胞会因太孤单而死去. 规则看起来很简单,但却能演绎出无穷无尽的内容. 滑翔者:每4个回合"它"会向右下角走一格.虽然细胞早就是不同的细胞了,但它能保持原

  • c# 实现康威生命游戏(细胞自动机)的示例

    规则(来自百度百科,康威生命游戏词条) 游戏开始时,每个细胞随机地设定为"生"或"死"之一的某个状态.然后,根据某种规则,计算出下一代每个细胞的状态,画出下一代细胞的生死分布图. 应该规定什么样的迭代规则呢?需要一个简单的,但又反映生命之间既协同又竞争的生存定律.为简单起见,最基本的考虑是假设每一个细胞都遵循完全一样的生存定律:再进一步,把细胞之间的相互影响只限制在最靠近该细胞的8个邻居中. 也就是说,每个细胞迭代后的状态由该细胞及周围8个细胞状态所决定.作了这些限

  • Python实战之实现康威生命游戏

    前言 康威生命游戏设计并不难,我的思路就是借助pygame进行外观的展示,最近一段时间的游戏项目都是使用pygame进行的,做起来比较顺利.内部代码的实现也比较简单根据他的规则我们需要的是多次的计算和判断,再刷新数组. 一.康威生命游戏规则 当周围仅有1个或没有存活细胞时, 原来的存活细胞进入死亡状态.(模拟生命数量稀少)当周围有2个或3个存活细胞时, 网格保持原样.当周围有4个及以上存活细胞时,原来的存活细胞亦进入死亡状态.(模拟生命数量过多)当周围有3个存活细胞时,空白网格变成存活细胞.(模

  • 使用Rust制作康威生命游戏的实现代码

    目录 前言 安装准备 初始项目 Cargo.toml 初始web项目 游戏规则 游戏设计 Rust实现 测试 调试 前言 之前学了几遍,后来忘记了,通过制作该游戏再复习复习. 安装准备 wasm-pack : https://rustwasm.github.io/wasm-pack/installer/ cargo-generate: cargo install cargo-generate 初始项目 初始rust项目 使用wasm的项目模板: cargo generate --git http

  • Python实现生命游戏的示例代码(tkinter版)

    目录 生命游戏(Game of Life) 游戏概述 生存定律 图形结构 代码实现 运行界面 使用简介 后续改进 生命游戏(Game of Life) 由剑桥大学约翰·何顿·康威设计的计算机程序.美国趣味数学大师马丁·加德纳(Martin Gardner,1914-2010)通过<科学美国人>杂志,将康威的生命游戏介绍给学术界之外的广大渎者,一时吸引了各行各业一大批人的兴趣,这时细胞自动机课题才吸引了科学家的注意. 游戏概述 用一个二维表格表示“生存空间”,空间的每个方格中都可放置一个生命细胞

  • JavaScript 实现生命游戏

    目录 概念介绍 逻辑规则 完整代码 主要实现 概念介绍 元胞自动机(Cellular Automata),是 20 世纪 50 年代初由计算机之父冯·诺依曼(John von Neumann)为了模拟生命系统所具有的自复制功能而提出来的. 生命游戏(Game of Life),或者叫它的全称 John Conway's Game of Life,是英国数学家约翰·康威在 1970 年代所发明的一种元胞自动机. 逻辑规则 在二维平面方格里,每个细胞有两种状态:存活或死亡,而下一时刻的状态完全受它周

  • 使用vue3重构拼图游戏的实现示例

    前言 花了两天时间,重构了项目中的一个拼图小游戏(又名数字华容道),为了方便使用抽离成了独立组件,效果如下: 线上体验 源码地址在文章最后哦! 主要重构点 原有拼图游戏是通过开源代码加以改造,使用的是 vue2 .在实际项目使用一切正常,但还是存在以下痛点 源代码臃肿,暴露的配置项不足,特备是和项目现有逻辑结合时体现的更加明显 生成的游戏可能出现无解情况,为了避免无解,只好写死几种情况然后随机生成 源代码是vue2版本,不支持vue3 最后决定使用 vue3 重新实现拼图游戏,着重注意以下细节

随机推荐