如何解决将 X 个骰子的结果与 n 面和 C 中的常数相加
我必须编写一个程序,其中我必须将 x 个骰子的结果与 n 个面相加或减去一个常数 (C)。输入应该是这样的字符串:“xDn+-C”(x、n 和 C 必须是十进制数)。例如:“4D5+6”或“6D9-5”。 D 的意思是“骰子”。
我使用了一个函数来随机化卷,但我不知道如何继续......
void initD6(void) {
srand((unsigned)time( NULL ) );
}
int D6(void) {
return ((rand()%6)+1);
}
int main(){
char Dice[4];
for(i=0; i<5; i++){
Dice[i] = D6();
return 0;
}
我不知道如何将输入作为字符串进行加减运算,也不知道下一步该怎么做。
解决方法
- 添加结构:
struct rules
{
int dices;
int facesPerDice;
int offset;
};
- 解决骰子问题:
int throwDice(int faces)
{
return (rand() % faces) + 1;
}
int playGame(struct rules rules)
{
int result = 0;
for (int i = 0; i < rules.dices; i++)
result += throwDice(rules.facesPerDice);
return result + rules.offset;
}
- 解决解析问题:
/**
Converts a string to a unsigned int until an invalid character is found or a null character is found.
You should replace this with the function you normally use to convert a string to a integer.
*/
unsigned int stringToUInt(char *str)
{
unsigned int result = 0;
int charindex = 0;
char currentchar;
while ((currentchar = str[charindex++]) != '\0')
{
if (currentchar < '0' || currentchar > '9')
break;
result *= 10;
result += currentchar - '0';
}
return result;
}
/**
Reads a string and generates a struct rules based on it.
The string is expected to be given in the following format:
[uint]'D'[uint]['+' or '-'][uint]
where:
the first uint is the number of dices to roll
the second uint is the number of faces per dice
the third uint is the offset
Terminates the program if something goes wrong.
*/
struct rules parse(char *str)
{
struct rules result;
result.dices = stringToUInt(str);
while (*(str++) != 'D')
if (*str == '\0')
exit(1);
result.facesPerDice = stringToUInt(str);
while (*(str++) != '+' && *(str-1) != '-')
if (*str == '\0')
exit(1);
result.offset = stringToUInt(str);
result.offset *= (*(str-1) == '+' ? 1 : -1);
return result;
}
- 将所有内容放在一起:
int main(int argc,char *argv[])
{
srand(time(NULL));
char input[] = "3D6+9"; //You could use console input if you want
struct rules rules = parse(input);
int gameResult = playGame(rules);
printf("Game result: %d\n",gameResult);
return 0;
}
,
假设输入中没有错误,解决您的任务的函数是:
int throw_dice(const char* s)
{
int num,sides,res;
sscanf(s,"%iD%i%i",&num,&sides,&res);
for (int i = 0; i < num; ++i) {
res += rand() % sides + 1;
}
return res;
}
对于简单的字符串解析,sscanf()
是一个相当不错的函数。对于更复杂的任务,最好使用 regular expression 库。
像往常一样,除了最简单的骰子游戏外,不要依赖 rand()
,不涉及金钱。
您可以使用以下完整示例进行尝试:
#include <stdio.h>
int throw_dice(const char* s)
{
int num,&res);
for (int i = 0; i < num; ++i) {
res += rand() % sides + 1;
}
return res;
}
void throw_multiple_times(const char* s,int times)
{
printf("%s: ",s);
for (int i = 0; i < times; ++i) {
printf("%i ",throw_dice(s));
}
printf("\n");
}
int main(void)
{
srand((unsigned)time(NULL));
const char* s;
throw_multiple_times("4D5+6",100);
throw_multiple_times("6D9-5",100);
return 0;
}
测试它here。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。