Сравнение ввода (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;
}