Added option to control the number of passes through the deck.

This commit is contained in:
Murilo Pereira 2011-06-08 02:36:46 -03:00
parent a213bfec55
commit 7aaa0c82cb
8 changed files with 47 additions and 13 deletions

View File

@ -34,6 +34,7 @@ struct cursor {
enum movement { LEFT, DOWN, UP, RIGHT };
extern struct deck *deck;
extern struct game game;
void cursor_malloc(struct cursor **);
void cursor_init(struct cursor *);

View File

@ -64,6 +64,13 @@ void draw_card(struct card *card) {
void draw_stack(struct stack *stack) {
if (stack_empty(stack)) {
box(stack->card->frame->window, 0, 0);
if (stock_stack(stack)) {
if (game.passes_through_deck_left >= 1) {
mvwprintw(stack->card->frame->window, 2, 3, "O");
} else {
mvwprintw(stack->card->frame->window, 2, 3, "X");
}
}
wrefresh(stack->card->frame->window);
} else {
if (maneuvre_stack(stack)) {

View File

@ -11,6 +11,8 @@
#define WHITE_ON_BLUE 3
#define WHITE_ON_GREEN 4
extern struct game game;
void draw_card(struct card *);
void draw_stack(struct stack *);
void draw_deck(struct deck *);

View File

@ -43,11 +43,6 @@ static int maneuvre_begin_x(int x) {
}
}
static bool stock_stack(struct stack *stack) {
return((stack->card->frame->begin_y == STOCK_BEGIN_Y) &&
(stack->card->frame->begin_x == STOCK_BEGIN_X));
}
static bool waste_pile_stack(struct stack *stack) {
return((stack->card->frame->begin_y == WASTE_PILE_BEGIN_Y) &&
(stack->card->frame->begin_x == WASTE_PILE_BEGIN_X));
@ -61,6 +56,11 @@ static bool foundation_stack(struct stack *stack) {
stack->card->frame->begin_x == FOUNDATION_3_BEGIN_X));
}
bool stock_stack(struct stack *stack) {
return((stack->card->frame->begin_y == STOCK_BEGIN_Y) &&
(stack->card->frame->begin_x == STOCK_BEGIN_X));
}
bool maneuvre_stack(struct stack *stack) {
return(stack->card->frame->begin_y >= MANEUVRE_BEGIN_Y &&
(stack->card->frame->begin_x == MANEUVRE_0_BEGIN_X ||
@ -177,7 +177,7 @@ static void deal_cards(struct deck *deck) {
}
}
void game_init() {
void game_init(struct game *game, int passes_through_deck) {
cursor_malloc(&cursor);
cursor_init(cursor);
deck_malloc(&deck);
@ -199,6 +199,8 @@ void game_init() {
draw_cursor(cursor);
draw_deck(deck);
game->passes_through_deck_left = passes_through_deck;
}
void game_end() {

View File

@ -30,14 +30,19 @@
#define MANEUVRE_5_BEGIN_X 41
#define MANEUVRE_6_BEGIN_X 49
struct game {
int passes_through_deck_left;
};
struct deck *deck;
struct cursor *cursor;
bool maneuvre_stack(struct stack *);
bool stock_stack(struct stack *);
bool valid_move(struct stack *, struct stack *);
void move_card(struct stack **, struct stack **);
void move_block(struct stack **, struct stack **, int);
void game_init();
void game_init(struct game *, int);
bool game_won();
void game_end();

View File

@ -178,10 +178,20 @@ void keyboard_event(int key) {
break;
case KEY_SPACEBAR:
if (cursor_on_stock(cursor)) {
if (!stack_empty(deck->stock)) {
if (stack_empty(deck->stock)) {
if (game.passes_through_deck_left >= 1) {
while (!stack_empty(deck->waste_pile)) {
move_card(&(deck->waste_pile), &(deck->stock));
}
draw_stack(deck->stock);
draw_stack(deck->waste_pile);
}
} else {
move_card(&(deck->stock), &(deck->waste_pile));
if (stack_empty(deck->stock)) {
game.passes_through_deck_left--;
}
card_expose(deck->waste_pile->card);
erase_stack(deck->waste_pile);
draw_stack(deck->stock);
draw_stack(deck->waste_pile);
}

View File

@ -9,6 +9,7 @@
extern struct deck *deck;
extern struct cursor *cursor;
extern struct game game;
void keyboard_event();

View File

@ -8,6 +8,7 @@
#include "keyboard.h"
const char *program_name;
struct game game;
void draw_greeting() {
mvprintw(8, 26, "Welcome to tty-solitaire.");
@ -36,18 +37,23 @@ void version() {
int main(int argc, char *argv[]) {
int option;
int option_index;
int passes_through_deck = 3;
static const struct option options[] = {
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'v'}
{"version", no_argument, NULL, 'v'},
{"passes", required_argument, NULL, 'p'}
};
program_name = argv[0];
while ((option = getopt_long(argc, argv, "hv", options, &option_index)) != -1) {
while ((option = getopt_long(argc, argv, "hvp:", options, &option_index)) != -1) {
switch (option) {
case 'v':
version();
exit(0);
case 'p':
passes_through_deck = atoi(optarg);
break;
case 'h':
default:
usage();
@ -77,7 +83,7 @@ int main(int argc, char *argv[]) {
case KEY_SPACEBAR:
clear();
refresh();
game_init();
game_init(&game, passes_through_deck);
break;
case 'q':
case 'Q':