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