Math-Practice/main.cpp

145 lines
3.2 KiB
C++
Raw Normal View History

2019-03-31 18:40:37 -04:00
// TODO(dev): use 'halfdelay()' to parse input for pi menu choice 'secret.'
// NOTE(dev): Gonna need this:
// mvwprintw(win, y, x, string); /* Move to (y, x) relative to window */
// /* co-ordinates and then print */
#include <ncurses.h>
#include "Problem.h"
#include <vector>
2019-03-31 18:40:37 -04:00
#define PROMPT " > "
2019-04-01 18:47:16 -04:00
std::vector<Problem*> GenerateProblems(bool addition, bool subtraction);
char MainMenu();
2019-03-31 18:40:37 -04:00
int main(int argc, char *argv[])
{
initscr();
noecho(); // don't show user input
cbreak(); // handle user input immediately (i.e. don't wait for the user to press enter)
keypad(stdscr, true); // enable the numpad, F1-F12 keys, arrow keys, etc.
while(true)
{
// game boolean flags:
bool addition = false;
bool subtraction = false;
// Main Menu:
char menu_action = MainMenu();
if(menu_action == 'q')
break;
else if(menu_action == '1')
addition = true;
else if(menu_action == '2')
subtraction = true;
else if(menu_action == '3')
addition = subtraction = true;
else
continue; // restart loop
clear();
wrefresh(stdscr);
2019-04-01 18:47:16 -04:00
std::vector<Problem*> problems = GenerateProblems(addition, subtraction);
std::vector<Problem*>::iterator selected = problems.begin();
2019-03-31 18:40:37 -04:00
INPUT_STYLE input_style = INPUT_STYLE::INPUT_APPEND;
for(auto *problem : problems)
if(problem)
problem->Draw(problem == *selected, input_style);
2019-04-01 18:47:16 -04:00
while(selected != problems.end() && *selected)
{
Problem *current_problem = *selected;
current_problem->Draw(true, input_style); // refresh with new input
2019-04-01 18:47:16 -04:00
auto input = getch();
if(input == 'q') // early exit
break;
switch(input)
{
case KEY_LEFT:
input_style = INPUT_STYLE::INPUT_PREPEND;
2019-04-01 18:47:16 -04:00
break;
case KEY_RIGHT:
input_style = INPUT_STYLE::INPUT_APPEND;
break;
case KEY_BACKSPACE:
current_problem->ClearInput();
2019-04-01 18:47:16 -04:00
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
current_problem->Input(input_style, input);
break;
};
if(current_problem->Correct())
++selected;
current_problem->Draw(true, input_style); // refresh with new input
2019-04-01 18:47:16 -04:00
}
2019-03-31 18:40:37 -04:00
for(auto *problem : problems)
if(problem)
delete problem;
2019-03-31 18:40:37 -04:00
}
endwin();
return 0;
}
2019-04-01 18:47:16 -04:00
char MainMenu()
{
clear();
printw("\n");
printw(" Welcome to Math Practice.\n");
printw(" Please choose from the following menu:\n");
printw(" 1. Addition\n");
printw(" 2. Subtraction\n");
printw(" 3. Both / Mixed\n");
printw(" q. Quit\n");
printw("\n");
printw(PROMPT);
refresh();
return getch();
}
std::vector<Problem*> GenerateProblems(bool addition, bool subtraction)
{
std::vector<Problem*> rtn;
for(auto y = 1; y < LINES - 10; y += 9)
{
for(auto x = 2; x < COLS - 16; x += 15)
{
Problem *test = nullptr;
if(addition != subtraction)
{
if(addition)
test = new Problem(EASY_ADDITION, 3, x, y);
if(subtraction)
test = new Problem(EASY_SUBTRACTION, 3, x, y);
}
if(addition && subtraction)
{
if(rand() % 2)
test = new Problem(HARD_ADDITION, 5, x, y);
else
test = new Problem(HARD_SUBTRACTION, 5, x, y);
}
rtn.push_back(test);
}
}
return rtn;
}