生命游戏多线程版

康威生命游戏无限版:稀疏数据结构与动态边界算法实现 细胞自动机是一种在离散网格上,由简单规则驱动产生复杂动态系统的计算模型,其核心原理在于每个细胞的状态仅由其邻居的当前状态决定。这种局部相互作用能涌现出全局的秩序、振荡和移动等丰富行为,在算法研究、复杂性科学和人工生命领域具有重要价值。通过稀疏数据结构(如哈希映射)仅存储活跃细胞,并动态计算渲染边界,可以有效管理理论上无限大的演化空间。本文以康威生命游戏为例,详细解析了如何利用字典进行邻居计数优化,并实现视口的动态平移与缩放,从而构建一个能够模拟滑翔机枪、繁殖者等经典模式无限扩张的可交互虚拟宇宙。 阅读详情

Main类

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Main {
    public static int matrixSize = 10000;
    public static void main(String[] args) throws IOException, InterruptedException {
        LifeChess lifeChess = new LifeChess();
        lifeChess.setSIZE(matrixSize);//设置棋盘大小
        lifeChess.setGENERATIONS(2000);
        lifeChess.initializeBoardfromTxt("7.init.txt");//获取初始矩阵
        lifeChess.getRes("7.end.txt");//获取目标矩阵

        ExecutorService executor = Executors.newFixedThreadPool(8);

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < lifeChess.getGENERATIONS(); i++) {
            lifeChess.initializeMode();
            if (lifeChess.checkRes()) {
                break;
            }
            List<Future<Void>> futures = new ArrayList<>();
            for (int j = 0; j < matrixSize; j++) {
                final int rowIndex = j;
                futures.add(executor.submit(() -> {
                    new Thread_l(lifeChess, matrixSize, rowIndex).run();
                    return null;
                }));
            }
            for (Future<Void> future : futures) {
                try {
                    future.get(); // 阻塞直到每个任务完成
                } catch (ExecutionException e) {
                    e.printStackTrace(); // 处理异常
                }
            }
        }
        long endTime = System.currentTimeMillis();
        executor.shutdown();
        System.out.println(endTime - startTime+"ms");
    }
}

LifeChess类

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;

public class LifeChess {
    protected int SIZE = 10001; // 棋盘大小
    protected int GENERATIONS = 3; // 代数
    public int[][] board = new int[SIZE][SIZE];

    public int[][] mode = new int[SIZE][SIZE];
    protected String str;
    public void initializeBoardfromTxt(String fileName) throws IOException {
        Path path = Paths.get("test/"+fileName);
        String data = Files.readString(path);
        for (int j = 0; j < data.length(); j++) {
            int k = j /SIZE;
            int l = j % SIZE;
            this.board[k][l] = data.charAt(j)-'0';
        }
    }

    public void initializeMode() {
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                this.mode[i][j] = this.board[i][j];
            }
        }
    }

    public void getRes(String fileName) throws IOException {
        Path path = Paths.get("test/"+fileName);
        this.str = Files.readString(path);
    }
    // 运行生命游戏
    public void runGameOfLife() throws IOException {
        while (!checkRes()) {
            this.board = nextGeneration(this.board);
            if (checkRes()) {
                printBoard(this.board);
                Path outputPath = Paths.get("test/res.txt");
                Files.write(outputPath, Arrays.deepToString(this.board).getBytes());
            }
        }
    }

    public int[][] nextGeneration(int[][] currentBoard) {
        int[][] newBoard = new int[this.SIZE][this.SIZE];
        //迭代
        for (int i = 0; i < this.SIZE; i++) {
            for (int j = 0; j < this.SIZE; j++) {
                int alivenbCells = countAliveNeighbors(currentBoard, i, j);

                if (currentBoard[i][j] == 1) {
                    // 规则1和规则2
                    newBoard[i][j] = (alivenbCells == 2 || alivenbCells == 3) ? 1 : 0;
                } else {
                    // 规则3
                    newBoard[i][j] = (alivenbCells == 3) ? 1 : 0;
                }
            }
        }
        return newBoard;
    }

    // 计算某细胞周围的状态为生的邻居细胞数量
    public int countAliveNeighbors(int[][] board, int x, int y) {
        int count = 0;
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                if (i == 0 && j == 0) continue; // 自身不算
                int nx = x + i;
                int ny = y + j;
                if (nx >= 0 && nx < this.SIZE && ny >= 0 && ny < this.SIZE) {
                    count += board[nx][ny];
                }
            }
        }
        return count;
    }
    //打印棋盘
    public void printBoard(int[][] board) {
            for (int i = 0; i < this.SIZE; i++) {
                for (int j = 0; j < this.SIZE; j++) {
                    System.out.print(board[i][j]);
                }
                System.out.println();
            }
            System.out.println();
    }
    public boolean checkRes() {
        int k = 0;
        for (int i = 0; i < this.SIZE; i++) {
            for (int j = 0; j < this.SIZE; j++) {
                if(this.board[i][j] != this.str.charAt(k)-'0') {return false;}
                k++;
            }
        }
        return true;
    }
    public LifeChess() {}
    public void setSIZE(int size) {
        this.SIZE = size;
    }
    public int getSIZE() {
        return SIZE;
    }
    public void setGENERATIONS(int GENERATIONS) {
        this.GENERATIONS = GENERATIONS;
    }
    public int getGENERATIONS() {
        return GENERATIONS;
    }
}

