`
metaphy
  • 浏览: 344717 次
  • 性别: Icon_minigender_1
  • 来自: 大西洋底
社区版块
存档分类
最新评论

有趣的“生命游戏”

 
阅读更多
“生命游戏”
本世纪70年代,人们曾疯魔一种被称作“生命游戏”的小游戏,这种游戏相当简单。假设有一个像棋盘一样的方格网,每个方格中放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。游戏规则如下:
1、如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生,即该细胞若原先为死,则转为生,若原先为生,则保持不变;
2、如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
3、在其它情况下,该细胞为死,即该细胞若原先为生,则转为死,若原先为死,则保持不变。
依此规则进行迭代变化,使细胞生生死死,会得到一些有趣的结果。该游戏之所以被称为“生命游戏”,是因为其简单的游戏规则,反映了自然界中的生存规律:如果一个生命,其周围的同类生命太少的话,会因为得不到帮助而死亡;如果太多,则会因为得不到足够的资源而死亡。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Random;

public class LifeGame {
	// Sample file name
	private static final String SAMPLE_FILE_NAME = "c:/lifegame_data.txt";
	// random
	private static final Random RAND = new Random();
	//Area width and height 
	private int width , height; 
	//Area
	private boolean area[][];
	
	public LifeGame() {} 
	
	/**
	 * init an area with random state of perc/total lives 
	 * 
	 * @param width
	 * @param height
	 * @param perc
	 * @param total
	 */
	public void load (int width, int height, int perc, int total) {
		if (width < 1 || height < 1 || perc < 0 || total < 1 || perc > total)
			throw new IllegalArgumentException ();
		
		this.width = width;
		this.height = height;
		area = new boolean[height][width];
		
		for (int h = 0 ; h < height; h++) {
			for (int w = 0; w < width; w++){
				area[h][w] = randLive(perc, total); 
			}
		}
	}
	
	/**
	 * init an area with around 1/3 lives
	 * @param width
	 * @param height
	 */
	public void load (int width, int height){
		load (width, height, 1, 3) ;
	}
	
	/**
	 * Random live 
	 * @return
	 */
	private boolean randLive(int perc, int total) {
		int r = RAND.nextInt(total); 
		return perc > r;  
	}
	
	
	/**
	 * Init the Life game with a file, for example 
			1 0 1 0 0 0 0 0
			0 0 0 0 0 0 0 1
			1 0 0 0 0 0 1 0
			0 0 0 1 0 0 0 0 
			0 0 0 0 0 0 0 1 
			0 0 0 0 1 1 1 1 
			0 0 0 0 0 0 0 1 
			0 0 0 0 0 0 0 0 
	 * @param file
	 */
	public void load (File file){
		try {
			BufferedReader in = new BufferedReader (new FileReader(file));
			String line = null;
			
			while ((line = in.readLine())!=null && !(line = line.trim()).equals("")) {
				height ++;
				String[] data = line.split("\\s");
				if (height == 1) {
					width = data.length;
				}
			}
			area= new boolean[height][width];
			in.close();
			
			in = new BufferedReader (new FileReader(file));
			line = null;
			int h = -1; 
			while ((line = in.readLine())!=null && !(line = line.trim()).equals("")) {
				h++;
				String[] data = line.split("\\s");
				for (int w =0; w <data.length; w++){
					if (data[w].trim().equals("1")){
						area[h][w] = true;
					}
				}
			}
			in.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Generation
	 */
	public void generation(int gen) {
		if (gen < 1) throw new IllegalArgumentException();
		
		for (int g = 0 ; g < gen ; g++){
			boolean [][] newarea = new boolean[height][width];
			for (int h =0; h<height; h++) {
				for (int w = 0 ; w < width; w++){
					int lives = 0; 

					if (h-1 >=0 && w-1>=0 && area[h-1][w-1]) lives ++; 
					if (h-1 >= 0 && area[h-1][w]) lives ++;
					if (h-1 >= 0 && w+1 < width && area[h-1][w+1]) lives ++;
					if (w-1 >= 0 && area[h][w-1]) lives ++; 
					if (w+1 < width && area[h][w+1])  lives ++;						
					if (w-1 >= 0 && h+1 < height && area[h+1][w-1]) lives ++; 
					if (h+1 < height && area[h+1][w])  lives ++;						
					if (w+1 < width && h+1 < height && area[h+1][w+1])  lives ++;	
					
					if (lives == 3) {
						newarea[h][w] = true;
					} else 	if (lives == 2) {
						newarea[h][w] = area[h][w];
					} else {
						newarea[h][w] = false;
					}
				}
			}
			area = newarea; 
			
			// print the new state after each 1 generation
			System.out.println ("Generation: "+ (g+1));
			print();
		}
		
	}
	
	/**
	 * Generation, default for 1 time
	 */
	public void generation() {
		generation (1);
	}
	
	/**
	 * Print 
	 */
	public void print() {
		int lives = 0 ;
		for (int h = 0; h < height; h++){
			for (int w = 0; w < width; w ++){
				if (area[h][w]){
					lives ++ ;
					System.out.print("● ");
				} else {
					System.out.print("○ ");
				}
			}
			System.out.println("");
		}
		System.out.println("Lives = " + lives + ", total = " + height * width  );
		System.out.println ("------------------------");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		LifeGame lifegame = new LifeGame();
		
		lifegame.load (10, 10); 
		lifegame.print(); 	// print the original state  
		lifegame.generation(6);
	}
}



某一次的output
● ○ ○ ○ ● ○ ○ ● ○ ○ 
○ ○ ○ ○ ○ ● ● ○ ○ ○ 
● ○ ○ ○ ● ○ ○ ○ ● ○ 
● ● ● ● ○ ● ○ ● ● ● 
● ○ ○ ○ ● ○ ● ○ ● ○ 
○ ○ ● ○ ○ ○ ○ ● ○ ● 
○ ○ ○ ● ○ ○ ● ● ● ○ 
○ ○ ○ ● ● ○ ○ ● ○ ● 
● ○ ○ ○ ● ○ ● ● ○ ○ 
○ ○ ○ ● ○ ○ ○ ○ ○ ○ 
Lives = 36, total = 100
------------------------
Generation: 1
○ ○ ○ ○ ○ ● ● ○ ○ ○ 
○ ○ ○ ○ ● ● ● ● ○ ○ 
● ○ ● ● ● ○ ○ ○ ● ● 
● ○ ● ● ○ ● ● ○ ○ ● 
● ○ ○ ○ ● ● ● ○ ○ ○ 
○ ○ ○ ● ○ ● ○ ○ ○ ● 
○ ○ ● ● ● ○ ● ○ ○ ● 
○ ○ ○ ● ● ○ ○ ○ ○ ○ 
○ ○ ○ ○ ● ● ● ● ● ○ 
○ ○ ○ ○ ○ ○ ○ ○ ○ ○ 
Lives = 37, total = 100
------------------------
Generation: 2
○ ○ ○ ○ ● ○ ○ ● ○ ○ 
○ ○ ○ ○ ○ ○ ○ ● ● ○ 
○ ○ ● ○ ○ ○ ○ ○ ● ● 
● ○ ● ○ ○ ○ ● ● ● ● 
○ ● ● ○ ○ ○ ○ ○ ○ ○ 
○ ○ ● ○ ○ ○ ○ ○ ○ ○ 
○ ○ ● ○ ○ ○ ○ ○ ○ ○ 
○ ○ ● ○ ○ ○ ○ ○ ● ○ 
○ ○ ○ ● ● ● ● ● ○ ○ 
○ ○ ○ ○ ○ ● ● ● ○ ○ 
Lives = 27, total = 100
------------------------
Generation: 3
○ ○ ○ ○ ○ ○ ○ ● ● ○ 
○ ○ ○ ○ ○ ○ ○ ● ○ ● 
○ ● ○ ○ ○ ○ ● ○ ○ ○ 
○ ○ ● ● ○ ○ ○ ● ○ ● 
○ ○ ● ● ○ ○ ○ ● ● ○ 
○ ○ ● ● ○ ○ ○ ○ ○ ○ 
○ ● ● ● ○ ○ ○ ○ ○ ○ 
○ ○ ● ○ ● ● ● ● ○ ○ 
○ ○ ○ ● ● ○ ○ ○ ● ○ 
○ ○ ○ ○ ○ ○ ○ ● ○ ○ 
Lives = 28, total = 100
------------------------
Generation: 4
○ ○ ○ ○ ○ ○ ○ ● ● ○ 
○ ○ ○ ○ ○ ○ ● ● ○ ○ 
○ ○ ● ○ ○ ○ ● ● ○ ○ 
○ ● ○ ● ○ ○ ● ● ○ ○ 
○ ● ○ ○ ● ○ ○ ● ● ○ 
○ ○ ○ ○ ● ○ ○ ○ ○ ○ 
○ ● ○ ○ ○ ● ● ○ ○ ○ 
○ ● ○ ○ ○ ● ● ● ○ ○ 
○ ○ ○ ● ● ○ ○ ○ ● ○ 
○ ○ ○ ○ ○ ○ ○ ○ ○ ○ 
Lives = 26, total = 100
------------------------
Generation: 5
○ ○ ○ ○ ○ ○ ● ● ● ○ 
○ ○ ○ ○ ○ ○ ○ ○ ○ ○ 
○ ○ ● ○ ○ ● ○ ○ ● ○ 
○ ● ○ ● ○ ● ○ ○ ○ ○ 
○ ○ ● ● ● ● ● ● ● ○ 
○ ○ ○ ○ ● ○ ● ● ○ ○ 
○ ○ ○ ○ ● ○ ○ ● ○ ○ 
○ ○ ● ○ ○ ○ ○ ● ○ ○ 
○ ○ ○ ○ ● ● ● ● ○ ○ 
○ ○ ○ ○ ○ ○ ○ ○ ○ ○ 
Lives = 27, total = 100
------------------------
Generation: 6
○ ○ ○ ○ ○ ○ ○ ● ○ ○ 
○ ○ ○ ○ ○ ○ ● ○ ● ○ 
○ ○ ● ○ ● ○ ○ ○ ○ ○ 
○ ● ○ ○ ○ ○ ○ ○ ● ○ 
○ ○ ● ○ ○ ○ ○ ○ ● ○ 
○ ○ ○ ○ ○ ○ ○ ○ ○ ○ 
○ ○ ○ ● ○ ● ○ ● ● ○ 
○ ○ ○ ● ● ○ ○ ● ● ○ 
○ ○ ○ ○ ○ ● ● ● ○ ○ 
○ ○ ○ ○ ○ ● ● ○ ○ ○ 
Lives = 22, total = 100
------------------------
分享到:
评论

相关推荐

    生命游戏 Qt界面

    《生命游戏 Qt界面》 生命游戏,又称为Conway's Game of Life,是由英国数学家约翰·何顿·康威在1970年提出的一种细胞自动机模型,它通过简单的规则模拟复杂的生命现象,展现出丰富的动态行为。在这个游戏里,每个...

    生命游戏(golly)v3.2安装包

    约翰·康威最常被专业人士和大众拿来讨论的成果,就是他在1970年发明的生命游戏,Game of Life。它的意义在于验证了某些科学家的宇宙观,即最简单的逻辑规则能产生出复杂有趣的活动。 康威生命游戏在方格网上进行,...

    life_生命游戏_

    在`life.docx`文档中,可能包含了对生命游戏的详细解释、实现代码示例或者各种有趣的模式展示。例如,常见的模式有“滑翔者”(Glider)、“枪”(Gun)以及更复杂的“太空船”(Spaceship)等。这些模式是通过生命...

    python 生命游戏(pygame)

    6. **预设模式**:预设的模式包括了一些经典的细胞配置,如“滑翔机”、“枪”和“重炮”,它们在生命游戏中表现出各种有趣的动态行为。 7. **鼠标拖动设置**:用户可以通过鼠标在游戏窗口上选择区域并拖动来设定...

    生命游戏

    生命游戏不仅是一个有趣的数学玩具,它在计算理论、生物学、物理学等领域都有深远的影响。通过模拟,我们可以观察到类似生命演化的复杂行为,例如自复制结构和周期性模式。此外,它还启发了其他领域的研究,比如...

    3D_game of life_3d元胞自动机_三维生命游戏_gameoflife_生命游戏.zip

    总的来说,3D生命游戏不仅是一个有趣的编程挑战,也是理解自然界某些基本规律的窗口。通过理解和分析源码,你可以深入探究这个充满无限可能性的虚拟世界,也许还能从中获得关于生命、复杂性和宇宙秩序的新视角。

    life game 生命游戏代码实现

    "生命游戏"(Game of Life)是由英国数学家约翰·康威在1970年提出的一种简单的模拟生命状态的细胞自动机。...通过这种方式,生命游戏不仅是一个有趣的数学玩具,也是理解复杂系统和编程技术的宝贵工具。

    C++实现生命游戏控制台运行

    生命游戏,又称康威生命游戏,是英国数学家约翰·何顿·康威提出的一种细胞自动机模型。在这个游戏规则中,二维空间被划分为一个网格,每个格子要么是活细胞,要么是死细胞。游戏的状态通过一系列的规则进行演化,...

    C语言生命游戏

    【C语言生命游戏】是一种基于规则的简单模拟生命现象的计算模型,由数学家约翰·康威在1970年提出。游戏在一个二维网格上进行,每个网格单元代表一个细胞,可以是“生”或“死”两种状态。游戏通过以下三条规则迭代...

    C经典算法之生命游戏

    ### C经典算法之生命游戏 #### 一、生命游戏简介 生命游戏(Game of Life)是一种零玩家参与的...生命游戏不仅是一种有趣的数学玩具,还具有一定的教育意义,能够帮助人们理解复杂的系统如何从简单的规则中涌现出来。

    生命游戏 细胞自动机 源代码

    生命游戏,英文名为Conway's Game of Life,是由英国数学家约翰·何顿·康威在1970年提出的一种简单的模拟生命...如果你对计算机科学、数学或人工智能有兴趣,研究生命游戏的源代码无疑是一个有趣且富有挑战性的项目。

    生命游戏 细胞自动机 元胞自动机 Game Of Life

    《生命游戏:细胞自动机与元胞自动机的探索》 生命游戏,全称为“Game Of Life”,是由英国数学家约翰·康威(John Horton Conway)在1970年提出的一种简单的模拟生物演化的计算模型,它是细胞自动机的一个经典实例...

    细胞自动机初探之生命游戏

    **标题解析:**“细胞自动机初探之生命游戏”是指对细胞自动机这一理论进行探索,特别是聚焦于其中的经典实例——生命游戏(Conway's Game of Life)。细胞自动机是一种简单的计算模型,由一维或高维的离散网格构成...

    【老生谈算法】MATLAB实现生命游戏源码.docx

    MATLAB实现生命游戏源码详解 ...使用MATLAB实现生命游戏是一种非常有趣和实用的方法,可以帮助我们更好地理解生命游戏的规则和演化过程。同时,MATLAB的高性能和灵活性也使得它成为实现生命游戏的理想选择。

    Java实现生命游戏.zip

    "Java实现生命游戏.zip"是一个基于Java编程语言开发的项目,其核心是著名的"生命游戏",也称为康威生命游戏。这个游戏是由数学家约翰·何顿·康威在1970年提出的,它是一种零玩家游戏,规则简单却能展现出复杂的动态...

    Scratch 经典模拟游戏:康威生命游戏.sb3

    康威生命游戏是由剑桥大学约翰·何顿·康威设计的计算机程序,通过计算机仿真模拟了细胞的繁衍。 游戏开始时,细胞随机设定为“生”(黑格)或“死”(白格)两种状态,接下来细胞会“繁殖”下一代,每次“繁殖”...

    生命游戏(java).zip

    "生命游戏",又称为Conway's Game ...通过这个"生命游戏"的Java项目,我们可以学习到Java编程、图形界面设计、游戏逻辑实现、数据结构和算法运用等多个方面的知识,这不仅是一个有趣的编程练习,也是提升技能的好方式。

    c 语言实现的一些有趣游戏.zip

    "c 语言实现的一些有趣游戏.zip"这个压缩包文件很可能包含了用C语言编写的多个小型游戏源代码,其中"jueshihaojian"可能是游戏项目或者文件夹的名字,暗示着我们可能将探索一个叫做“绝世好剑”的游戏。 C语言是一...

    java开发的生命游戏.doc

    【Java开发的生命游戏】是一个基于Java编程语言实现的模拟生物进化过程的计算机程序。这个程序是根据英国数学家约翰·何顿·康威提出的“生命游戏”理论进行编写的。生命游戏是一个零玩家游戏,其核心规则设定在一个...

    生命游戏-少儿编程scratch项目源代码文件案例素材.zip

    "生命游戏"是一款著名的模拟生命现象的计算模型,由英国数学家约翰·康威在1970年提出。这个项目将"生命游戏"的概念引入到少儿编程领域,使用Scratch这种图形化编程语言,让孩子们能够通过编程来理解和探索这个奇妙...

Global site tag (gtag.js) - Google Analytics