Сравнение ввода (scanw/fgets) и выбранного слова (из текстового файла) не работает <ncurses.h>

Я хотел бы сделать игру для ввода текста "Падающие слова" (вы вводите слово до того, как оно упадет в нижнюю часть консоли), но я застрял, потому что я не знаю, может ли мое объявление вообще работать.

На данный момент эта функция:

  • открывает текстовый файл со списком слов

  • выбирает случайное слово из файла (я этого не сделал, нашел в сети).

  • печатает его с анимацией падения (номер столбца тоже случайный)

Проблема в том, что я понятия не имею, как сравнить переменную 'input' с текущим падающим словом. Мои попытки использования функции scanw пока не увенчались успехом, и я не уверен, что fgets будет лучше.

РЕДАКТИРОВАТЬ: я пытался с strcmp и если функция, но это не очень помогает - моя воля, чтобы слово упало, и в то же время я могу написать это слово. Если обе строки одинаковы, то должно быть напечатано "ОДНО", но это не работает, и я не знаю почему...

#include <stdlib.h>
#include <stdio.h>
#include <ncurses.h>
#include <curses.h>
#include <time.h>
#include <string.h>
#include <unistd.h>

int col = 0;
int row = 0;
extern WINDOW *stdscr;

int ruch()
{
FILE *fp = NULL;
char words[67];
char input[67];
int i = 0 , ran = 0;

while(1)
{
int ch = 0;
int each = 0;

int x = rand()%70;

//opening file
if ( ( fp = fopen("list.txt" , "r")) == NULL) {
    perror ( "could not open file");
    exit ( 1);
}

for( i = 0; fgets(words , sizeof(words) , fp) ; i++);//loop to count words in file
ran = rand() % i;//random word
rewind(fp);
for(i = 0 ; i < ran ; i++)//loop to get random word
    fgets(words , sizeof(words) , fp);
fclose(fp);
if ( words[strlen(words)-1] == '\n')
    words[strlen(words)-1] = '\0';// remove newline

//animation
for( i=0;i<22;i++)
{
    getmaxyx(stdscr, row, col);
    clear();
    mvprintw(1+i ,x , words );
    refresh();
    usleep(500000);
    ch = getch();//get a character
    if ( ch != ERR) {
        input[each] = ch;//add character to input
        each++;
        input[each] = '\0';//terminate input
        mvprintw(1, 1, input);
        if(strcmp(input,words) == 0) {
            //mvprintw(5, 1, "SAME\n");
            //return 1;
            break;

        }

        else {
            if ( strlen ( input) >= strlen ( words)) {//correct number of characters input but do not match
                clear();
                mvprintw(6, 1, "YOU TYPO'D, GAME OVER");
                return 2;
            }
        }
        continue;
    }
    //usleep(100);
    continue;
    mvprintw(6, 1, "GAME OVER");

}
continue;
 }

}

int main()
{
initscr();
srand(time(NULL));
nodelay ( stdscr, TRUE);//so getch does not wait for a character
raw();
ruch();
getch();
usleep(3000000);
endwin();
return 0;
}

Пожалуйста, имейте в виду, что я новичок в C:) Хотел бы получить помощь.

С уважением.

1 ответ

Решение
#include <stdlib.h>
#include <stdio.h>
#include <ncurses.h>
#include <curses.h>
#include <time.h>
#include <string.h>
#include <unistd.h>

int col = 0;
int row = 0;
extern WINDOW *stdscr;

