Implemented game#valid_move.
This commit is contained in:
parent
854184c2fd
commit
e7706dfa4b
@ -66,8 +66,6 @@ void erase_stack(struct stack *stack) {
|
|||||||
box(empty_stack, 0, 0);
|
box(empty_stack, 0, 0);
|
||||||
wrefresh(empty_stack);
|
wrefresh(empty_stack);
|
||||||
delwin(empty_stack);
|
delwin(empty_stack);
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_empty_stacks() {
|
void draw_empty_stacks() {
|
||||||
@ -198,7 +196,16 @@ void draw_card(struct card *card) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void draw_stack(struct stack *stack) {
|
void draw_stack(struct stack *stack) {
|
||||||
if (!empty(stack)) {
|
erase_stack(stack);
|
||||||
|
if (empty(stack)) {
|
||||||
|
WINDOW *empty_stack = newwin(FRAME_HEIGHT,
|
||||||
|
FRAME_WIDTH,
|
||||||
|
stack->card->frame->start_y,
|
||||||
|
stack->card->frame->start_x);
|
||||||
|
box(empty_stack, 0, 0);
|
||||||
|
wrefresh(empty_stack);
|
||||||
|
delwin(empty_stack);
|
||||||
|
} else {
|
||||||
if (maneuvre_stack(stack)) {
|
if (maneuvre_stack(stack)) {
|
||||||
struct stack *reversed_stack = reverse(stack);
|
struct stack *reversed_stack = reverse(stack);
|
||||||
|
|
||||||
|
71
lib/game.c
71
lib/game.c
@ -8,23 +8,82 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
|
|
||||||
|
bool stock_stack(struct stack *stack) {
|
||||||
|
return(stack && stack->card && stack->card->frame &&
|
||||||
|
(stack->card->frame->start_y == STOCK_STARTING_Y) &&
|
||||||
|
(stack->card->frame->start_x == STOCK_STARTING_X));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool waste_pile_stack(struct stack *stack) {
|
||||||
|
return(stack && stack->card && stack->card->frame &&
|
||||||
|
(stack->card->frame->start_y == WASTE_PILE_STARTING_Y) &&
|
||||||
|
(stack->card->frame->start_x == WASTE_PILE_STARTING_X));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool foundation_stack(struct stack *stack) {
|
||||||
|
return(stack && stack->card && stack->card->frame &&
|
||||||
|
stack->card->frame->start_y == FOUNDATION_STARTING_Y &&
|
||||||
|
(stack->card->frame->start_x == FOUNDATION_0_STARTING_X ||
|
||||||
|
stack->card->frame->start_x == FOUNDATION_1_STARTING_X ||
|
||||||
|
stack->card->frame->start_x == FOUNDATION_2_STARTING_X ||
|
||||||
|
stack->card->frame->start_x == FOUNDATION_3_STARTING_X));
|
||||||
|
}
|
||||||
|
|
||||||
bool maneuvre_stack(struct stack *stack) {
|
bool maneuvre_stack(struct stack *stack) {
|
||||||
return(stack->card->frame->start_y >= MANEUVRE_STACKS_STARTING_Y);
|
return(stack && stack->card && stack->card->frame &&
|
||||||
|
stack->card->frame->start_y >= MANEUVRE_STACKS_STARTING_Y &&
|
||||||
|
(stack->card->frame->start_x == MANEUVRE_0_STARTING_X ||
|
||||||
|
stack->card->frame->start_x == MANEUVRE_1_STARTING_X ||
|
||||||
|
stack->card->frame->start_x == MANEUVRE_2_STARTING_X ||
|
||||||
|
stack->card->frame->start_x == MANEUVRE_3_STARTING_X ||
|
||||||
|
stack->card->frame->start_x == MANEUVRE_4_STARTING_X ||
|
||||||
|
stack->card->frame->start_x == MANEUVRE_5_STARTING_X ||
|
||||||
|
stack->card->frame->start_x == MANEUVRE_6_STARTING_X));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool valid_move(struct stack *origin, struct stack *destination) {
|
||||||
|
if (stock_stack(origin)) {
|
||||||
|
if (waste_pile_stack(destination)) {
|
||||||
|
return(true);
|
||||||
|
} else {
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
} else if (waste_pile_stack(origin)) {
|
||||||
|
if (foundation_stack(destination) || maneuvre_stack(destination)) {
|
||||||
|
return(true);
|
||||||
|
} else {
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
} else if (foundation_stack(origin)) {
|
||||||
|
if ((foundation_stack(destination) && origin != destination) || maneuvre_stack(destination)) {
|
||||||
|
return(true);
|
||||||
|
} else {
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
} else if (maneuvre_stack(origin)) {
|
||||||
|
if ((maneuvre_stack(destination) && origin != destination) || foundation_stack(destination)) {
|
||||||
|
return(true);
|
||||||
|
} else {
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void move_card(struct stack **origin, struct stack **destination) {
|
void move_card(struct stack **origin, struct stack **destination) {
|
||||||
struct stack *stack = NULL;
|
struct stack *stack;
|
||||||
|
|
||||||
(*origin)->card->frame->start_x = (*destination)->card->frame->start_x;
|
if (!empty(*origin)) {
|
||||||
(*origin)->card->frame->start_y = (*destination)->card->frame->start_y;
|
(*origin)->card->frame->start_x = (*destination)->card->frame->start_x;
|
||||||
|
(*origin)->card->frame->start_y = (*destination)->card->frame->start_y;
|
||||||
|
}
|
||||||
if (!empty(*destination) && maneuvre_stack(*destination)) {
|
if (!empty(*destination) && maneuvre_stack(*destination)) {
|
||||||
(*origin)->card->frame->start_y++;
|
(*origin)->card->frame->start_y++;
|
||||||
}
|
}
|
||||||
if ((stack = pop(origin))) {
|
if ((stack = pop(origin))) {
|
||||||
push(destination, stack->card);
|
push(destination, stack->card);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_stacks_initial_coordinates(struct deck *deck) {
|
static void set_stacks_initial_coordinates(struct deck *deck) {
|
||||||
|
@ -34,6 +34,8 @@ extern const char *program_name;
|
|||||||
struct deck *deck;
|
struct deck *deck;
|
||||||
struct cursor *cursor;
|
struct cursor *cursor;
|
||||||
|
|
||||||
|
bool valid_move(struct stack *, struct stack *);
|
||||||
|
bool maneuvre_stack(struct stack *);
|
||||||
void move_card(struct stack **, struct stack **);
|
void move_card(struct stack **, struct stack **);
|
||||||
void greet_player();
|
void greet_player();
|
||||||
void initialize_game();
|
void initialize_game();
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
#include "card.h"
|
#include "card.h"
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
@ -90,19 +91,19 @@ static void handle_card_movement(struct cursor *cursor) {
|
|||||||
move_cursor(cursor, RIGHT);
|
move_cursor(cursor, RIGHT);
|
||||||
break;
|
break;
|
||||||
case KEY_SPACEBAR:
|
case KEY_SPACEBAR:
|
||||||
if (!cursor_on_invalid_spot(cursor) &&
|
destination = cursor_stack(cursor);
|
||||||
!cursor_on_stock(cursor) &&
|
if (valid_move(origin, destination)) {
|
||||||
!cursor_on_stack(cursor, origin)) {
|
|
||||||
destination = cursor_stack(cursor);
|
|
||||||
move_card(&origin, &destination);
|
move_card(&origin, &destination);
|
||||||
draw_stack(origin);
|
draw_stack(origin);
|
||||||
draw_stack(destination);
|
draw_stack(destination);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
case 'q':
|
||||||
|
case 'Q':
|
||||||
|
end_curses();
|
||||||
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle_keyboard_event(int key) {
|
void handle_keyboard_event(int key) {
|
||||||
@ -131,6 +132,4 @@ void handle_keyboard_event(int key) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include "test_helper.h"
|
||||||
#include "../lib/card.h"
|
#include "../lib/card.h"
|
||||||
|
|
||||||
void test_initialize_card() {
|
void test_initialize_card() {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include "test_helper.h"
|
||||||
#include "../lib/frame.h"
|
#include "../lib/frame.h"
|
||||||
|
|
||||||
void test_initialize_frame() {
|
void test_initialize_frame() {
|
||||||
|
404
test/game_test.c
404
test/game_test.c
@ -94,8 +94,8 @@ void test_move_card_from_non_empty_stack_to_non_empty_stack() {
|
|||||||
allocate_card(&card[1]);
|
allocate_card(&card[1]);
|
||||||
initialize_card(card[0]);
|
initialize_card(card[0]);
|
||||||
initialize_card(card[1]);
|
initialize_card(card[1]);
|
||||||
set_card(card[0], ACE, SPADES, EXPOSED, 1, 1);
|
set_card(card[0], ACE, SPADES, EXPOSED, 99, 99);
|
||||||
set_card(card[1], KING, HEARTS, EXPOSED, 1, 1);
|
set_card(card[1], KING, HEARTS, EXPOSED, 99, 99);
|
||||||
|
|
||||||
allocate_stack(&origin);
|
allocate_stack(&origin);
|
||||||
allocate_stack(&destination);
|
allocate_stack(&destination);
|
||||||
@ -116,7 +116,407 @@ void test_move_card_from_non_empty_stack_to_non_empty_stack() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_stock_to_stock() {
|
||||||
|
struct stack *stock_0, *stock_1;
|
||||||
|
|
||||||
|
allocate_stack(&stock_0);
|
||||||
|
allocate_stack(&stock_1);
|
||||||
|
initialize_stack(stock_0);
|
||||||
|
initialize_stack(stock_1);
|
||||||
|
set_card(stock_0->card, ACE, SPADES, EXPOSED, STOCK_STARTING_Y, STOCK_STARTING_X);
|
||||||
|
set_card(stock_1->card, KING, HEARTS, EXPOSED, STOCK_STARTING_Y, STOCK_STARTING_X);
|
||||||
|
assert(!valid_move(stock_0, stock_0));
|
||||||
|
assert(!valid_move(stock_0, stock_1));
|
||||||
|
assert(!valid_move(stock_1, stock_0));
|
||||||
|
assert(!valid_move(stock_1, stock_1));
|
||||||
|
free_stack(stock_0);
|
||||||
|
free_stack(stock_1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_stock_to_waste_pile() {
|
||||||
|
struct stack *stock, *waste_pile;
|
||||||
|
|
||||||
|
allocate_stack(&stock);
|
||||||
|
allocate_stack(&waste_pile);
|
||||||
|
initialize_stack(stock);
|
||||||
|
initialize_stack(waste_pile);
|
||||||
|
set_card(stock->card, ACE, SPADES, EXPOSED, STOCK_STARTING_Y, STOCK_STARTING_X);
|
||||||
|
set_card(waste_pile->card, KING, HEARTS, EXPOSED, WASTE_PILE_STARTING_Y, WASTE_PILE_STARTING_X);
|
||||||
|
assert(valid_move(stock, waste_pile));
|
||||||
|
free_stack(stock);
|
||||||
|
free_stack(waste_pile);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_stock_to_foundation_stacks() {
|
||||||
|
struct stack *stock, *foundation_stacks[4];
|
||||||
|
|
||||||
|
allocate_stack(&stock);
|
||||||
|
initialize_stack(stock);
|
||||||
|
set_card(stock->card, ACE, SPADES, EXPOSED, STOCK_STARTING_Y, STOCK_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
allocate_stack(&foundation_stacks[i]);
|
||||||
|
initialize_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_0_STARTING_X);
|
||||||
|
set_card(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_1_STARTING_X);
|
||||||
|
set_card(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_2_STARTING_X);
|
||||||
|
set_card(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_3_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
assert(!valid_move(stock, foundation_stacks[i]));
|
||||||
|
}
|
||||||
|
free_stack(stock);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
free_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_stock_to_maneuvre_stacks() {
|
||||||
|
struct stack *stock, *maneuvre_stacks[7];
|
||||||
|
|
||||||
|
allocate_stack(&stock);
|
||||||
|
initialize_stack(stock);
|
||||||
|
set_card(stock->card, ACE, SPADES, EXPOSED, STOCK_STARTING_Y, STOCK_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
allocate_stack(&maneuvre_stacks[i]);
|
||||||
|
initialize_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_0_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_1_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_2_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_3_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_4_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_5_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_6_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
assert(!valid_move(stock, maneuvre_stacks[i]));
|
||||||
|
}
|
||||||
|
free_stack(stock);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
free_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_waste_pile_to_stock() {
|
||||||
|
struct stack *stock, *waste_pile;
|
||||||
|
|
||||||
|
allocate_stack(&stock);
|
||||||
|
allocate_stack(&waste_pile);
|
||||||
|
initialize_stack(stock);
|
||||||
|
initialize_stack(waste_pile);
|
||||||
|
set_card(stock->card, ACE, SPADES, EXPOSED, STOCK_STARTING_Y, STOCK_STARTING_X);
|
||||||
|
set_card(waste_pile->card, KING, HEARTS, EXPOSED, WASTE_PILE_STARTING_Y, WASTE_PILE_STARTING_X);
|
||||||
|
assert(!valid_move(waste_pile, stock));
|
||||||
|
free_stack(stock);
|
||||||
|
free_stack(waste_pile);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_waste_pile_to_waste_pile() {
|
||||||
|
struct stack *waste_pile_0, *waste_pile_1;
|
||||||
|
|
||||||
|
allocate_stack(&waste_pile_0);
|
||||||
|
allocate_stack(&waste_pile_1);
|
||||||
|
initialize_stack(waste_pile_0);
|
||||||
|
initialize_stack(waste_pile_1);
|
||||||
|
set_card(waste_pile_0->card, ACE, SPADES, EXPOSED, WASTE_PILE_STARTING_Y, WASTE_PILE_STARTING_X);
|
||||||
|
set_card(waste_pile_1->card, KING, HEARTS, EXPOSED, WASTE_PILE_STARTING_Y, WASTE_PILE_STARTING_X);
|
||||||
|
assert(!valid_move(waste_pile_0, waste_pile_0));
|
||||||
|
assert(!valid_move(waste_pile_0, waste_pile_1));
|
||||||
|
assert(!valid_move(waste_pile_1, waste_pile_0));
|
||||||
|
assert(!valid_move(waste_pile_1, waste_pile_1));
|
||||||
|
free_stack(waste_pile_0);
|
||||||
|
free_stack(waste_pile_1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_waste_pile_to_foundation_stacks() {
|
||||||
|
struct stack *waste_pile, *foundation_stacks[4];
|
||||||
|
|
||||||
|
allocate_stack(&waste_pile);
|
||||||
|
initialize_stack(waste_pile);
|
||||||
|
set_card(waste_pile->card, ACE, SPADES, EXPOSED, WASTE_PILE_STARTING_Y, WASTE_PILE_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
allocate_stack(&foundation_stacks[i]);
|
||||||
|
initialize_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_0_STARTING_X);
|
||||||
|
set_card(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_1_STARTING_X);
|
||||||
|
set_card(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_2_STARTING_X);
|
||||||
|
set_card(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_3_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
assert(valid_move(waste_pile, foundation_stacks[i]));
|
||||||
|
}
|
||||||
|
free_stack(waste_pile);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
free_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_waste_pile_to_maneuvre_stacks() {
|
||||||
|
struct stack *waste_pile, *maneuvre_stacks[7];
|
||||||
|
|
||||||
|
allocate_stack(&waste_pile);
|
||||||
|
initialize_stack(waste_pile);
|
||||||
|
set_card(waste_pile->card, ACE, SPADES, EXPOSED, WASTE_PILE_STARTING_Y, WASTE_PILE_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
allocate_stack(&maneuvre_stacks[i]);
|
||||||
|
initialize_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_0_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_1_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_2_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_3_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_4_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_5_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_6_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
assert(valid_move(waste_pile, maneuvre_stacks[i]));
|
||||||
|
}
|
||||||
|
free_stack(waste_pile);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
free_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_foundation_stack_to_stock() {
|
||||||
|
struct stack *stock, *foundation_stacks[4];
|
||||||
|
|
||||||
|
allocate_stack(&stock);
|
||||||
|
initialize_stack(stock);
|
||||||
|
set_card(stock->card, ACE, SPADES, EXPOSED, STOCK_STARTING_Y, STOCK_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
allocate_stack(&foundation_stacks[i]);
|
||||||
|
initialize_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_0_STARTING_X);
|
||||||
|
set_card(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_1_STARTING_X);
|
||||||
|
set_card(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_2_STARTING_X);
|
||||||
|
set_card(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_3_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
assert(!valid_move(foundation_stacks[i], stock));
|
||||||
|
}
|
||||||
|
free_stack(stock);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
free_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_foundation_stack_to_waste_pile() {
|
||||||
|
struct stack *waste_pile, *foundation_stacks[4];
|
||||||
|
|
||||||
|
allocate_stack(&waste_pile);
|
||||||
|
initialize_stack(waste_pile);
|
||||||
|
set_card(waste_pile->card, ACE, SPADES, EXPOSED, WASTE_PILE_STARTING_Y, WASTE_PILE_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
allocate_stack(&foundation_stacks[i]);
|
||||||
|
initialize_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_0_STARTING_X);
|
||||||
|
set_card(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_1_STARTING_X);
|
||||||
|
set_card(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_2_STARTING_X);
|
||||||
|
set_card(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_3_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
assert(!valid_move(foundation_stacks[i], waste_pile));
|
||||||
|
}
|
||||||
|
free_stack(waste_pile);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
free_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_foundation_stack_to_foundation_stacks() {
|
||||||
|
struct stack *foundation_stacks[4];
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
allocate_stack(&foundation_stacks[i]);
|
||||||
|
initialize_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_0_STARTING_X);
|
||||||
|
set_card(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_1_STARTING_X);
|
||||||
|
set_card(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_2_STARTING_X);
|
||||||
|
set_card(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_3_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
for (int j = 0; j < 4; j++) {
|
||||||
|
if (i == j) {
|
||||||
|
assert(!valid_move(foundation_stacks[i], foundation_stacks[j]));
|
||||||
|
} else {
|
||||||
|
assert(valid_move(foundation_stacks[i], foundation_stacks[j]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
free_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_foundation_stack_to_maneuvre_stacks() {
|
||||||
|
struct stack *foundation_stacks[4];
|
||||||
|
struct stack *maneuvre_stacks[7];
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
allocate_stack(&foundation_stacks[i]);
|
||||||
|
initialize_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_0_STARTING_X);
|
||||||
|
set_card(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_1_STARTING_X);
|
||||||
|
set_card(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_2_STARTING_X);
|
||||||
|
set_card(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_3_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
allocate_stack(&maneuvre_stacks[i]);
|
||||||
|
initialize_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_0_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_1_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_2_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_3_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_4_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_5_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_6_STARTING_X);
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
for (int j = 0; j < 7; j++) {
|
||||||
|
assert(valid_move(foundation_stacks[i], maneuvre_stacks[j]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
free_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
free_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_maneuvre_stack_to_stock() {
|
||||||
|
struct stack *stock, *maneuvre_stacks[7];
|
||||||
|
|
||||||
|
allocate_stack(&stock);
|
||||||
|
initialize_stack(stock);
|
||||||
|
set_card(stock->card, ACE, SPADES, EXPOSED, STOCK_STARTING_Y, STOCK_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
allocate_stack(&maneuvre_stacks[i]);
|
||||||
|
initialize_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_0_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_1_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_2_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_3_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_4_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_5_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_6_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
assert(!valid_move(maneuvre_stacks[i], stock));
|
||||||
|
}
|
||||||
|
free_stack(stock);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
free_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_maneuvre_stack_to_waste_pile() {
|
||||||
|
struct stack *waste_pile, *maneuvre_stacks[7];
|
||||||
|
|
||||||
|
allocate_stack(&waste_pile);
|
||||||
|
initialize_stack(waste_pile);
|
||||||
|
set_card(waste_pile->card, ACE, SPADES, EXPOSED, WASTE_PILE_STARTING_Y, WASTE_PILE_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
allocate_stack(&maneuvre_stacks[i]);
|
||||||
|
initialize_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_0_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_1_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_2_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_3_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_4_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_5_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_6_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
assert(!valid_move(maneuvre_stacks[i], waste_pile));
|
||||||
|
}
|
||||||
|
free_stack(waste_pile);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
free_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_maneuvre_stack_to_foundation_stacks() {
|
||||||
|
struct stack *foundation_stacks[4];
|
||||||
|
struct stack *maneuvre_stacks[7];
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
allocate_stack(&foundation_stacks[i]);
|
||||||
|
initialize_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(foundation_stacks[0]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_0_STARTING_X);
|
||||||
|
set_card(foundation_stacks[1]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_1_STARTING_X);
|
||||||
|
set_card(foundation_stacks[2]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_2_STARTING_X);
|
||||||
|
set_card(foundation_stacks[3]->card, ACE, SPADES, EXPOSED, FOUNDATION_STARTING_Y, FOUNDATION_3_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
allocate_stack(&maneuvre_stacks[i]);
|
||||||
|
initialize_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_0_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_1_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_2_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_3_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_4_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_5_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_6_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
for (int j = 0; j < 4; j++) {
|
||||||
|
assert(valid_move(maneuvre_stacks[i], foundation_stacks[j]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
free_stack(foundation_stacks[i]);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
free_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_valid_move_from_maneuvre_stack_to_maneuvre_stacks() {
|
||||||
|
struct stack *maneuvre_stacks[7];
|
||||||
|
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
allocate_stack(&maneuvre_stacks[i]);
|
||||||
|
initialize_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
set_card(maneuvre_stacks[0]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_0_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[1]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_1_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[2]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_2_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[3]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_3_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[4]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_4_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[5]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_5_STARTING_X);
|
||||||
|
set_card(maneuvre_stacks[6]->card, ACE, SPADES, EXPOSED, MANEUVRE_STARTING_Y, MANEUVRE_6_STARTING_X);
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
for (int j = 0; j < 7; j++) {
|
||||||
|
if (i == j) {
|
||||||
|
assert(!valid_move(maneuvre_stacks[i], maneuvre_stacks[j]));
|
||||||
|
} else {
|
||||||
|
assert(valid_move(maneuvre_stacks[i], maneuvre_stacks[j]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 7; i++) {
|
||||||
|
free_stack(maneuvre_stacks[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void test_game() {
|
void test_game() {
|
||||||
|
test_valid_move_from_stock_to_stock();
|
||||||
|
test_valid_move_from_stock_to_waste_pile();
|
||||||
|
test_valid_move_from_stock_to_foundation_stacks();
|
||||||
|
test_valid_move_from_stock_to_maneuvre_stacks();
|
||||||
|
test_valid_move_from_waste_pile_to_stock();
|
||||||
|
test_valid_move_from_waste_pile_to_waste_pile();
|
||||||
|
test_valid_move_from_waste_pile_to_foundation_stacks();
|
||||||
|
test_valid_move_from_waste_pile_to_maneuvre_stacks();
|
||||||
|
test_valid_move_from_foundation_stack_to_stock();
|
||||||
|
test_valid_move_from_foundation_stack_to_waste_pile();
|
||||||
|
test_valid_move_from_foundation_stack_to_foundation_stacks();
|
||||||
|
test_valid_move_from_foundation_stack_to_maneuvre_stacks();
|
||||||
|
test_valid_move_from_maneuvre_stack_to_stock();
|
||||||
|
test_valid_move_from_maneuvre_stack_to_waste_pile();
|
||||||
|
test_valid_move_from_maneuvre_stack_to_foundation_stacks();
|
||||||
|
test_valid_move_from_maneuvre_stack_to_maneuvre_stacks();
|
||||||
|
|
||||||
test_move_card_from_empty_stack_to_empty_stack();
|
test_move_card_from_empty_stack_to_empty_stack();
|
||||||
test_move_card_from_empty_stack_to_non_empty_stack();
|
test_move_card_from_empty_stack_to_non_empty_stack();
|
||||||
test_move_card_from_non_empty_stack_to_empty_stack();
|
test_move_card_from_non_empty_stack_to_empty_stack();
|
||||||
|
Loading…
Reference in New Issue
Block a user