JAVA 实现生命游戏

本文介绍了生命游戏,一个基于细胞自动机的简单规则模拟系统。在这个系统中,细胞根据周围活细胞的数量遵循特定的生存或死亡规则。文章提供了不同模式如滑翔者、轻量级飞船和脉冲星的示例,并展示了一个简单的Java程序来实现生命游戏的迭代过程。通过用户输入初始化细胞布局,程序动态显示细胞状态的变化,允许用户选择是否继续演化。
该文章已生成可运行项目,

请添加图片描述

生命游戏的规则:

生命游戏中,对于任意细胞:

每个细胞有两种状态:存活或死亡。每个细胞与以自身为中心的周围八格细胞产生互动。
   1.当前细胞为存活状态时,当周围的活细胞低于2个时, 该细胞因孤独而死亡;
   2.当前细胞为存活状态时,当周围有2个或3个活细胞时, 该细胞保持原样;
   3.当前细胞为存活状态时,当周围有3个以上活细胞时,该细胞因资源匮乏而死亡;
   4.当前细胞为死亡状态时,当周围有3个活细胞时,该细胞变成存活状态(模拟繁殖)。**

①一般情形:
在这里插入图片描述
②滑翔者:每4个回合"它"会向右下角走一格。虽然细胞早就是不同的细胞了,但它能保持原本的形态:
在这里插入图片描述
③轻量级飞船:它的周期是4,每2个回合会向右边走一格:
在这里插入图片描述
④脉冲星:它的周期为3,看起来像一颗周期爆发的星星:
在这里插入图片描述

程序运行java源代码:

import java.util.Scanner;

public class lifeGame {
    static final int ROWLEN = 10, COLLEN = 10, DEAD = 0, ALIVE = 1;
    static int[][] cell = new int[ROWLEN][COLLEN];
    //定义临时二维空间数组存储变化的状态:
    static int[][] celltemp = new int[ROWLEN][COLLEN];

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("生命游戏开始: ");
        //二维空间中放置细胞初始化数量
        initCell();
        //显示初始状态
        showCell();
        //是否进行下一次演化
        String flag;
        do {
            //开始生命游戏
            startCell();
            System.out.println("是否进行下一次演化: y/n");
            flag = input.next();
            showCell();
        } while (flag.equalsIgnoreCase("y"));


    }


    private static void initCell() {
        int row, col;
        Scanner input = new Scanner(System.in);
        for (row = 0; row < 10; row++) {
            for (col = 0; col < 10; col++) {
                cell[row][col] = DEAD;//全部初始化为死状态
            }
        }
        System.out.println("请输入一组活细胞的坐标位置,输入(-1,-1)代表结束");
        while (true) {
            System.out.println("请输入一组活细胞的坐标位置:");
            row = input.nextInt();
            col = input.nextInt();
            if (0 <= row && row < ROWLEN && 0 <= col && col < COLLEN) {
                cell[row][col] = ALIVE;
            } else if (row == -1 && col == -1) {
                break;
            } else {
                System.out.println("输入坐标超过范围");
            }
        }
    }


    private static void startCell() {
        int row, col, sum, count = 0;
        for (row = 0; row < ROWLEN; row++) {
            for (col = 0; col < COLLEN; col++) {
                //每个单元格的细胞周围活着的细胞
                switch (sumCell(row, col)) {
                    case 2:
                        celltemp[row][col] = cell[row][col];
                        break;
                    case 3:
                        celltemp[row][col] = ALIVE;
                        break;
                    default:
                        celltemp[row][col] = DEAD;
                }
            }
        }

        //temp放回cell
        for (row = 0; row < ROWLEN; row++) {
            for (col = 0; col < COLLEN; col++) {
                cell[row][col] = celltemp[row][col];
                if (celltemp[row][col] == ALIVE) {
                    count++;//演化后当前存活的细胞数量
                }
            }
        }
        showCell();
        System.out.println("当前状态下存活的细胞数量为:" + count);
    }

    //统计四周的细胞个数
    static int sumCell(int row, int col) {
        int count = 0;
        int c, r;//上一行,下一行,左边列,右边列

        for (r = row - 1; r < row + 1; r++) {//从上一行循环到下一行
            for (c = col - 1; c < col + 1; c++) {
                if (r < 0 || r >= ROWLEN || c < 0 || c >= COLLEN) {
                    continue;
                }
                if (cell[r][c] == ALIVE) {
                    count++;
                }
            }
        }
        if (cell[row][col] == ALIVE) {
            count--;

        }
        return count;
    }

    //统计四周的细胞个数

    private static void showCell() {
        int row, col;
        System.out.printf("\n细胞状态\n");
        System.out.printf("┌-");//第一行的左上角
        for (col = 0; col < COLLEN - 2; col++) {//第一行
            System.out.printf("-┬-");
        }
        System.out.printf("┐\n");//第一行的右上角

        for (row = 0; row < ROWLEN; row++) {
            System.out.printf("|");//行的最左边的线
            for (col = 0; col < COLLEN; col++) {//各单元格细胞的生成状态
                switch (cell[row][col]) {
                    case ALIVE:
                        System.out.printf("●|");
                        break;
                    case DEAD:
                        System.out.printf("○|");
                        break;
                }
            }
            System.out.println();//换行
            //输出行与行之间的水平分割线:
            if (row < ROWLEN - 1) {
                System.out.printf("├-");
                for (col = 0; col < COLLEN - 2; col++) {
                    System.out.printf("-┼-");//输出一行水平分割线
                }
                System.out.printf("┤\n");
            }

        }
        //输出最后一行:
        System.out.printf("└-");
        for (col = 0; col < COLLEN -2 ; col++) {
            System.out.printf("-┴-");
        }
        System.out.printf("┘\n");
    }
}

本文章已经生成可运行项目
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZBvos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值