Случайное число в проклятиях C - PullRequest
0 голосов
/ 06 декабря 2018

Я занимаюсь этой программой на С в течение трех месяцев в свободное от учебы и веселья время.Я пытаюсь создать файл curses в C для самого первого раза, но я, честно говоря, даже не знаю, что такое curses и ncurses, потому что они в любом случае одинаковы ... поэтому я хотел сделать простую квадратную коробку с предположениемправильный номер внутри коробки, чтобы проверить это.Я успешно создал коробку, которая включена в ниже.Я хотел сделать символьные клавиши, которые я только что добавил, внутри поля с клавишами Q для Quit и C для сброса или сброса в getchar, используя циклы while-do для угадывания правильного или неправильного числа, включая подсчет, сколько раз выдогадался.Кстати: я использовал indent для форматированных кодов в системе Linux.

Итак, сначала я только что узнал, как создать коробку на экранном шоу, как это (включая код):

      lqqqqqqqqqqqqqqqqqqk
      xthis is my box    x
      x                  x
      x                  x
      x                  x
      x                  x
      x                  x
      x                  x
      x                  x
      mqqqqqqqqqqqqqqqqqqj

Код для «Это моя коробка»:

#include <stdio.h>
#include <ncurses.h>

int
main (int argc, char **argv)
{

  initscr ();
  int height, width, start_y, start_x;
  height = 10;
  width = 20;
  start_y = start_x = 10;

  WINDOW *win = newwin (height, width, start_y, start_x);
  refresh ();

  box (win, 0, 0);
  mvwprintw (win, 1, 1, "this is my box");
  wrefresh (win);

  int c = getch ();

  endwin ();



  return 0;
}

Мой исходный код, над которым я работал почти три дня:

#include <stdio.h>
#include <ncurses.h> /*This is similar as curses file*/
//using namespace std;

