android原生实现生命游戏,沙堆模型

android原生实现生命游戏,沙堆模型

生命游戏 效果截图

绘制一条线迭代为谢尔宾斯基三角形
在这里插入图片描述

核心代码

	/**
     * 计算下一代
     */
    public  int[][] calculationNextCell(){
        //创建下一代细胞
        int[][] nextCells=new int[cells.length][cells[0].length];
        //根据上一代细胞计算下一代细胞的权重
        for (int i = 0; i < cells.length; i++) {
            for (int j = 0; j < cells[i].length; j++) {
                if (cells[i][j]==3){
                    checkedNextCell(i, j, nextCells);
                }
                if (i>=10&&j>=10){
                    if (nextCells[i-10][j-10]==3){
//                        权重为3为出生
                        nextCells[i-10][j-10]=3;
                    }else if (nextCells[i-10][j-10]==2){
//                        权重为2 和上一代一样保持不变
                        nextCells[i-10][j-10]= cells[i-10][j-10];
                    }else {
//                        其他权重 重置为0
                        nextCells[i-10][j-10]=0;
                    }
                }
            }
        }
//        减少循环次数
        for (int i = nextCells.length-10; i < nextCells.length; i++) {
            for (int j = nextCells[i].length-10; j < nextCells[i].length; j++) {
                if (nextCells[i][j]==3){
                    nextCells[i][j]=3;
                }else if (nextCells[i][j]==2){
                    nextCells[i][j]= cells[i][j];
                }else {
                    nextCells[i][j]=0;
                }
            }
        }
        cells =nextCells;
//        allHabit.push(habit);
        return cells;
    }



    /**
     * * 对坐标(+i,+j)点细胞 周围的每个点权重+1
     * @param i
     * @param j
     */
    private  void checkedNextCell(int i, int j, int cells[][]) {
        if (i+1<cells.length){
//                     边界判断是否超出右边界
            ++cells[i+1][j];
        }
        if (i-1>=0){
//                     边界判断是否超出左边界

            ++cells[i-1][j];
        }
        if (j-1>=0){
//                     边界判断是否超出上边界
            ++cells[i][j-1];
        }
        if (j+1<cells[i].length){
//                     边界判断是否超出下边界
            ++cells[i][j+1];
        }
        if (i+1<cells.length&&j-1>=0){
//                     边界判断是否超出右上边界
            ++cells[i+1][j-1];
        }
        if (i+1<cells.length&&j+1<cells[i].length){
//                     边界判断是否超出右下边界
            ++cells[i+1][j+1];
        }
        if (i-1>=0&&j+1<cells[i].length){
//                     边界判断是否超出左下边界
            ++cells[i-1][j+1];
        }
        if (i-1>=0&&j-1>=0){
//                     边界判断是否超出左下边界
            ++cells[i-1][j-1];
        }
    }


沙堆模型游戏 效果截图

在这里插入图片描述

核心代码

下面展示一些 内联代码片

   /**
     * 计算下一代(模拟在点(sendDune.length/2,sendDune.length/2)处不停滴落沙子)
     * @return
     */
    public int[][] nextSandDune() {
        sendDune[ sendDune.length/2][ sendDune[0].length/2]++;

        if (sendDune[ sendDune.length/2][ sendDune[0].length/2]==maxCount){
            sendDune[ sendDune.length/2][ sendDune.length/2]=0;
            sendAway( sendDune.length/2, sendDune.length/2,sendDune);
        }
        return sendDune;
    }
 	/**
     * 这里采用递归模拟沙堆分散
     * @param i
     * @param j
     * @param sendDune
     */
    private void sendAway(int i,int j,int[][] sendDune) {
        if (i+1<sendDune.length){
//                     边界判断是否超出右边界
            if (++sendDune[i+1][j]==maxCount){
                sendDune[i+1][j]=0;
                sendAway(i+1,j,sendDune);
            }

        }
        if (i-1>=0){
//                     边界判断是否超出左边界

            if (++sendDune[i-1][j]==maxCount){
                sendDune[i-1][j]=0;
                sendAway(i-1,j,sendDune);
            }
        }
        if (j-1>=0){
//                     边界判断是否超出上边界
            if (++sendDune[i][j-1]==maxCount){
                sendDune[i][j-1]=0;
                sendAway(i,j-1,sendDune);
            }
        }
        if (j+1<sendDune[i].length){
//                     边界判断是否超出下边界
            if (++sendDune[i][j+1]==maxCount){
                sendDune[i][j+1]=0;
                sendAway(i,j+1,sendDune);
            }
        }
    }

