/***************************************************************************** * ___ __ __ ___ _ __ * * / _ \\ \/ // _ \ '_ \ * * | (_) |> <| __/ | | | * * \___//_/\_\\___|_| |_| * * * * The card game * * * * Copyright (C) 2011, Reiner Herrmann * * Mario Kilies * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * *****************************************************************************/ #include "main_stack.h" #include /** * Initialize main stack: Assign valid cards and shuffle it * @param[in,out] m Pointer to main stack */ void main_stack_init(main_stack_t *m) { assert(m != NULL); // assign card values to main stack for(int i = 0; i < MAX_MAIN_STACK_CARDS; i++) m->cards[i] = i + 1; // shuffle stack for(int i = 0; i < 3 * MAX_MAIN_STACK_CARDS; i++) { uint32_t x = rand() % MAX_MAIN_STACK_CARDS; uint32_t y = rand() % MAX_MAIN_STACK_CARDS; card tmp = m->cards[x]; m->cards[x] = m->cards[y]; m->cards[y] = tmp; } } /** * Draw card on top of main stack and mark it as removed * @param[in,out] m Pointer to main stack * @return Card on top of stack */ card main_stack_remove_card(main_stack_t *m) { assert(m != NULL); for(int i = 0; i < MAX_MAIN_STACK_CARDS; i++) { card c = m->cards[i]; if(c == 0) continue; m->cards[i] = 0; return c; } return 0; // stack empty } /** * Returns number of cards remaining in main stack * @param[in] m Pointer to main stack * @return Number of cards in stack */ uint8_t main_stack_size(const main_stack_t *m) { assert(m != NULL); uint8_t count = 0; for(uint8_t i = 0; i < MAX_MAIN_STACK_CARDS; i++) { if(m->cards[i] == 0) continue; count++; } return count; }