fork(1) download
  1. /* ===================================================================
  2.  * by migf1
  3.  *
  4.  * Simple Guessing Game ( comments in Greek )
  5.  * - bilingual (English, Greek)
  6.  * - 2 levels of difficulty (easy, hard)
  7.  * - player defined number of tries (MINTRIES to MAXTRIES)
  8.  *
  9.  * Απλό Παιχνίδι Εύρεσης Κρυφού Αριθμού
  10.  * - δίγλωσσο (Αγγλικά, Ελληνικά)
  11.  * - 2 επίπεδα δυσκολίας (εύκολο, δύσκολο)
  12.  * - ο παίκτης επιλέγει πλήθος προσπαθειών (από MINTRIES έως MAXTRIES)
  13.  *
  14.  * Στο εύκολο επίπεδο ο κρυφός αριθμός επιλέγεται από το 1 έως το
  15.  * γινόμενο του πλήθους προσπαθειών επί LVL_EASY_MULTI, ενώ στο
  16.  * δύσκολο επίπεδο επί LVL_HARD_MULTI (ορισμένα ως 2 και 40, αντίστοιχα).
  17.  *
  18.  * Επίσης, στο δύσκολο επίπεδο το πρόγραμμα δίνει 3 ειδών απαντήσεις
  19.  * για κάθε μαντεψιά του πάικτη: "πιο ψηλά", "πιο χαμηλά" και "το
  20.  * βρήκατε". Στο εύκολο επίπεδο δίνει 4 επιπλέον απαντήσεις:
  21.  * "πιο ψηλά (είστε πολύ κοντα)", "πιο ψηλά (είστε πολύ μακριά)",
  22.  * "πιο χαμηλά (είστε πολύ κοντα)" και "πιο χαμηλά (είστε πολύ μακριά)",
  23.  * ανάλογα αν η μαντεψιά του απέχει λιγότερο από DIFF_HOT από το κρυφό νούμερο
  24.  * ή αν απέχει περισσότερο από DIFF_COLD (ορισμένα ως 2 και 10, αντίστοιχα).
  25.  * ===================================================================
  26.  */
  27.  
  28. #include <stdio.h>
  29. #include <time.h>
  30. #include <stdlib.h>
  31.  
  32. // -------- Macros ------------
  33.  
  34. #define ABS(x) ( (x) > 0 ? (x) : -(x) )
  35.  
  36. #define MAXINBUF (255+1) // μέγιστο μήκος γραμμής εισόδου
  37. #define MINTRIES 3 // ελάχιστο πλήθος προσπαθειών
  38. #define MAXTRIES 8 // μέγιστο πλήθος προσπαθειών
  39.  
  40. #define LVL_EASY_ID 1 // ταυτότητα εύκολου επιπέδου
  41. #define LVL_EASY_MULTI 3 // πολλαπλ/στής εύκολου επιπέδου
  42. #define LVL_HARD_ID 2 // ταυτότητα δύσκολου επιπέδου
  43. #define LVL_HARD_MULTI 40 // πολλαπλ/στής δύσκολου επιπέδου
  44.  
  45. #define DIFF_HOT 2 // HOT απόσταση από κρυμμένο
  46. #define DIFF_COLD 10 // COLD απόσταση από κρυμμένο
  47.  
  48. #define MAX_MESSAGES 15 // μέγιστο πλήθος μηνυμάτων
  49.  
  50. // ------- Πρόσθετοι Τύποι -----------
  51.  
  52. typedef enum { // θέσεις στον πίνακα μηνυμάτων
  53. TXT_OUTOFBOUNDS = 0,
  54. TXT_HIGHER,
  55. TXT_HIGHERHOT,
  56. TXT_HIGHERCOLD,
  57. TXT_LOWER,
  58. TXT_LOWERHOT,
  59. TXT_LOWERCOLD,
  60. TXT_CONGRATS,
  61. TXT_FMT_TRIES,
  62. TXT_UPPERLIMIT,
  63. TXT_FMT_SETHIDDEN,
  64. TXT_FMT_PROMPT,
  65. TXT_FMT_MAXTRIES,
  66. TXT_LEVEL,
  67. TXT_FMT_LOST
  68. } MsgPos;
  69.  
  70. typedef enum { LNG_EN=1, LNG_GR } LangCode; // κωδικοί γλωσσσών
  71.  
  72. typedef struct level { // δομή επιπέδου δυσκολίας
  73. int id, multi; // ταυτότητα & πολλαπλασιαστής
  74. } Level;
  75.  
  76. // -------- Πρότυπα Συναρτήσεων --------------
  77.  
  78. const char **get_language( const char **msg_en, const char **msg_gr );
  79. void get_level( Level *level, const char *fmttext );
  80. void get_ntries( int *ntries, const char *fmttext );
  81. MsgPos hint_getpos(const int guess, const int hidden, const int lim, const int levid);
  82.  
  83. // ----------------------------------------------------------------------------
  84. int main( void )
  85. {
  86. char inbuf[ MAXINBUF ] = ""; // η γραμμή εισόδου
  87. int ntries, limit, guess = -1, hidden, count = 0;
  88. MsgPos pos; // θέση κατάλληλης απάντησης
  89. Level level = { LVL_EASY_ID, LVL_EASY_MULTI }; // επίπεδο δυσκολίας
  90.  
  91. const char **messages = NULL; // ενεργός πίνακας μηνυμάτων
  92.  
  93. const char *msg_en[MAX_MESSAGES] = { // αγγλικός πίνακας μηνυμάτων
  94. "\tout of bounds, try again\n", // TXT_OUTOFBOUNDS
  95. "\thigher\n", // TXT_HIGHER
  96. "\thigher (you're too close)\n", // TXT_HIGHERHOT
  97. "\thigher (you're far away)\n", // TXT_HIGHERCOLD
  98. "\tlower\n", // TXT_LOWER
  99. "\tlower (you're too close)\n", // TXT_LOWERHOT
  100. "\tlower (you're far away)\n", // TXT_LOWERCOLD
  101. "\nCongratulations, you found it!", // TXT_CONGRATS
  102. "\tit took you %d tries\n\n", // TXT_FMT_TRIES
  103. "Give upper limit ( greater than 1 ): ", // TXT_UPPERLIMIT
  104. "\tI set a number from 1 to %d\n\n", // TXT_FMT_SETHIDDEN
  105. "Guess #%d/%d: ", // TXT_FMT_PROMPT
  106. "\nHow many tries (%d - %d)? ", // TXT_FMT_MAXTRIES
  107. "\nSelect level (%d = easy, %d = hard): ", // TXT_LEVEL
  108. "You loose, the number was: %d\n" // TXT_FMT_LOST
  109. };
  110.  
  111. const char *msg_gr[MAX_MESSAGES] = { // ελληνικός πίνακας μηνυμάτων
  112. "\tεκτός ορίων, ξαναπροσπαθήστε\n", // TXT_OUTOFBOUNDS
  113. "\tπιο ψηλά\n", // TXT_HIGHER
  114. "\tπιο ψηλά (είστε πολύ κοντά)\n", // TXT_HIGHERHOT
  115. "\tπιο ψηλά (είστε πολύ μακριά)\n", // TXT_HIGHERCOLD
  116. "\tπιο χαμηλά\n", // TXT_LOWER
  117. "\tπιο χαμηλά (είστε πολύ κοντά)\n", // TXT_LOWERHOT
  118. "\tπιο χαμηλά (είστε πολύ μακριά)\n", // TXT_LOWERCOLD
  119. "\nΣυγχαρητήρια, το βρήκατε!", // TXT_CONGRATS
  120. "\tχρειαστήκατε %d προσπάθειες\n\n", // TXT_FMT_TRIES
  121. "Ανώτατο όριο ( μεγαλύτερο του 1 ): ", // TXT_UPPERLIMIT
  122. "\tέβαλα έναν αριθμό από το 1 έως το %d\n\n", // TXT_FMT_SETHIDDEN
  123. "Μαντεψιά #%d/%d: ", // TXT_FMT_PROMPT
  124. "\nΠόσες προσπάθειες (%d - %d); ", // TXT_FMT_MAXTRIES
  125. "\nΕπίπεδο δυσκολίας (%d = εύκολο, %d = δύσκολο); ",// TXT_LEVEL
  126. "Χάσατε, το νούμερο ήταν: %d\n" // TXT_FMT_LOST
  127. };
  128.  
  129. srand( time(NULL) ); // γεννήτρια ψευδοτυχαίων
  130.  
  131. messages = get_language( msg_en, msg_gr ); // διάβασμα γλώσσας
  132. get_level( &level, messages[TXT_LEVEL] ); // διάβσαμα επιπέδου δυσκολίας
  133. get_ntries(&ntries,messages[TXT_FMT_MAXTRIES]); // διάβασμα πλήθους προσπαθειών
  134.  
  135. limit = ntries * level.multi; // καθορισμός ανώτατου ορίου
  136. hidden = rand() % limit + 1; // επιλογή τυχαίου αριθμού
  137. printf( messages[ TXT_FMT_SETHIDDEN ], limit);
  138.  
  139. // το κεντρικό μας loop
  140. do {
  141. printf( messages[ TXT_FMT_PROMPT ], count+1, ntries);
  142. fgets(inbuf, MAXINBUF, stdin); // διάβασμα μαντεψιάς
  143. guess = atoi( inbuf ); // μετατροπή της σε int
  144.  
  145. pos = hint_getpos(guess,hidden,limit,level.id);// επιλογή απάντησης
  146. if ( pos != TXT_OUTOFBOUNDS ) // έγκυρη μαντεψιά
  147. count++; // μετρητής προσπαθειών
  148. puts( messages[ pos ] ); // τύπωμα απάντησης
  149.  
  150. } while ( count < ntries && guess != hidden);
  151.  
  152. if ( guess == hidden )
  153. printf(messages[TXT_FMT_TRIES], count); // τύπωμα προσπαθειών
  154. else
  155. printf(messages[TXT_FMT_LOST],hidden); // αποκάλυψη αριθμού
  156.  
  157. system("pause");\
  158. exit( EXIT_SUCCESS );
  159. }
  160.  
  161. // ----------------------------------------------------------------------------
  162. const char **get_language( const char **msg_en, const char **msg_gr )
  163. {
  164. char inbuf[ MAXINBUF ];
  165. LangCode dummy;
  166.  
  167. puts("Choose language / Επιλέξτε γλώσσα:");
  168. printf("\n\t%d: English\n\t%d: Ελληνικά\n", LNG_EN, LNG_GR);
  169. do {
  170. printf("> ");
  171. fgets(inbuf, MAXINBUF, stdin);
  172. dummy = atoi( inbuf );
  173. } while (dummy < LNG_EN || dummy > LNG_GR );
  174.  
  175. if ( dummy == LNG_GR )
  176. return msg_gr;
  177.  
  178. return msg_en;
  179. }
  180.  
  181. // ----------------------------------------------------------------------------
  182. void get_level( Level *level, const char *fmttext )
  183. {
  184. char inbuf[ MAXINBUF ];
  185. int dummy;
  186.  
  187. do {
  188. printf( fmttext, LVL_EASY_ID, LVL_HARD_ID );
  189. fgets(inbuf, MAXINBUF, stdin);
  190. dummy = atoi( inbuf );
  191. } while (dummy < LVL_EASY_ID || dummy > LVL_HARD_ID);
  192.  
  193. if ( dummy == LVL_EASY_ID ) {
  194. level->id = LVL_EASY_ID;
  195. level->multi = LVL_EASY_MULTI;
  196. }
  197. else {
  198. level->id = LVL_HARD_ID;
  199. level->multi = LVL_HARD_MULTI;
  200. }
  201.  
  202. return;
  203. }
  204.  
  205. // ----------------------------------------------------------------------------
  206. void get_ntries( int *ntries, const char *fmttext )
  207. {
  208. char inbuf[ MAXINBUF ];
  209.  
  210. do {
  211. printf( fmttext, MINTRIES, MAXTRIES );
  212. fgets(inbuf, MAXINBUF, stdin);
  213. *ntries = atoi( inbuf );
  214. } while ( *ntries < MINTRIES || *ntries > MAXTRIES);
  215.  
  216. return;
  217. }
  218.  
  219. // ----------------------------------------------------------------------------
  220. MsgPos hint_getpos(const int guess, const int hidden, const int lim, const int levid)
  221. {
  222. int diff;
  223.  
  224. if (guess > lim || guess < 1)
  225. return TXT_OUTOFBOUNDS;
  226.  
  227. if (guess == hidden )
  228. return TXT_CONGRATS;
  229.  
  230. if ( levid == LVL_HARD_ID)
  231. return (guess < hidden) ? TXT_HIGHER : TXT_LOWER;
  232.  
  233. diff = ABS(hidden-guess);
  234.  
  235. if (guess < hidden)
  236. {
  237. if ( diff <= DIFF_HOT )
  238. return TXT_HIGHERHOT;
  239. if ( diff > DIFF_COLD )
  240. return TXT_HIGHERCOLD;
  241. return TXT_HIGHER;
  242. }
  243.  
  244. if (guess > hidden)
  245. {
  246. if ( diff <= DIFF_HOT )
  247. return TXT_LOWERHOT;
  248. if ( diff > DIFF_COLD )
  249. return TXT_LOWERCOLD;
  250. return TXT_LOWER;
  251. }
  252.  
  253. return TXT_CONGRATS;
  254. }
  255.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty