我一直在玩一个简单的刽子手程序(新的计算机科学专业)的想法,这个代码,虽然在逻辑上正确和工作,打印一个奇怪的字符(╠确切地说)而不是打印下划线(_)喜欢它应该。这似乎只发生在"否则如果"陈述存在。有谁知道造成这种情况的原因是什么?
#include <stdlib.h>
#include <stdio.h>
int main(){
char w[13][3] = {
{ 'c', 'a', 't' }, //0
{ 'd', 'o', 'g' }, //1
{ 'r', 'a', 't' }, //2
{ 'e', 'e', 'l' }, //3
{ 'c', 'o', 'w' }, //4
{ 'o', 'w', 'l' }, //5
{ 'e', 'm', 'u' }, //6
{ 'b', 'a', 't' }, //7
{ 'e', 'l', 'k' }, //8
{ 'p', 'i', 'g' }, //9
{ 'b', 'e', 'e' }, //10
{ 'h', 'e', 'n' }, //11
{ 'f', 'o', 'x' }, //12
};
char u,
dis[100];
int random;
srand(time(NULL));
random = rand() % 13;
printf("%d\n", random); //check random number
printf("Enter a letter: ");
u = getchar();
for (int i = 0; i < 3; i++){
if (w[random][i] == u){
dis[i] = u;
}
else if (w[random][i] == '_'){
continue;
}
else if (w[random][i] != u && w[random][i] != '_'){
continue;
}
else {
dis[i] = '_';
}
}
for (int i = 0; i < 3; i++){
printf("%c", dis[i]);
}
printf("\n\n");
system("pause");
}
答案 0 :(得分:2)
您的第二个else if
声明,
else if (w[random][i] != u && w[random][i] != '_')
大部分时间都是真的(每当你猜不到正确的随机字母时)。由于该块中的唯一语句是continue;
,因此未设置dis[i]
。您的输出正在打印尚未初始化的字符。
替代实现将使用(例如)
int hangman=0;
char u;
int maxGuesses=10;
// Seed random part
while (hangman < maxGuesses) {
printf("%d\n", random); //check random number
printf("Enter a letter: ");
u = getchar();
for (i=0; i<3; i++) {
if (w[random][i] == u) {
// You just guessed this letter
dis[i] = u;
}
else if (dis[i] != '_') { // This requires you initialise dis[...] to '_'
// You already know this letter
continue;
}
else {
// You don't know the letter, and you guessed wrong
hangman++;
}
}
for (int i = 0; i < 3; i++){
printf("%c", dis[i]);
}
drawHangman(hangman);
for (int i = 0; i < 3; i++) {
if(dis[i] == '_') {
break;
}
// If none are == '_', then finished?
// Go to the end of the program
}
}
注意:如果您没有猜到任何字母,这将增加刽子手3次,并且还没有管理任何正确的猜测!这可能比预期的更严厉,所以可能会使用一个更好的增量系统 - 也许是一个bool,最初是假的,如果你做对了就设置为true?然后在你的for(i ...)循环之后,你可以只测试和增加一次,而不是在循环内。
答案 1 :(得分:1)
随机字符的显示由以下原因引起:
dis
未初始化。
dis[i]
未在_
循环中的几个子句中设置为for
。
在for
循环中,
for (int i = 0; i < 3; i++){
if (w[random][i] == u){
dis[i] = u;
}
else if (w[random][i] == '_'){
// Missing code to set dis[i]
continue;
}
else if (w[random][i] != u && w[random][i] != '_'){
// Missing code to set dis[i]
continue;
}
else {
dis[i] = '_';
}
}
<强>更新强>
for
循环中的代码很奇怪。
else if (w[random][i] == '_'){
条件永远不会成真。您的测试用例中的所有单词都没有'_'
。
根据您的数据,
中的条件 if (w[random][i] == u){
或
else if (w[random][i] != u && w[random][i] != '_'){
将是真的。这意味着,最后一句,
else {
dis[i] = '_';
}
永远不会被行使。
我认为您的代码可以简化为:
for (int i = 0; i < 3; i++){
if (w[random][i] == u){
dis[i] = u;
}
else {
dis[i] = '_';
}
}