int ruch()
{
    FILE *fp = NULL;
    char words[67];
    char input[67];
    int i = 0 , ran = 0;
    int ch = 0;
    int each = 0;
    srand(time(NULL));
    int x = rand()%70;

    //opening file
    if ( ( fp = fopen("list.txt" , "r")) == NULL) {
        perror ( "could not open file");
        exit ( 1);
    }

    //choosing random word from the file
    for(; fgets(words , sizeof(words) , fp) ; i++);//loop to count words in file
    ran = rand() % i;//random word
    rewind(fp);
    for(i = 0 ; i < ran ; i++)//loop to get random word
        fgets(words , sizeof(words) , fp);
    fclose(fp);
    if ( words[strlen(words)-1] == '\n')
        words[strlen(words)-1] = '\0';// remove newline

    //animation
    for( i=0;i<22;i++)
    {
        getmaxyx(stdscr, row, col);
        clear();
        mvprintw(1+i ,x , words );
        refresh();
        usleep(500000);
        ch = getch();//get a character
        if ( ch != ERR) {
            input[each] = ch;//add character to input
            each++;
            input[each] = '\0';//terminate input
            mvprintw(1, 1, input);
            if(strcmp(input,words) == 0) {
                mvprintw(5, 1, "SAME\n");
                return 1;
            }
            else {
                if ( strlen ( input) >= strlen ( words)) {//correct number of characters input but do not match
                    mvprintw(6, 1, "NOT SAME");
                    return 2;
                }
            }
        }
        usleep(100);
    }

    return 0;
}

int main()
{
    initscr();
    nodelay ( stdscr, TRUE);//so getch does not wait for a character
    raw();
    ruch();
    getch();
    usleep(3000000);
    endwin();
    return 0;
}

Это открывает файл перед циклом while. Ввод косой черты, '/', заканчивает цикл.

#include <stdlib.h>
#include <stdio.h>
#include <ncurses.h>
#include <curses.h>
#include <time.h>
#include <string.h>
#include <unistd.h>

int col = 0;
int row = 0;
extern WINDOW *stdscr;

int ruch()
{
    FILE *fp = NULL;
    char words[67];
    char input[67];
    char score[80] = {"Score\n"};
    int i = 0 , ran = 0;
    int ch = 0;
    int each = 0;
    int points = 0;
    int filewords = 0;
    int x = 0;

    //opening file
    if ( ( fp = fopen("list.txt" , "r")) == NULL) {
        perror ( "could not open file");
        exit ( 1);
    }
    for( filewords = 0; fgets(words , sizeof(words) , fp) ; filewords++);//loop to count words in file

    while ( 1) {
        //choosing random word from the file
        ran = rand() % filewords;//random word
        rewind(fp);
        for(i = 0 ; i < ran ; i++)//loop to get random word
            fgets(words , sizeof(words) , fp);
        if ( words[strlen(words)-1] == '\n')
            words[strlen(words)-1] = '\0';// remove newline

        x = rand()%(col - strlen(words));

        clear();
        mvprintw(0, (col - strlen ( score))/2, score);
        mvprintw(1, (col - strlen ( score))/2, "To end, type a '/'.  Get ready...");
        refresh();
        usleep(2000000);

        //animation
        for( i=0;i<row-1;i++)
        {
            clear();
            mvprintw(0, (col - strlen ( score))/2, score);
            mvprintw(1+i ,x , words );
            refresh();
            usleep(400000);
            ch = getch();//get a character
            if ( ch != ERR) {
                if ( ch == '/') {
                    fclose(fp);//close the file
                    return 0;
                }
                input[each] = ch;//add character to input
                each++;
                input[each] = '\0';//terminate input
                mvprintw(1, 1, input);
                if(strcmp(input,words) == 0) {
                    points += strlen ( words) + ( row - i);
                    sprintf ( score, "Score %d correct\n", points);
                    each = 0;
                    break;
                }
                else {
                    if ( strlen ( input) >= strlen ( words)) {//correct number of characters input but do not match
                        points -= (int)(strlen ( words));
                        sprintf ( score, "Score %d typo %s %s\n", points, words, input);
                        each = 0;
                        break;
                    }
                }
            }
        }
        if ( i == row - 1) {
            points -= row;
            sprintf ( score, "Score %d timeout\n", points);
        }
        each = 0;
        getch();
    }
}

int main()
{
    srand(time(NULL));
    initscr();
    nodelay ( stdscr, TRUE);//so getch does not wait for a character
    raw();
    getmaxyx(stdscr, row, col);
    ruch();
    getch();
    usleep(30000);
    endwin();
    return 0;
}
Другие вопросы по тегам