(If你已经知道这个谜语是关于什么的了,只要读最后两行)
我看过一个谜语的视频,叫做“百名囚犯之谜”,它基本上告诉你,(一次只能一个人)进入一个房间,这个房间里有盒子,盒子的顺序是从1到100,但是盒子里的数字是随机的,每个进入房间的囚犯也是从1到100,所以每个囚犯必须选择有他的号码的盒子,每个囚犯有一组尝试(50次尝试),如果他打开50个盒子,他没有找到他的号码,他输了!例如,囚犯1号进入房间,他必须找到有他的号码的盒子。可能是7号或19号或27号盒子谁知道呢!所以这只是一场运气的游戏。或者是吗?游戏有策略和方法来数学解决难题,但这不是我的问题,我只是想在C中编程游戏,为自己解决难题,代码中有很多漏洞,所以仔细看看它,找到问题所在,谢谢大家:)!
#include <stdio.h>
#include <stdlib.h>
int main() {
int i, j = 0, k = 0, counter = 0;
int boxes[10];
int boxEntered;
for (i = 0; i <= 10; i++) \\ numbering the array
boxes[i] = i;
for (i = 0; i <= 10; i++) {
int temp = boxes[i];
int randomIndex = (rand() % 10); \\ shuffling the boxes to put random numbers
boxes[i] = boxes[randomIndex];
boxes[randomIndex] = temp;
}
for (i = 0; i <= 10; i++) {
printf("%d : (%d)\n", boxes[i], i); \\ print the boxes randomized and their index ordered
}
printf("You only have 5 tries!\n");
while (k != 5) {
while (j < 10) {
printf("Pick a box number between 0 and 10 (You are number %d)\n",counter);
scanf("%d",&boxEntered);
if (boxes[boxEntered] == boxes[counter]) {
printf("\nYou succeded, PROCEED TO NEXT PRISONER\n");
j++; \\ go to the next iteration
k = 0; \\ set tries back to 0
counter++;
} else
printf("Try again\nThe box you entered had number %d\n",boxes[boxEntered]);
k++;
if (k == 5) { \\ if player prisoner fails 5 times you break the loop
break;
}
}
}
if (counter == 10) { \\ if last prisoner was reached successfully then game is won
printf("You are freed!");
} else {
printf("You are going back heheheheheh!\n")
}
return 0;
}
正如你可以看到在这张图片的输出没有任何意义,在所有,我不知道什么是错在这里。
3条答案
按热度按时间pgccezyw1#
从代码的逻辑来看,您应该将
与
这是因为
counter
在这里似乎代表一个囚犯。取boxes[counter]
会给你一个给予盒子,这不是你想要的;你是想看看这个盒子是否和现在的犯人匹配另一个重要的注意事项是,以下代码将超出数组的范围,导致未定义的行为:
boxes
被声明为大小为10
,因此取boxes[10]
超出了界限;最大值为boxes[9]
。要解决这个问题,可以从
1
开始索引数组。要在C
中执行此操作,请使用boxes[11]
,而不是声明boxes[10]
。这将确保您可以访问boxes[10]
。然后你可以改变你的循环从
1
开始,所以类似于:请确保对代码中的每个数组和for循环进行此更改。
uemypmqf2#
给你我已经做了一些编辑到您的程序(它实际上是一个伟大的计划!- 我喜欢!我只做了一些小的修改,但它确实有效(首先,我添加了srand()函数,这样你的程序每次都会产生不同的结果。此外,主要的罪魁祸首是这一行:if(boxes[boxEntered] == boxes[counter])应该是if(boxes[boxEntered] == counter)。
ymdaylpp3#
老实说,我没有读过你的代码。只是使用单字符变量名是我的一个小毛病(无意冒犯)。总之,我目前正在写一本关于C编程语言的初学者书籍。下面的程序(用C写的)可以模拟100个囚犯问题。该程序执行1000次试验,然后最终产生结果的输出(成功率的百分比)。