Thread_l类

public class Thread_l implements Runnable {
    protected int SIZE; // 棋盘大小
    public int LINE; // 代数
    public LifeChess lifeChess;
    @Override
    public void run(){
        nextGeneration();
    }

    public Thread_l(LifeChess lifeChess, int SIZE, int LINE){
        this.lifeChess = lifeChess;
        this.SIZE = SIZE;
        this.LINE = LINE;
    }

    public void nextGeneration() {
        //迭代
                for (int j = 0; j < SIZE; j++) {
                    int alivenbCells = countAliveNeighbors(LINE, j);

                    if (lifeChess.mode[LINE][j] == 1) {
                        // 规则1和规则2
                        lifeChess.board[LINE][j] = (alivenbCells == 2 || alivenbCells == 3) ? 1 : 0;
                    } else {
                        // 规则3
                        lifeChess.board[LINE][j] = (alivenbCells == 3) ? 1 : 0;
                    }
                }

    }
    public int countAliveNeighbors(int x, int y) {
        int count = 0;
        for (int i = -1; i <= 1; i++) {
            for (int j = -1; j <= 1; j++) {
                if (i == 0 && j == 0) continue; // 自身不算
                int nx = x + i;
                int ny = y + j;
                if (nx >= 0 && nx < SIZE && ny >= 0 && ny < SIZE) {
                    count += lifeChess.mode[nx][ny];
                }
            }
        }
        return count;
    }
}

Pygol:用Python演绎生命游戏的奥秘 本文还有配套的精品资源,点击获取 简介:Pygol是一个用Python语言编写的互动版生命游戏。用户可以设置初始细胞状态并观察生命游戏规则如何影响细胞状态的动态演变。生命游戏规则简单,但模拟出复杂的生命演化过程。Pygol利用Python的简洁性与强大的数据处理能力,提供直观图形界面,允许用户通过交互式环境探索生命游戏。实现该游戏需要理解基本的编程概念,如条件语句、循环和数... 阅读详情

相关推荐

生命游戏并行化实现(Java)

生命游戏串行代码实现(Java)本文将对之前的串行生命游戏进行改造,实现并行化,并通过输出运行时间来检验其之间的效率。在此采用的方法是程序读取给定的测试样例作为初始棋盘,随后根据样例要求进化特定代数,输出结果文件,并和测试用例的预期输出文件进行比对,输出是否一致以及运行时间。以上就是本文的全部内容,主要将之前的串行生命游戏代码进行改造,在验证了生命游戏规则算法的正确性的同时,也体现了多线程编程的优势。通过使用线程池,我们有效地分配了任务,确保每个线程处理特定行的细胞状态,最大化利用计算资源。

chashangcha的博客 1099

生命游戏 Java版 10万长度的数组实现 串性加并行实现

初次运行如果遇到Exception in thread "main" java.lang.OutOfMemoryError: Java heap space问题 参考https://blog.youkuaiyun.com/litaoshoujiao/article/details/8165429这种类型的文章 我参数设置了-Xmx4096m就没问题了 第二次更新这篇文章了,将原来代码中不正确的地方进行了...

godelgnis的博客 1779

Java多线程编程技巧及游戏开发应用

