我在mathematica中写了一个生命游戏程序但是有一点需要注意,我需要能够将再现规则应用到某些单元格中,我想尝试一种使用MapAt的新方法但是liveNeighbors不起作用元素,我想不出一种方法来解决它而不完全按照我之前的做法(很多杂乱的索引),有没有人有任何建议?(我假设这将比下面列出的旧方法更有效,如果不是,请让我知道,我只是一个初学者!).
我想做什么:
Map[ArrayPlot,FixedPointList[MapAt[update[#,liveNeighbors[#]]&,#,coords]&,Board, 1]]
Run Code Online (Sandbox Code Playgroud)
我已经做了什么:
LifeGame[ n_Integer?Positive, steps_] := Module [{Board, liveNeighbors, update},
Board = Table [Random [Integer], {n}, {n}];
liveNeighbors[ mat_] :=
Apply[Plus,Map[RotateRight[mat,#]&,{{-1,-1},{-1, 0},{-1,1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}]];
update[1, 2] := 1;
update[_, 3] := 1;
update[ _, _] := 0;
SetAttributes[update, Listable];
Seed = RandomVariate[ProbabilityDistribution[0.7 UnitStep[x] + 0.3 UnitStep[x - 1], {x, 0, 1, 1}], {n, n}];
FixedPointList[Table[If[Seed[[i, j]] == 1,update[#[[i, j]], liveNeighbors[#][[i, j]]],#[[i, j]]], {i, n}, {j, n}]&, Board, steps]]]
Run Code Online (Sandbox Code Playgroud)
谢谢!
我在Java swing中实现了Conway的生命游戏问题.一切都很好.正如您在下面的屏幕截图中看到的,只要单击"勾选"按钮,游戏就会进入下一个生命形式.现在,我计划在"Tick"按钮旁边添加一个"Autoplay"按钮.这种自动播放的目的很简单.当我点击它时,应该继续进行自动操作,就好像我以1秒的间隔按下勾选按钮.

我试过这个.但这似乎阻止了所有其他操作.如何在单独的线程中执行此操作?一个小代码片段会让我继续前进.
class AutoPlayListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btnAutoPlay){
while(true){
Thread.sleep(1000); //InterruptedException try catch hidden
btnTick.doClick();
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在Java中的Game of Life应用程序中有以下逻辑代码.我有一个问题,规则不像默认的康威的生命游戏规则.我已经在维基百科上阅读了它们,它们如下;
我试图在下面的代码中复制这些规则,但它的行为不同于正常的Conway'生命游戏;
int surroundingLife = 0;
if (lifeMap[cX+1][cY]) { //Right
surroundingLife++;
}
if (lifeMap[cX-1][cY]) { // Left
surroundingLife++;
}
if (lifeMap[cX][cY+1]) { // Above
surroundingLife++;
}
if (lifeMap[cX][cY-1]) { // Below
surroundingLife++;
}
if (lifeMap[cX-1][cY-1]) { // Bottom left
surroundingLife++;
}
if (lifeMap[cX+1][cY+1]) { // Top Right
surroundingLife++;
}
if (lifeMap[cX-1][cY+1]) { // Some other corner (I don't know which one)
surroundingLife++;
}
if (lifeMap[cX+1][cY-1]) { // Yet another corner (I don't …Run Code Online (Sandbox Code Playgroud) 我正在尝试将代码写入康威的生活游戏中,但它只是一直在消失.我不知道我应该写什么,所以不要随着代码的进行而进行所有计算,它应该只存储代码所说的内容,然后进行更改.并澄清我不希望我的代码做出关于一个单元格的一个决定并改变它然后继续下一个单元格但我希望它做出决定转移到下一个单元格并在我的代码结束时我希望它改变所有的细胞att一次.
这是创建世界的按钮:
private void btnSVActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
for (rad = 0; rad < 15; rad++){
for (kolumn = 0; kolumn < 15; kolumn++){
int x = 10 + 20 * kolumn;
int y = 10 + 20 * rad;
int diameter = 20;
int liv = (int) (Math.random()+0.5);
Cirkel cirkel = new Cirkel(x, y, diameter, liv);
cirklar.add(cirkel);
}
}
repaint();
}
Run Code Online (Sandbox Code Playgroud)
这是制作下一代的按钮:
private void btnNGActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code …Run Code Online (Sandbox Code Playgroud) 我正在尝试用C语编写康威的生命游戏,但我对如何存储ALIVE或DEAD单元格感到困惑.
电路板存储在32个无符号长度(32x32电路板)的数组中,每个位代表一个单元(1 =有效,0 =无效).我无法改变这种设计.
到目前为止,我有代码确定特定单元有多少邻居但我需要根据游戏规则更改其状态(1可能需要变为0或1,0可能需要为1或0) .
我假设我可以使用按位运算(|,&,^),但我不知道如何隔离行中的特定位并存储它,因为我遍历行的其余部分然后存储新的,重新-calculate行作为一个unsigned long.
即如果10011 ... 0需要01101 ... 1.我怎样才能做到这一点?
我意识到代码将需要额外的for循环,但我只是试图在继续之前解决这个特定的问题.
任何帮助表示赞赏.
#include <stdio.h>
#include <stdlib.h>
unsigned long columnMask;
int compass = 0;
int totAliveNeighbors = 0;
int iterator = 0;
int iterator2 = 0;
#define ARRAY_SIZE 32
#define NEIGHBORS 8
unsigned long grid[ARRAY_SIZE];
unsigned long copyGrid[ARRAY_SIZE];
unsigned long neighbors[NEIGHBORS];
unsigned long init32;
unsigned long holder = 0;
int main(void){
srand(time(NULL));
printf("\n");
/** Seeds the grid with random numbers **/
for(iterator = 0; iterator < 32; iterator++){ …Run Code Online (Sandbox Code Playgroud) 我有一个基本的实现Conway的生活游戏,用榆树在uminokirin.com上运行.
来源在这里可见.
该程序允许用户调整toroïdal网格的大小,单击单元格以更改其状态,并随机化世界.它适用于我的计算机上的小值(小于50).
但是,当尝试在较大的网格上使用随机化网格功能时(阈值似乎并不总是相同),程序会在没有任何警告的情况下无响应,唯一的恢复方法是重新加载应用程序.
在GOL算法中没有优化,并且svg对每个单元使用单个矩形可能非常低效,但它并不能解释为什么程序以这种方式运行而不是说减速.
这是榆树运行时放弃了吗?还是某种浏览器保障?
更重要的是有没有办法防止这种行为,除了任意限制网格的最大大小?
我被分配了这个项目,说明如下:
生命游戏是为无限大小的网格定义的。在第 2 章中,我们将 Life Grid ADT 定义为使用固定大小的网格,其中用户指定网格的宽度和高度。这足以说明如何使用二维数组来实现生命游戏。但完整的实现应该允许无限大小的网格。使用与实现稀疏矩阵类似的方法来实现稀疏生命网格 ADT。
老实说,我不太理解这个概念。您能否给我一个外行人可以理解的简短描述(如果不是简短的代码)?我会很感激。
稀疏生命网格.py
""" My initial GameOfLife code
Feb 27, 2013
Sparse Matrix code specially designed for Game of Life
"""
class SparseLifeGrid:
def __init__(self):
"""
"pass" just allows this to run w/o crashing.
Replace it with your own code in each method.
"""
pass
def minRange(self):
"""
Return the minimum row & column as a list.
"""
pass
def maxRange(self):
"""
Returns the maximum row & column as a list.
""" …Run Code Online (Sandbox Code Playgroud) 使用内在函数实现Conway的生命游戏的作业找到了工作代码,但无法理解它的主要部分.
此实现首先计算每次销售的活动邻居数量,并将结果存储在一个数组中counts,因此销售数据(世界)为states.我无法真正了解newstate这里是如何生成的.我的理解是如何转变工作向左,如何按位或工作,但我不明白为什么他们已经习惯这样的,为什么shufmask是这样,如何洗牌的作品.如果数组元素的类型是uint8_t,也无法理解为什么使用_mm256_slli_epi16.所以我的问题是关于这个字符串
__m256i newstate = _mm256_shuffle_epi8(shufmask, _mm256_or_si256(c, _mm256_slli_epi16(oldstate, 3)));
你可以帮我解释一下,假男孩,如果它可能最详细,它是如何工作的.
void gameoflife8vec(uint8_t *counts, uint8_t *states, size_t width, size_t height) {
assert(width % (sizeof(__m256i)) == 0);
size_t awidth = width + 2;
computecounts8vec(counts, states, width, height);
__m256i shufmask =
_mm256_set_epi8(
0, 0, 0, 0, 0, 1, 1, 0,
0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 1, 1, 0,
0, 0, 0, 0, 0, 1, 0, …Run Code Online (Sandbox Code Playgroud) 因此,在 Cell.update() 中检测它是否应该存活的代码一定有问题,但是我硬编码的滑翔机没有按预期工作。第一代和第二代按预期工作,但到了第三代就消失了。有人知道问题是什么吗?我知道代码有点乱,但我对 python 很陌生,所以这是预料之中的。提前致谢!
这是代码:
import pygame
"""
rules:
1. Any live cell with two or three live neighbours survives.
2. Any dead cell with three live neighbours becomes a live cell.
3. All other live cells die in the next generation. Similarly, all other dead cells stay dead.
number cells on screen = 32x18
cell size = 30x30
"""
# variables
WIDTH = 960
HEIGHT = 540
TITLE = "Conway's Game Of Life"
GRID_COLOUR = (200, 200, 200) …Run Code Online (Sandbox Code Playgroud)