tty-solitaire/src/ttysolitaire.c

105 lines
2.4 KiB
C
Raw Normal View History

2011-06-06 03:42:23 +00:00
#include <stdlib.h>
#include <ncurses.h>
2011-06-03 06:09:14 +00:00
#include <locale.h>
#include <getopt.h>
2011-06-03 05:48:26 +00:00
2011-06-03 06:22:48 +00:00
#include "draw.h"
#include "game.h"
#include "keyboard.h"
const char *program_name;
2011-06-06 03:42:23 +00:00
void draw_greeting() {
mvprintw(8, 26, "Welcome to tty-solitaire.");
2011-06-06 06:15:44 +00:00
mvprintw(10, 23, "Move with the arrow keys or hjkl.");
2011-06-06 03:42:23 +00:00
mvprintw(11, 19, "Use the space bar to mark and move cards.");
mvprintw(12, 16, "After marking a card you can use m to increase ");
mvprintw(13, 17, "and n to decrease the number of marked cards.");
mvprintw(15, 19, "Press the space bar to play or q to quit.");
}
void usage() {
printf("usage: %s [-v|--version] [-h|--help]\n", program_name);
printf(" -v, --version Show the version\n");
printf(" -h, --help Show this message\n");
}
void version() {
FILE *version_file = fopen("VERSION", "rb");
char version_string[6];
fread(version_string, 1, 5, version_file);
version_string[5] = '\0';
printf("%s\n", version_string);
fclose(version_file);
}
int main(int argc, char *argv[]) {
int option;
int option_index;
static const struct option options[] = {
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'v'}
};
program_name = argv[0];
while ((option = getopt_long(argc, argv, "hv", options, &option_index)) != -1) {
switch (option) {
case 'v':
version();
exit(0);
case 'h':
default:
usage();
exit(0);
}
}
2011-06-04 20:15:12 +00:00
setlocale(LC_ALL, ""); /* Support unicode characters. */
2011-06-03 06:09:14 +00:00
initscr();
2011-06-04 20:15:12 +00:00
raw(); /* Disable line buffers. */
2011-06-03 06:09:14 +00:00
noecho();
2011-06-04 20:15:12 +00:00
keypad(stdscr, TRUE); /* Give us keyboard key symbols. */
start_color();
curs_set(FALSE); /* We have our own cursor. */
2011-06-03 06:09:14 +00:00
set_escdelay(0);
assume_default_colors(COLOR_WHITE, COLOR_GREEN);
init_pair(1, COLOR_BLACK, COLOR_WHITE);
init_pair(2, COLOR_RED, COLOR_WHITE);
init_pair(3, COLOR_WHITE, COLOR_BLUE);
init_pair(4, COLOR_WHITE, COLOR_GREEN);
2011-06-03 06:22:48 +00:00
draw_greeting();
2011-06-04 20:15:12 +00:00
int key;
do {
switch (key = getch()) {
2011-02-06 06:14:17 +00:00
case KEY_SPACEBAR:
2011-06-04 20:15:12 +00:00
clear();
refresh();
game_init();
2011-02-06 06:14:17 +00:00
break;
case 'q':
case 'Q':
2011-06-03 06:09:14 +00:00
endwin();
return(0);
}
2011-06-04 20:15:12 +00:00
} while (key != KEY_SPACEBAR);
2011-06-04 20:15:12 +00:00
do {
if ((key = getch()) == 'q' || key == 'Q') {
2011-06-03 06:09:14 +00:00
endwin();
2011-06-04 20:15:12 +00:00
game_end();
2011-06-06 03:42:23 +00:00
exit(0);
} else {
2011-06-07 03:27:43 +00:00
keyboard_event(key);
}
2011-06-06 03:42:23 +00:00
} while (!game_won());
endwin();
game_end();
printf("You won.\n");
return(0);
}