# 生命游戏 **Repository Path**: xujiaming621/GameofLife ## Basic Information - **Project Name**: 生命游戏 - **Description**: 用java实现生命游戏 - **Primary Language**: Java - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2020-11-11 - **Last Updated**: 2023-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##version 1.2 * 本程序是一个经典的生命游戏; * 生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。 * 具体规则如下: 1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。 2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变; 3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变) * 在程序中,使用0代表死,1代表生。 编写一个基于控制台应用程序的生命游戏(可以没有界面),但必须读取指定格式的输入文件、输出指定格式的输出文件。 在目前version1.2中,基本完成了题目要求,但一些变量封装和文件读取操作处理得不是很好,将在1.3版本或加入并行的版本中优化。 ##version2.0 * 文件读取的方式有点累赘;Main和Utils重复 * 并行化:任务分解,数据分解 * 任务分解是把生作为一个线程,把死作为一个线程,把不变作为一个线程,处理完成后整合成新棋盘; * 数据分解是把棋盘分割,暂定分割为2块,2块实现了,再多块也一样,注意每次n/2,因为for循环的0~n/2; * 优先实现数据分解; * 生命周期转变函数在v1.0是直接遍历整个map,若分割,可以选择传入参数,把参数作为这部分map的 的大小,Utils的遍历map是在第一次给空map赋值,包括写入output文件,所以不划分; size -> x,y * 在Main函数new出两个线程,一个去跑for [0,size/2),另一个跑for [size/2,size) * 在读取in.txt文件时比较慢,原因是遍历了多次String,多次在内存优先分配空间,性能差。可改用StringBuffer。 * 程序用继承Thread类的方法创建两个子线程来执行,反复创建线程,目前尚能执行,缺点: 1. 反复占用内存,降低性能; 2. 显式创建线程有点落后了,尽量更改为线程池。 * 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 * 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。 * 如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。 * 运行完提示The IDE is running low on memory and this might affect performance. Please consider increasing available heap. * IDE的内存不足,这可能会影响性能。请考虑增加可用堆。