本文介绍了Java中高级线程编程技术,包括线程的创建、执行以及调度策略。通过示例代码,展示了如何通过继承Thread类或实现Runnable接口来定义线程执行的代码,以及如何控制线程的生命周期。此外,还探讨了线程调度的原理和在多线程游戏开发中的应用。

weixin_35045970的博客 757

“生命游戏”的多线程算法思考

Intel正在ISN网站上举办一个多线程编程大赛,值得关注。Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错。题目难度适中,而且具有启发性,对多核编程感兴趣的C/C++程序员应该关注一下。其实参与这样的活动,置身于竞赛气氛当中,无论是否获奖,都可以在短时间内大幅度地提高对多线程编程的理解。这次比赛比较有特色,为期长达几个月之久,而且每个月都有一轮竞赛,每

孟岩 1万+

实现约翰康威的生命游戏:Java项目实战

细胞自动机是计算机科学和数学领域中一类特殊的离散系统,它们由一个规则的格子组成,每个格点称为一个细胞,每个细胞具有一个或多个状态。细胞的状态根据一组预设的规则随着时间和空间的变化而改变。这种看似简单的模型却能够模拟出自然界中许多复杂的现象,包括生命体的生长、物质的扩散、以及自然界的动态变化等。细胞自动机的理论基础可追溯至20世纪初,但在1970年约翰·康威(John Conway)设计的”生命游戏”(Game of Life)模型问世后,细胞自动机开始在公众视野中大放异彩。

weixin_42097508的博客 878

[渗透测试实战篇-4] RCE漏洞组合拳突破Getshell全解析

本文深入解析RCE漏洞组合拳在渗透测试中的实战应用,通过SSRF、XXE等漏洞串联技术突破Getshell的全过程。文章详细介绍了Java和PHP环境下的漏洞利用差异,以及防御绕过与权限维持的实用技巧,为安全研究人员提供全面的实战指导。

weixin_29211309的博客 351

生命游戏串行代码实现(Java)

本文主要记录了约翰·康威创造的生命游戏的实现过程,

chashangcha的博客 1694

别再为倍福EL6021/EL6022的RS485接线头疼了!手把手教你硬件跳线与软件配置(附Modbus RTU主站例程)

本文详细解析了倍福EL6021/EL6022模块的RS485硬件跳线与软件配置方法,包括Modbus RTU主站编程实战。从端子定义、跳线操作到TwinCAT 3环境设置,提供完整的通信例程和故障排查技巧,帮助工程师快速解决工业现场通信问题。

weixin_30634661的博客 592

“生命游戏”的多线程算法思考[转]

     Intel正在ISN网站上举办一个多线程编程大赛,值得关注。Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错。题目难度适中,而且具有启发性,对多核编程感兴趣的C/C++程序员应该关注一下。其实参与这样的活动,置身于竞赛气氛当中,无论是否获奖,都可以在短时间内大幅度地提高对多线程编程的理解。这次比赛比较有特色,为期长达几个月之久,而且每个月都

hustcc的专栏 802

使用kmplot在线进行生存分析

欢迎关注”生信修炼手册”!kmplot是一个生存分析的在线工具,最初是设计用来对肝癌中的miRNA进行生存分析,对应的文章发表在scientific reports上,链接如下https...

庐州月光的博客 1万+

射频工程师笔记---射频通信基础

回顾一下移动通信技术的发展,其实是互联网和通信技术的融合过程。在这个过程中,很多应用都在不断加入其中。比如计算机跟通信的融合产生了互联网、互联网跟手机的融合带来了移动互联网。手机可以看杂志、看视频、听音乐,于是又出现了内容服务产业;再后来,电视音箱等设备也能联网,于是网络跟家电又产生了融合。所以应用的出现总是在融合其他产业。在1995年,比尔·盖茨在《未来之路》一书中首次提出:在未来...

多年硬件从业经历,热爱学习,记录生活! 2万+

多线程游戏开发

以美剧为例,想要看美剧,必须有声音、图像、字幕等,它们分别对应有自己的线程,同时运行这几个线程,完成了美剧播放这个进程。而在只有一个cpu模拟出来的多线程中,在同一时间点,cpu只能执行一个代码,因为切换的快,所以产生了同时执行的错觉。以人脑为例,在人看似边吃饭边玩手机时,由于人脑只有一个,在极短的瞬间中,我们其实只是在做吃饭和玩手机中的一件事。//启动线程 每个线程对象只能调用一次start。//run执行完,该线程的内存被回收,不能再启动。//需要先创建Thread类的对象,在启动线程。

