Add a command line flag to disable auto-win behavior
This commit is contained in:
		
							parent
							
								
									14cd5e61bb
								
							
						
					
					
						commit
						ea1b78b9b2
					
				
							
								
								
									
										34
									
								
								src/game.c
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								src/game.c
									
									
									
									
									
								
							| @ -191,7 +191,7 @@ static void deal_cards(struct deck *deck) { | ||||
| } | ||||
| 
 | ||||
| void game_init(struct game *game, int passes_through_deck, | ||||
|                int four_color_deck) { | ||||
|                int four_color_deck, int auto_win_disable) { | ||||
|   cursor_malloc(&cursor); | ||||
|   cursor_init(cursor); | ||||
|   deck_malloc(&deck); | ||||
| @ -211,6 +211,7 @@ void game_init(struct game *game, int passes_through_deck, | ||||
|   } | ||||
| 
 | ||||
|   game->four_color_deck = four_color_deck; | ||||
|   game->auto_win_disable = auto_win_disable; | ||||
| 
 | ||||
|   fill_deck(deck); | ||||
|   shuffle_deck(deck); | ||||
| @ -227,20 +228,27 @@ void game_end() { | ||||
|   deck_free(deck); | ||||
| } | ||||
| 
 | ||||
| bool game_won() { | ||||
|   // If any card in the maneuvre stacks is covered, game is not won.
 | ||||
|   for (int i = 0; i < MANEUVRE_STACKS_NUMBER; i++) { | ||||
|     for (struct stack *j = deck->maneuvre[i]; j != NULL; j = j->next) { | ||||
|       if (j->card->face == COVERED) { | ||||
|         return (false); | ||||
| bool game_won(int auto_win_disable) { | ||||
|   if (auto_win_disable) { | ||||
|     return(stack_length(deck->foundation[0]) == 13 && | ||||
|              stack_length(deck->foundation[1]) == 13 && | ||||
|              stack_length(deck->foundation[2]) == 13 && | ||||
|              stack_length(deck->foundation[3]) == 13); | ||||
|   } else { | ||||
|     // If any card in the maneuvre stacks is covered, game is not won.
 | ||||
|     for (int i = 0; i < MANEUVRE_STACKS_NUMBER; i++) { | ||||
|       for (struct stack *j = deck->maneuvre[i]; j != NULL; j = j->next) { | ||||
|         if (j->card->face == COVERED) { | ||||
|           return (false); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // If the stock pile or the waste pile aren't empty, game is not won.
 | ||||
|   if (!stack_empty(deck->stock) || !stack_empty(deck->waste_pile)) { | ||||
|     return (false); | ||||
|   } | ||||
|     // If the stock pile or the waste pile aren't empty, game is not won.
 | ||||
|     if (!stack_empty(deck->stock) || !stack_empty(deck->waste_pile)) { | ||||
|       return (false); | ||||
|     } | ||||
| 
 | ||||
|   return (true); | ||||
|     return (true); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -33,6 +33,7 @@ | ||||
| struct game { | ||||
|   int passes_through_deck_left; | ||||
|   int four_color_deck; | ||||
|   int auto_win_disable; | ||||
| }; | ||||
| 
 | ||||
| extern struct deck *deck; | ||||
| @ -43,7 +44,7 @@ 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(struct game *, int, int); | ||||
| void game_init(struct game *, int, int, int); | ||||
| bool game_won(); | ||||
| void game_end(); | ||||
| 
 | ||||
|  | ||||
| @ -26,12 +26,14 @@ int main(int argc, char *argv[]) { | ||||
|   int passes_through_deck = 3; | ||||
|   static int four_color_deck; | ||||
|   static int no_background_color; | ||||
|   static int auto_win_disable; | ||||
|   static const struct option options[] = { | ||||
|       {"help", no_argument, NULL, 'h'}, | ||||
|       {"version", no_argument, NULL, 'v'}, | ||||
|       {"passes", required_argument, NULL, 'p'}, | ||||
|       {"four-color-deck", no_argument, &four_color_deck, 1}, | ||||
|       {"no-background-color", no_argument, &no_background_color, 1}, | ||||
|       {"auto-win-disable", no_argument, &auto_win_disable, 1}, | ||||
|       {0, 0, 0, 0}}; | ||||
| 
 | ||||
|   program_name = basename(argv[0]); | ||||
| @ -108,7 +110,7 @@ int main(int argc, char *argv[]) { | ||||
|       if (key == KEY_SPACEBAR) { | ||||
|         clear(); | ||||
|         refresh(); | ||||
|         game_init(&game, passes_through_deck, four_color_deck); | ||||
|         game_init(&game, passes_through_deck, four_color_deck, auto_win_disable); | ||||
|         break; | ||||
|       } | ||||
|     } else if (key == KEY_RESIZE) { | ||||
| @ -120,7 +122,7 @@ int main(int argc, char *argv[]) { | ||||
| 
 | ||||
|   do { | ||||
|     keyboard_event(getch()); | ||||
|   } while (!game_won()); | ||||
|   } while (!game_won(game.auto_win_disable)); | ||||
| 
 | ||||
|   endwin(); | ||||
|   game_end(); | ||||
| @ -148,6 +150,8 @@ void usage(const char *program_name) { | ||||
|          "(default: false)\n"); | ||||
|   printf("      --no-background-color  Don't draw background color        " | ||||
|          "(default: false)\n"); | ||||
|   printf("      --auto-win-disable     Disable auto-winning the game      " | ||||
|          "(default: false)\n"); | ||||
| } | ||||
| 
 | ||||
| void version() { printf("%s\n", VERSION); } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user