我正在编写一个基于网格的随机地图生成器。 目前,我想用各种图块填充2D数组。
在括号中是一个更具体的例子。
以下是给出的内容:
Integer Random(Range)
(即范围:0-11,输出:0-11之间的整数)
如何使用给定的图块填充此数组?
3x4地图; 6 F orrest; 4 L ake; 2 D esert ...
F F L
L D F
D F F
L F L
我确实拥有自己的实现,但我认为它的Big-O是......无穷大。 :)
当然,它永远不会完成的可能性很小;然而,这是视频游戏的一部分,我不想让玩家等待。
我真的不在乎它实施的语言是什么;伪代码会令人满意。
答案 0 :(得分:0)
这可能是其中一种方法。
#include<iostream>
#include <cstdlib>
#include <map>
using namespace std;
//Map which keeps the value for each key (2,4,6)
map<int,char> alphabet;
void initMap()
{
alphabet[2] = 'D';
alphabet[4] = 'L';
alphabet[6] = 'F';
}
int main()
{
char a[3][4];
// counter variables to keep track of d,f and l
int temp,d=0,f=0,l=0;
initMap();
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
//This determines if the generated random number is already entered in the grid. If no than breaks out. If yes than again a new random number is generated and process is iterated untill the new number is found to enter
while(1)
{
temp = rand()%4;
if(temp==0)
{
temp = 2;
}
else
{
temp = temp*2;
}
if(temp ==2 && d<2)
{
d++;
break;
}
else if(temp ==4 && l<4)
{
l++;
break;
}
else if(temp ==6 && f<6)
{
f++;
break;
}
else
{
continue;
}
}
//char value for the number temp is assigned from the alphabet map
a[i][j] = alphabet.at(temp);
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
输出:
D F L D
L L L F
F F F F
输入值或从数组中访问值时,您可以根据数字映射字母。
答案 1 :(得分:0)
如果您使用具有内置排序功能的语言,事情就会轻松得多:
C#中的代码:
int m = 3;
int n = 4; //m*n grid
int forrests = 6;
int lakes = 4;
int deserts = 2;
if (m * n != forrests + lakes + deserts)
{
//invalid input!
}
char[] tiles = new char[m * n];
for (int i = 0; i < m * n; i++)
{
if (i < forrests)
{
tiles[i] = 'F';
}
else if (i < forrests + lakes)
{
tiles[i] = 'L';
}
else
{
tiles[i] = 'D';
}
}
//preparation completed, now tiles[] looks like
//F,F,F,F,F,F,L,L,L,L,D,D
char[] output = tiles.OrderBy(t => Guid.NewGuid()).ToArray();
//output is randomly sorted from tiles
//if you really need a two-demension array
char[][] map = new char[n][];
for (int i = 0; i < n; i++)
{
map[i] = output.Skip(m * i).Take(m).ToArray();
}