int
main (int argc, char **argv)
{

  initscr ();
  int height, width, start_y, start_x;
  int tries, num, guess;

  srand(time(0)); //random number generator
  num = rand() % 100 +1; //only 1 through 100


  height = 10;
  width = 20;
  start_y = start_x = 10;

  WINDOW *win = newwin (height, width, start_y, start_x);
  refresh ();


  box (win, 0, 0);
  mvwprintw (win, 1, 1, "Guess the correct number!\n");

  do {
  while((ch = getch()) != ERR) {
    switch(ch) {
    case 'Q': shutdown();
      case 'C': clear(); break;
   }

  printf("Enter your guess number (1-100): ");
  scanf("%d", &guess);
  tries++;

  if (guess > num){
    printf("Try Again Next Time! Press any key to exit!\n");
  } else if (guess < num){

   printf("Try again...\n");
  } else {

    printf("\nCORRECT! You got it right after %d guesses!", tries);
 }
}
  wrefresh (win);


  endwin ();



  return 0;
}

Это мое ожидание от моей идеи (я скопировал вывод и отредактировал его, например,):

  lqqqqqqqqqqqqqqqqqqk
  xGuess the correct x
  xnumber!           x
  x                  x
  xEnter your guess  x
  xnumber (1-100):___x
  x                  x
  xTry again...      x
  x                  x
  mqqqqqqqqqqqqqqqqqqj

для ожидаемого вывода, я все еще могу редактировать размеры, но пока использую текущий размер.Если только вы не хотите добавить «авторазмер», это было бы мило.Спасибо за чтение и помощь.

1 Ответ

0 голосов
/ 06 декабря 2018

Вот мои два цента, чтобы помочь вам, но, пожалуйста, принимайте все в этом растворе с зерном соли, потому что этот раствор может содержать некоторые глупые вещи ...

Может быть, вы можете выбрать части или, по крайней мере, узнать, какне делать из этого.Пример для 0-10 для более простого тестирования ... измените их, как хотите, изменив определения / константы MAXVALUE и MINVALUE, чтобы они соответствовали этим ...

Удачи и хорошего дня.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ncurses.h>


// PREDEFINED VALUES FOR DEFINING NON CHANGING VALUES IN CODE THIS CASE
#define WINDOWHEIGHT 20
#define WINDOWWIDTH 60
#define WINDOWSTARTX 0
#define WINDOWSTARTY 0
#define CORRECT 1
#define INCORRECT 0
#define START 2
#define WRONGFORMAT 3
#define MAXVALUE 10
#define MINVALUE 0
// PREDEFINED VALUES FOR DEFINING NON CHANGING VALUES IN THIS CASE


// initialising global structure for saving amount of right and wrong guesses and number to compare with.
struct game {
        int rightGuesses;
        int wrongGuesses;
        int rightNumber;
} myGame;

void initializeGame()
{

        // Returns a pseudo-random integer between 0 and MAXVALUE.
        int randomNumber = rand() % MAXVALUE;
        myGame.rightGuesses=0;
        myGame.rightNumber=randomNumber;
}

WINDOW *create_newwin(int height, int width, int starty, int startx)
{
        WINDOW *local_win;
        local_win = newwin(height, width, starty, startx);
        box(local_win, 0, 0);
        wrefresh(local_win);
        return local_win;
}


int getGuess()
{
        int guess=0;
        char guessString[32];
        scanf("%s", guessString);

        // Read number as string by using scanf, but convert to int for comparison with atoi()
        guess= atoi(guessString);
        size_t allowedEntries = strspn(guessString, "0123456789");

        // Some checking if guess was between allowed range + its a number + checking if answer is correct or not
        if(guess>=MINVALUE && guess<=MAXVALUE && guessString[allowedEntries] == '\0')
        {
                if(guess==myGame.rightNumber)
                        return CORRECT;
                else
                        return INCORRECT;
        }
        else
                return WRONGFORMAT;

}

/**
    Function for updating views regarding the input values...
 **/

void updateWindowTexts(WINDOW* window, int state)
{

        char* greetingsString = "Guess the correct number!";
        char* instructionsString = "Enter number 0-10 and press enter";
        char* correctGuess = "That was correct! Lets play again";
        char* incorrectGuess = "Sorry that was not right";
        char* wrongFormat = "incorrect number, please enter number between 0-10";
        char* correctAnswersString = "Correct answers:";
        char correctAnswers[32];
        char wrongAnswers[32];
        const char rightAnswersBase[] = "Right numbers so far: ";
        sprintf(correctAnswers, "%s%d", rightAnswersBase, myGame.rightGuesses);
        const char wrongAnswersBase[] = "Wrong numbers so far: ";
        sprintf(wrongAnswers, "%s%d", wrongAnswersBase, myGame.wrongGuesses);


        wclear(window);
        box (window, 0, 0);

        mvwprintw (window, 1, (WINDOWWIDTH/2)-(strlen(greetingsString)/2), greetingsString);
        mvwprintw (window, (WINDOWHEIGHT-3), (WINDOWWIDTH/2)-(strlen(correctAnswers)/2), correctAnswers);
        mvwprintw (window, (WINDOWHEIGHT-2), (WINDOWWIDTH/2)-(strlen(wrongAnswers)/2), wrongAnswers);
        mvwprintw (window, (WINDOWHEIGHT/2), (WINDOWWIDTH/2)-(strlen(instructionsString)/2), instructionsString);


        switch (state) {
        case START:
                break;
        case CORRECT:
                mvwprintw (window, WINDOWHEIGHT-5, (WINDOWWIDTH/2)-(strlen(correctGuess)/2), correctGuess);
                myGame.rightGuesses++;
                break;
        case INCORRECT:
                mvwprintw (window, (WINDOWHEIGHT-5), (WINDOWWIDTH/2)-(strlen(incorrectGuess)/2), incorrectGuess);
                myGame.wrongGuesses++;
                break;
        case WRONGFORMAT:
                mvwprintw (window, (WINDOWHEIGHT-5), (WINDOWWIDTH/2)-(strlen(wrongFormat)/2), wrongFormat);
                break;

        }
        wrefresh (window);

}

int main (int argc, char **argv)
{
        WINDOW *my_win;
        initscr();
        // Here we call crea_newwin to make new window, paremeters are static and defined at the top of file
        // You can try to play with these numbers
        my_win = create_newwin(WINDOWHEIGHT, WINDOWWIDTH, WINDOWSTARTY, WINDOWSTARTX);
        // Initialization of random generator, should only be called once.
        srand(time(NULL));

        initializeGame();
        // Update window once before enteringing loop
        updateWindowTexts(my_win,START);
        while(1)
        {
                updateWindowTexts(my_win,getGuess());
        }
        return 0;
}
...