1 /* main.cpp
2  * Copyright © 2015, Brian Derr <brian@derrclan.com>
3  */
4 
5 #include <csignal>
6 #include <cstdlib>
7 #include <iostream>
8 #include <unistd.h>
9 
10 #include "braincurses.h"
11 
12 
13 static const int kMinCodeLength = 4;
14 static const int kMaxCodeLength = 6;
15 
16 static const int kDefaultGuessCount = 10;
17 static const int kMinGuessCount = 1;
18 static const int kMaxGuessCount = 15;
19 
20 
PrintUsage()21 void PrintUsage() {
22   std::cerr << "usage: braincurses [-c code_length] [-g guesses]" << std::endl;
23 }
24 
ProcessArgs(int argc,char * argv[],int & code_length,int & guesses)25 void ProcessArgs(int argc, char* argv[], int& code_length, int& guesses) {
26   int opt;
27   while ((opt = getopt(argc, argv, "c:g:h")) != -1) {
28     switch (opt) {
29       case 'c':
30         code_length = atoi(optarg);
31         break;
32       case 'g':
33         guesses = atoi(optarg);
34         break;
35       case 'h':
36       default:
37         PrintUsage();
38         exit(EXIT_FAILURE);
39     }
40   }
41 
42   if (code_length > kMaxCodeLength) {
43     code_length = kMaxCodeLength;
44   } else if (code_length < kMinCodeLength) {
45     code_length = kMinCodeLength;
46   }
47 
48   if (guesses > kMaxGuessCount) {
49     guesses = kMaxGuessCount;
50   } else if (guesses <= 0) {
51     guesses = kDefaultGuessCount;
52   }
53 }
54 
endwin_atexit_handler()55 void endwin_atexit_handler() {
56   endwin();
57 }
58 
endwin_signal_handler(int signal)59 void endwin_signal_handler(int signal) {
60   endwin();
61   std::exit(EXIT_SUCCESS);
62 };
63 
main(int argc,char * argv[])64 int main(int argc, char* argv[]) {
65   int code_length = kMinCodeLength;
66   int guesses = kDefaultGuessCount;
67   ProcessArgs(argc, argv, code_length, guesses);
68 
69   Braincurses bc(code_length, guesses);
70 
71   std::signal(SIGINT, endwin_signal_handler);
72 
73   int result = std::atexit(endwin_atexit_handler);
74   if (result != 0) {
75     std::cerr << "atexit registration failed" << std::endl;
76     return EXIT_FAILURE;
77   }
78 
79   bool winner = false;
80   do {
81     winner = bc.PlayGame();
82   } while (bc.GameOverPlayAgain(winner));
83 
84   return EXIT_SUCCESS;
85 }
86