源码

git源码

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Game of Life 约翰·康威最常被专业人士和大众拿来讨论的成果,就是他在1970年发明的生命游戏,Game of Life。它的意义在于验证了某些科学家的宇宙观,即最简单的逻辑规则能产生出复杂有趣的活动。 康威生命游戏在方格网上进行,有点像围棋。有填充的网格代表有生命,或理解成一个细胞,再或者按中国传统,把填充和无填充理解成“有”和“无”。游戏规则只有四条: 1 当周围仅有1个或没有存活细胞时, 原来的存活细胞进入死亡状态。(模拟生命数量稀少) 2 当周围有2个或3个存活细胞时, 网格保持原样。 3 当周围有4个及以上存活细胞时,原来的存活细胞亦进入死亡状态。(模拟生命数量过多) 4 当周围有3个存活细胞时,空白网格变成存活细胞。(模拟繁殖) (图源:《上帝与新物理学》) “种子”长成“花朵”,“花朵”死后留下四个“种子” 康威生命游戏的四条规则一目了然地对应着宇宙中的生命规律,它是一种元胞自动机(cellular automaton),体现了冯·诺依曼(Von Neumann)关于机器自我进化的思想。 简单图形 早在计算机还没有普及的时候,人们就已经发现了生命游戏的许多代表性图形。比如静物(still lifes),细胞分布形态非常稳定,永远都保持一开始的样子,不会有变化。 (图源:en.wikipedia.org) 方块(Block) 蜂窝(Beehive) 吐司(Loaf) 小船(Boat) 浴缸(Tub) 还有一类叫做振荡器(oscillator),从初始形态开始,在有限图形之间切换,周而复始。数学家发现了很多周期的振荡器,但至今还没有找到周期为19、23、34、38、41的。 (图源:en.wikipedia.org) 甚至还有会整体移动的,比如太空飞船(spaceship)类型。图形会在方格世界内一直沿固定方向运动。 滑翔机(Glider) 轻型飞船(Lightweight spaceship) (图源:en.wikipedia.org) 复杂图形 后来人们又发现了很多更为复杂的变化,看几个例子。 (图源:en.wikipedia.org) 康威最初认为生命游戏中没有任何图形可以无限增长,但很快高斯帕滑翔机枪(Gosper glider gun)推翻了他的想法。这个图形每15代产生一架滑翔机,无限延续。 (图源:en.wikipedia.org) 复杂振荡器一类里有一个繁殖者(breeder),也是高斯帕的杰作。它拥有二次增长率。 河豚(puffer或puffer train)则是大型运动的代表。它也是高斯帕发现的,根据碎片多少分为脏河豚和净河豚两类。 河豚(puffer) (图源:web.stanford.edu) 还有一个变型,叫做耙子(rakes)。 耙子(rakes)(图源:web.stanford.edu) 其实还有更为大型复杂的图形。也有一些研究者通过对规则稍微修改或补充而获得了意想不到的成功。 Rule 30 1983年,沃尔夫勒姆在研究了康威生命游戏以后,自己制定规则,做出了一个一维元胞自动机(更接近于冯·诺依曼的思路)。表示方法是将下一代的图形画在前一代的下面。这个规则组称为Rule 30(因为按顺序排列的二进制数00011110对应的十进制就是30)。 (图源:en.wikipedia.org) Rule 30经过多代演化后显示出一部分规律一部分随机的结果。 (图源:en.wikipedia.org) 自然界中的织锦芋螺(Conus textile)花纹与Rule 30非常相似,这个发现估计让沃尔夫勒姆高兴了好一阵子。 (图源:archinect.com) 说剑桥北站表皮图案是Rule 30其实并不确切,它是黑白反转的Rule 30。所以晚上内部亮灯时,或者如图这样从内向外看,才真正符合Rule 30。 反转的Rule 30事实上就是沃尔夫勒姆的另一个规则组Rule 135。他从Rule 30开始,发现了一系列有趣的图形。 Rule 110(图源:en.wikipedia.org) (图源:blog.stephenwolfram.com) 初始状态不同也会导致图案变化不同 更多变化
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值