suuijbd的博客 1733

使用VNC可视化Docker容器

Docker容器可视化

Robert_Q的博客 1万+

pygame + numpy实现康威生命游戏

pygame + numpy实现康威生命游戏

cnds123的专栏 1747

Windows 11 部署 Docker Desktop:从 WSL 报错到服务配置的完整排障实录

本文详细记录了在Windows 11上部署Docker Desktop时遇到的WSL报错问题及完整解决方案。从Hyper-V配置、BIOS设置到系统服务检查,提供了一系列实用命令和排查步骤,帮助开发者快速解决'Unexpecter WSL error'等常见问题,实现Docker与WSL2的稳定运行。

weixin_30687051的博客 122

ubuntu20 安装px4、mavros、QGroundControl

首先安装一下ant,否则没法运行,同时因20.04的缺少动态库libawt_xawt.so无法被Java8给调用,我的解决办法是去18.04把18.04的相同路径下的动态库libawt_xawt.so移动到20.04的/usr/lib/jvm/java-11-openjdk-amd64/lib/路径中。用rosdepc的时候,你得确保你用的是鱼香ROS的提供的ROS安装方法,否则是没有rosdepc的。make px4_sitl gazebo之前,可以安装一下gazebo的 模型。二、安装MAVROS。

qq_58060770的博客 3349

JAVA-生命游戏多线程

生成图片,原始生命图 package MyGameOfLife; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class MyImage { BufferedImage image;//储存图片 public void creat_Image(String fileOut) throws IOExc

DongLUOWAN的博客 3524

把静态前端托管进 SAP BTP:HTML5 Application Deployer 与企业级内容部署全攻略

本文介绍了在SAP BTP Cloud Foundry环境中使用HTML5 Application Repository托管前端静态资源的工程化实践。通过HTML5 Application Deployer工具,结合MTA描述、路由配置和服务实例,实现前后端解耦和标准化部署。文章详细阐述了目录结构、关键配置文件、MTA编排以及构建部署流程,并针对大体积前端资源提供了GACD和异步上传两种解决方案。最后说明了如何与AppRouter协同工作,使部署内容可供终端用户访问。这套方法使前端更新无需重启后端,支持团队

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 156

生命游戏-多线程

多线程

爱写bug的王六六 1192

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

基于Python实现的简单生命游戏

一、引言 1.1 开发背景 康威生命游戏,又称康威生命棋,是英国数学家约翰•何顿•康威在1970年发明的细胞自动机。 它最初于1970年10月在《科学美国人》杂志上马丁•葛登能的“数学游戏”专栏出现。在游戏的进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入...

demongwc的博客 181

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Go语言生命游戏 GameofLife GOL

目录CSA Coursework: Game of LifeTask OverviewIntroductionSkeleton CodeStage 1 - Parallel ImplementationStep 1Step 2Step 3Step 4Step 5Success Criteriaeffect drawing CSA Coursework: Game of Life This is the Computer Systems A summative coursework. The coursewo

qq_32019341的博客 3378

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

我的多线程小游戏——坦克大战

经过一段时间的小奋斗,终于做出了一个还能玩的多线程小游戏啦!   1:游戏介绍:游戏一共3关,每关的不同点是敌方坦克的强度不同,玩家坦克用键盘操控(按键说明已写在附件中),每隔一段时间还会出现道具,其余游戏说明也已经写在附件中。 (开始界面) (游戏运行界面)  2:主要技术要点和学到的经验     (1):技术要点:            技术要点主要有两个:一是多线程的应用,...

AimCorder的专栏 744

Java实现 蓝桥杯 生命游戏

标题:生命游戏 康威生命...

365

生命游戏

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。// #include "pch.h"#include <iostream>#include <Windows.AI.MachineLearning.h>#include <conio.h> #define Heigh 20#def...

baite1214的博客 194
上一篇: SCAU数据库实验2习题
下一篇: 组件中的Props
YoloMari
博客等级 码龄4年 168粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

YoloMari

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

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

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

打赏作者

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

抵扣说明:

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

余额充值