- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一些可用的 Game of Life 代码。它将每个种群保存为位图。这是输出的样子(裁剪):
在清理代码时,我发现如果我注释掉或以其他方式删除第60行:
cout << "Survivor: " << x << ", " << y << "\n";
它完全打乱了程序,它没有像它应该的那样产生滑翔机,而是产生了这个:
我四处寻找,试图找出可能导致这种情况的原因,但到目前为止我一直没有成功。这是我当前的代码:
//Bitmap Library from http://partow.net/programming/bitmap/
#include "bitmap_image.hpp"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
using namespace std;
#define WIDTH 160
#define HEIGHT 128
bool population[WIDTH][HEIGHT];
bool survivors[WIDTH][HEIGHT];
int check_survivors();
int check_neighbors(int x, int y);
int write_population(char* file);
int main() {
int i, populations;
cout << "Enter number of populations: ";
cin >> populations;
//Glider
survivors[28][100] = true;
survivors[29][100] = true;
survivors[29][101] = true;
survivors[30][101] = true;
survivors[28][102] = true;
//Initial image generation
write_population("population0.bmp");
//populations
for (i = 0; i < populations; i++) {
char filename[17] = "population";
char ii[3];
sprintf(ii, "%d", i+1);
strcat(filename, ii);
strcat(filename, ".bmp");
check_survivors();
write_population(filename);
}
return 0;
}
int check_survivors() {
//set x and y variables
int x, y;
for (x = 0; x < WIDTH; x++) {
for (y = 0; y < HEIGHT; y++) {
if (check_neighbors(x, y)) {
survivors[x][y] = true;
cout << "Survivor: " << x << ", " << y << "\n";
} else {
survivors[x][y] = false;
}
}
}
return 0;
}
int check_neighbors(int x, int y) {
int neighbors = 0, survives;
//I really need to rewrite this mess
//Neighbors above
if (population[x-1][y-1] == true && x != 0 && y != 0) {
neighbors++;
}
if (population[x][y-1] == true && y != 0) {
neighbors++;
}
if (population[x+1][y-1] == true && x != WIDTH-1 && y != 0) {
neighbors++;
}
//Neighbors next to
if (population[x-1][y] == true && x != 0 ) {
neighbors++;
}
if (population[x+1][y] == true && x != WIDTH-1) {
neighbors++;
}
//Neighbors below
if (population[x-1][y+1] == true && x != 0 && y != HEIGHT-1) {
neighbors++;
}
if (population[x][y+1] == true && y != HEIGHT-1) {
neighbors++;
}
if (population[x+1][y+1] == true && x != WIDTH-1 && y != HEIGHT-1) {
neighbors++;
}
//Determining life or death
if (neighbors < 2 || neighbors > 3) {
//Neighbors less than 2 or more than 3 is dead cell
survives = 0;
} else if (neighbors == 3 && population[x][y] == false) {
//Exactly 3 neighbors re-animates a cell
survives = 1;
} else if (population[x][y] == true) {
//2 or 3 neighbors is survivor
survives = 1;
}
return survives;
}
int write_population(char* file) {
//Create Image
bitmap_image image(WIDTH, HEIGHT);
//Set background to white
image_drawer draw(image);
image.set_all_channels(255,255,255);
//set x and y variables
int x, y;
//For every array point, check to see if it survives,
//and transfer survivors to population
for (x = 0; x < WIDTH; x++) {
for (y = 0; y < HEIGHT; y++) {
if (survivors[x][y] == true) {
draw.pen_width(1);
draw.pen_color(0,0,0);
draw.plot_pixel(x, y);
}
population[x][y] = survivors[x][y];
}
}
//Save image
image.save_image(file);
//return
return 1;
}
最佳答案
像这样的事情:
if (population[x-1][y-1] == true && x != 0 && y != 0)
需要重写为:
if ( x > 0 && y > 0 && population[x-1][y-1] == true )
否则,当 x
或 y
为 0
时,您将直接进入未定义的行为区域(因为当您从 check_survivors()
) 调用 check_neighbors()
,您可能会遇到像这样奇怪的、无法解释的错误。在尝试访问这些元素之前,您需要检查无效的数组索引。
此外,这里:
if (neighbors < 2 || neighbors > 3) {
//Neighbors less than 2 or more than 3 is dead cell
survives = 0;
} else if (neighbors == 3 && population[x][y] == false) {
//Exactly 3 neighbors re-animates a cell
survives = 1;
} else if (population[x][y] == true) {
//2 or 3 neighbors is survivor
survives = 1;
}
如果 neighbors == 2
和 population[x][y] == false
看起来 survives
可能会留下一个不确定的值code>,如果您要访问该值,这也会导致未定义的行为。从您的代码中并不能立即清楚地知道这种情况的组合是否永远为真,但如果您仍处于调试阶段,那么至少值得添加一个条件检查以验证它是否曾经为真。
如果您的程序像这个一样表现出未定义的行为,那么在这些问题得到解决之前几乎不可能对它进行推理。
关于c++ - Game Of Life 程序中的混淆错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26685745/
我试图通过 DexClassLoader 从 jar 文件加载类: public class AndroidClassLoader implements ClassLoader { priva
我试图了解如何为自己的类型编写trait和impl,以处理一些输入数据。我从一个简单的示例开始,在该示例中,我想使用1, 2, 3, 4处理输入的trait Processor。一个实现将跳过第一个元
生命游戏的算法就不多解释了,百度一下介绍随处可见。 因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用numpy,使用起来学习成本比较高,所以闲暇之余写一个不用外
若凌° Provence - wirepuller 阴谋者 。 交换末日- Brave Hold on Welcome to my life 匪我思存 · L⊙ve/
我在一个网站上工作,用户输入几个名字,它在模板上以漂亮的字体呈现,以便稍后打印和跟踪到其他东西(纸、木头、金属等)。 让我们假设模板是 4"x 3"实物大小。是否可以在所有设备上显示 4"x 3"的图
这是一个有点理论性的问题。在编程作业中,约翰康威告诉我们要实现生命游戏。作为一项附加任务,我们被要求修改程序,以便它可以检测最多四代的模式重复。例如,给定这个特定的游戏“种子”,程序应该像这样: -
我目前正在使用JavaScript编写Conways生活游戏,但是遇到了一些我不知道如何解决的错误。想知道是否有人可以帮助我解决这些问题? 当前在Google Chrome浏览器中显示4个错误,具体如
我和四边形邻居一起写了经典游戏“生活”。当我在调试中运行它时,它说: 连续版本:4.2s 并行版本:1.5s 好的,很好。但是如果我在 release 中运行它,它会说: 连续版本:0.46s 并行版
我正在制作一个 Android 应用程序,它将包含两项服务,每 24 小时持续发送一次有关用户手机使用情况的数据。 用户应该执行该应用程序,切换按钮以启用手机使用记录,然后用户应该能够使用他的手机进行
我有一些可用的 Game of Life 代码。它将每个种群保存为位图。这是输出的样子(裁剪): 在清理代码时,我发现如果我注释掉或以其他方式删除第60行: cout #include #incl
难道后面函数返回的指针是不可访问的吗? char *foo(int rc) { switch (rc) { case 1: return("on
简介 细胞自动机(又称元胞自动机),名字虽然很深奥,但是它的行为却是非常美妙的。所有这些怎样实现的呢?我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有NN个格子。而每一
Everything you want comes after you stop looking for it. 当你不再寻觅,你想要的也就来了。 I’m counting the days ti
正如主题所述,我很难想象在现实生活中的示例中何时何地使用可恢复异常,以及我们可以通过使用它们获得哪些有效优势。 我能想象的是,一个子系统已连接,比方说通过 RFC 连接到一个 session ,该 s
什么是“双生命”模块? perldelta for Perl 5.14 中有提到. 最佳答案 Dual Life 模块是存在于两个断开连接的源存储库中的模块,通常意味着在 Perl 核心(与 perl
我想自定义站点管理员角色权限,即我需要启用一项功能来创建相应站点下的站点管理用户。我怎样才能做到这一点?我需要用 Hook 来实现它还是需要创建 EXT?或者还有其他更简单的方法来实现这一目标吗?我需
我在 uminokirin.com 有一个用榆树编写的 Conway 生命游戏的基本实现。 . 来源可见here . 该程序允许用户调整环形网格的大小、单击单元格以更改其状态以及随机化世界。它适用于我
我已经研究这段代码很长时间了,但我似乎无法弄清楚。我的代码的顶部部分用于预填充网格。但由于某种原因,我无法让我的形象按照预期移动和成长。请帮助我!! import java.util.Random;
package edu.bsu.cs121.mamurphy; import java.util.*; import java.io.*; import javax.swing
我想要生命之花,就像这个:https://jsfiddle.net/5ak8P var canvas = document.getElementById('canvas'), context
我是一名优秀的程序员,十分优秀!