Справка по программе Hangman (Программирование от вводного к C) - PullRequest
0 голосов
/ 23 ноября 2010

Я потратил много часов, работая над этой программой, которая должна играть в игру палача.

Задание выглядит следующим образом: В этой модифицированной игре Палач компьютер выбирает секретное слово и игрокдолжен угадать буквы в слове.Секретное слово отображается в виде серии * (количество отображаемых * указывает количество букв в слове).Каждый раз, когда игрок угадывает букву в слове, соответствующие * заменяются на правильно угаданные буквы.Игра заканчивается, когда игрок правильно угадывает все слово (игрок выигрывает) или когда игрок использует все свои ходы (игрок проигрывает).Игроку будет разрешено не более 7 неверных догадок.

Я довольно далеко продвинулся, но чувствую, что запутался в нескольких элементарных местах.Я пытаюсь отладить его, но не могу пройти часть, где я получаю ошибку в основной функции каждый раз, когда я передаю функцию 'findChars', говоря, что она "делает указатель из целого числа без приведения в аргумент 2".

Я прошу прощения за все чтение, но любая помощь будет отличной.Спасибо.

<</p>

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <time.h> /* contains prototype for function time */
#define MAX 10


int findChars(char* gameWord[], char secretWord[], int length);

int main (void) {
const int numberOfWords = 20;
int length;
srand((unsigned)time(NULL)); //generate a random seed based on time so it's different every time
int ran = rand()% numberOfWords; //Generate a random number between 0 to numberOfWords - 1
char* dictionary[] = {"who", "lives", "in","a", "pineapple", "under","the", "sea", "absorbant",
            "and", "yellow", "porous","is", "he", "sponge","bob", "square","pants","crabby","patties"}; //array of word strings

printf("%s\n", dictionary[ran]);

printf("Welcome to HANGMAN.\n\n You will be asked to guess the computer's secret word. The word will be displayed as a number of *'s.\n Every time you guess a letter correctly, that letter will be shown in its correct position in the word.  \nIf you guess incorrectly, the number of tries you have left will be decremented.  \nYou will be given a maximum of 7 incorrect guesses.\n");

length=strlen(dictionary[ran]);
printf("%d\n", length);
char secretWord[MAX];
secretWord[length]=*dictionary[ran];

char* gameWord[length];

int i;
for (i=0; i<length; i++){
    gameWord[i]= "*";
}

for (i=0; i<length; i++){
    printf("%s", gameWord[i]);
}
printf("\n");
printf("7 turns left \nEnter a letter:    \n");

while(findChars(&gameWord[length], secretWord[length], length)!=0) {
    (findChars(&gameWord[length], secretWord[length], length));
}
    printf("6 turns left \nEnter a letter:    \n");

while(findChars(&gameWord[length], secretWord[length], length)!=0) {
    (findChars(&gameWord[length], secretWord[length], length));
}
    printf("5 turns left \nEnter a letter:    \n");

while(findChars(&gameWord[length], secretWord[length], length)!=0) {
    (findChars(&gameWord[length], secretWord[length], length));
}
    printf("4 turns left \nEnter a letter:    \n");

while(findChars(&gameWord[length], secretWord[length], length)!=0) {
    (findChars(&gameWord[length], secretWord[length], length));
}
    printf("3 turns left \nEnter a letter:    \n");

while(findChars(&gameWord[length], secretWord[length], length)!=0) {
    (findChars(&gameWord[length], secretWord[length], length));
}
    printf("2 turns left \nEnter a letter:    \n");

while(findChars(&gameWord[length], secretWord[length], length)!=0) {
    (findChars(&gameWord[length], secretWord[length], length));
}
    printf("1 turns left \nEnter a letter:    \n");

while(findChars(&gameWord[length], secretWord[length], length)!=0) {
    (findChars(&gameWord[length], secretWord[length], length));
}
    printf("Sorry, no more turns left. The secret word was ???");

return 0;
}

//PRE: findChar inputs the character we are looking for, the string we are looking in.
//POST: the function outputs the number of occurances of the said character in the said array

int findChars(char* gameWord[],char secretWord[], int length) {
int i;
char character[MAX];
    while((getchar()) != '\n'){
        character[0]=getchar();
        for (i=0; i<length; i++){
            if (secretWord[i]==character[0]){
                strncpy(gameWord[i],secretWord[i],1);
                for (i=0; i<length; i++){
                    printf("%s", gameWord[i]);
                    return 1;
                }
            }
            else
                return 0;
        }
    return 0;
    }
return 0;
}

>

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Попробуйте изменить:

char secretWord[MAX];
secretWord[length]=*dictionary[ran];

и

char* gameWord[length];

до

char* secretWord = dictionary[ran];

и

char gameWord[length];

Прямо сейчас вы назначаете только первый символ dictionary[ran] персонажу в позиции length в секретном слове.

(Если вы собираетесь печатать gameWord, вам также придется выделить место и установить для него нулевой терминатор).

Затем измените

findChars(&gameWord[length], secretWord[length], length)

до:

findChars(gameWord, secretWord, length)

как вы сейчас передаете char функции, ожидающей char*. Вам также необходимо изменить подпись findChars на:

int findChars(char* gameWord, char* secretWord, int length)

Есть много других вещей, на которые можно возразить, но это должно помочь вам начать. На что посмотреть:

  • Помещение семерки while(findChars... в петлю
  • Не используйте strncpy(gameWord[i],secretWord[i],1); для назначения одного символа из одной строки в другую
  • Неправильно printf форматирование
  • Петля for (i=0; i<length; i++){ в findChars возвращает в первой итерации
0 голосов
/ 23 ноября 2010

Попробуйте сравнить, как объявлена ​​функция с тем, как вызывается функция, чтобы понять сообщения об ошибках.

Функция findChars () объявляется так:

int findChars(char* gameWord[], char secretWord[], int length);

и вызывается из main () следующим образом:

findChars(&gameWord[length], secretWord[length], length)

Обратите внимание, в частности, что второй аргумент объявляется как массив символов (строка), а вы передаете ему один символ.

0 голосов
/ 23 ноября 2010

Я думаю, что есть проблема в том, как вы указываете параметры для findChars.

В основном, когда у вас есть звонки типа findChars(&gameWord[length], secretWord[length], length), я думаю, вам нужны звонки типа findChars(gameWord, secretWord, length).

Прототип будет ...

int findChars(char gameWord[], char secretWord[], int length);

или ...

int findChars(char* gameWord, char* secretWord, int length);

а не ...

int findChars(char* gameWord[], char secretWord[], int length);

То есть gameWord и secretWord должны передаваться либо как массивы, либо как указатели, но не как массивы из указателей.

Аналогично, когда вы объявляете gameWord в main, это должен быть массив символов, а не массив указателей на символы ...

char gameWord [length+1];

Меня это немного беспокоит, потому что length - это переменная, но я думаю, что все в порядке - мой C немного устарел, и я автоматически объявляю размеры массивов с помощью константных выражений времени компиляции (самое большое размер вам может понадобиться).

Кстати - обратите внимание на +1. Строка C имеет дополнительный символ - нулевой терминатор - который не учитывается strlen - хотя вы должны учитывать это при объявлении переменной char-array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...