如何使用C语言创建世界地图?

如何使用C语言创建世界地图?,c,procedural-generation,world-map,C,Procedural Generation,World Map,如何使用C语言创建世界地图 这里,我想生成一个1000*1000的二维世界地图数组。在数组中,陆地部分用值1标记,海洋部分用值0标记。有什么简单的方法可以创建吗?显然,没有描述大陆海岸线形状的算法;) 但是您可以使用例如Smrender(),为它提供例如OpenStreetMap或Naturalearthdata的海岸线和一条规则。让它创建一个1000x1000像素的PNG图像 编辑: 使用ImageMagick(convert),您可以直接将PNG转换为作为数组的C头文件。 转到Openstr

如何使用C语言创建世界地图


这里,我想生成一个1000*1000的二维世界地图数组。在数组中,陆地部分用值1标记,海洋部分用值0标记。有什么简单的方法可以创建吗?

显然,没有描述大陆海岸线形状的算法;)

但是您可以使用例如Smrender(),为它提供例如OpenStreetMap或Naturalearthdata的海岸线和一条规则。让它创建一个1000x1000像素的PNG图像

编辑: 使用ImageMagick(convert),您可以直接将PNG转换为作为数组的C头文件。 转到Openstreetmap.org(或谷歌地图),缩小直到看到整个世界,制作一个屏幕截图,在您喜爱的图像处理程序中打开它,将其剪切并调整大小为1000x1000,然后运行
convert input.png output.h


伯恩哈德

显然,没有一种算法可以描述大陆海岸线的形状;)

但是您可以使用例如Smrender(),为它提供例如OpenStreetMap或Naturalearthdata的海岸线和一条规则。让它创建一个1000x1000像素的PNG图像

编辑: 使用ImageMagick(convert),您可以直接将PNG转换为作为数组的C头文件。 转到Openstreetmap.org(或谷歌地图),缩小直到看到整个世界,制作一个屏幕截图,在您喜爱的图像处理程序中打开它,将其剪切并调整大小为1000x1000,然后运行
convert input.png output.h


Bernhard

您可以使用一些程序或脚本(将一些地球图像的表示形式作为输入)生成一个长的C文件,如

const char map[1000][1000] = {
  {'0', '1', //.... etc for the first fow
  },
  {'0', '0', '0', '1', //... etc
  }
  /// etc for other rows
}; 

另请参见示例。

您可以使用一些程序或脚本(将一些地球图像的表示形式作为输入)生成一个长的C文件,如

const char map[1000][1000] = {
  {'0', '1', //.... etc for the first fow
  },
  {'0', '0', '0', '1', //... etc
  }
  /// etc for other rows
}; 

另请参见示例。

几个小时前,我在游戏开发中写了一个答案,它可以帮助您,下面是,它是用javascript编写的,但翻译成c并不困难

在本例中,您填充整个0的地图,然后随机跟踪一条路径,如果您想稍后平滑地图,您可以制作一个片段,循环所有瓦特瓷砖并将其转换为陆地。如果有3个或更多的陆地瓷砖相邻,请执行40-60次,您将获得更平滑的海岸,并且在大陆上没有“洞”

编辑 用C语言的演示更新答案。 我还没有测试过它,但是如果您包括了头并检查了代码,这就是答案

//Create and populate the map
int mapsize = 100;
int map[mapsize*mapsize];

for(int t = 0; t < mapsize*mapsize; t++) map[t] = 0;

//make the path
int currPos[2] = {0,50};
map[currPos[0]+(currPos[1]*mapSize)] = 1;
int landTiles = 20000;

for(var l = 0; l < landTiles; l++){
    int dir[2] = {RANDOM_BETWEEN_-1_AND_1, RANDOM_BETWEEN_-1_AND_1};
    int next[2] = {currPos[0]+dir[0], currPos[1]+dir[1]};

    map[next[0]+(next[1]*mapSize)] = 1;
    currPos = next;
}

//Draw the map
for(var row = 0; row < mapSize; row++){
    for(var col = 0; col < mapSize; col++){
        cout << map[col+(row*mapSize)];
    }
    cout << endl;
}
//创建并填充地图
int mapsize=100;
int map[mapsize*mapsize];
对于(int t=0;tcout几个小时前,我在游戏开发中写了一个答案,它可以帮助你,下面是,它是用javascript编写的,但是翻译成c并不难

在本例中,您填充整个0的地图,然后随机跟踪一条路径,如果您想稍后平滑地图,您可以制作一个片段,循环所有瓦特瓷砖并将其转换为陆地。如果有3个或更多的陆地瓷砖相邻,请执行40-60次,您将获得更平滑的海岸,并且在大陆上没有“洞”

编辑 用C语言的演示更新答案。 我还没有测试过它,但是如果您包括了头并检查了代码,这就是答案

//Create and populate the map
int mapsize = 100;
int map[mapsize*mapsize];

for(int t = 0; t < mapsize*mapsize; t++) map[t] = 0;

//make the path
int currPos[2] = {0,50};
map[currPos[0]+(currPos[1]*mapSize)] = 1;
int landTiles = 20000;

for(var l = 0; l < landTiles; l++){
    int dir[2] = {RANDOM_BETWEEN_-1_AND_1, RANDOM_BETWEEN_-1_AND_1};
    int next[2] = {currPos[0]+dir[0], currPos[1]+dir[1]};

    map[next[0]+(next[1]*mapSize)] = 1;
    currPos = next;
}

//Draw the map
for(var row = 0; row < mapSize; row++){
    for(var col = 0; col < mapSize; col++){
        cout << map[col+(row*mapSize)];
    }
    cout << endl;
}
//创建并填充地图
int mapsize=100;
int map[mapsize*mapsize];
对于(int t=0;t当然可以:
int-world[1000][1000]={{1,1,1,0,0,…},{0,0,1,…};
你的意思是地形生成?一个简单的方法是。你只需要1000*1000/8字节。一个字节是8位。你看过:;或者?当然:
int-world[1000][1000]={{1,1,1,0,0,…},{0,0,0,1,…},}
你是说地形生成吗?一种简单可行的方法是。你只需要1000*1000/8字节。一个字节是8位。你看过:;或者?谢谢,先生。有没有更简单的方法来创建地形?确实,技术非常简单,我所做的实现非常复杂,这是一个测试,所以很难理解。你只需要使用0填充贴图,选择一个随机初始点,循环多次(在本例中为20000次),在每个循环中,脚本必须选择一个随机方向,在该位置设置一个地砖,并将该位置更新为“当前”,这将给你你在Demohanku中看到的东西,先生..还有什么更简单的方法来创建吗?事实上,技术非常简单,我所做的实现非常复杂,这是一个测试,所以很难理解。你只需要用0填充映射,选择一个随机初始点,循环很多次(示例中为20000次),在每个循环中,脚本必须选择一个随机方向,在该位置设置一个地砖,并将该位置更新为“当前”,这将提供您在演示中看到的内容