我正在用c开发一个控制台游戏: 我已经编写了函数来在控制台中打印游戏地图(像记忆匹配一样), 在每个应该包含一个字母的空格中都被替换为"?"符号
知道我设法用这个想法开发了这个功能:
rand()%26 + 65
据我所知,以下命令允许我使用整数打印字母表中的字母。
我的问题是要弄清楚如何从字母表中生成随机字符对,并将它们放置以制作完全内存工作游戏。
我对这个游戏的处理开发感到很困惑,我不知道在哪里看。 有人对如何操作有任何想法?
答案 0 :(得分:0)
请注意, rand() 功能是 pseudo random 号码生成器。即使播种其伴侣功能: srand() ,也不能保证产生纯粹的随机数。要以您描述的方式成功使用它,即从一些最小值到最大值获取唯一值列表,它需要帮助......
以下是与rand()伪随机生成器一起使用的伴随函数的示例,以提供值列表,保证唯一,介于最小值和最大值之间:
摘要:int random = (rand()/32767.0)*max;
将返回一个不大于max的数字,然后测试值> = some min。
#include <stdlib.h> //defines rand(), srand() and RAND_MAX
int randomGenerator(int min, int max)
{
int random, trying;
srand(clock());//seed the rand() function before using it
//call frequency must be less than clock tick frequency
//or values will repeat.
// (problem with the word pseudo)
trying = 1;
while(trying)
{
//random = (rand()/32767.0)*max;
random = (rand()/(float)RAND_MAX)*(max+1);
(random >= min) ? (trying = 0) : (trying = 1);
}
return random;
}
要获取所需唯一值的完整列表,请保留以前获取的值的列表(在“A”到“Z”内)并在返回时排除它们,直到您通过唯一集合排序。也许就像这个例子:
BOOL filled(int *p, size_t size)
{
int i;
BOOL results = TRUE;
for(i=0;i<size;i++)
{
if(p[i] == 0)
{
results = FALSE;
}
}
return results;
}
两个功能的示例用法:
int main(void)
{
int result, i;
int c='g';
int previous['Z'-'A'+1] = {{0}}; //size array to contain alphbet,
//initialize all elements
size_t size = sizeof(previous)/sizeof(previous[0]);
while(c != 'q')
{
while(!filled(previous, size))
{
result = randomGenerator('A', 'Z');
if( previous[result - 'A'] != 1)
{
previous[result -'A'] = 1;
printf("%c\n", result);
}
Sleep(1); // 1ms delay to avoid aliasing the clock() function
}
printf("finished!\n");
printf("'q' to quit, any other key to continue\n");
c = getchar();
memset(previous, 0, size*sizeof(int));
}
return 0;
}