75 lines
1.7 KiB
C
75 lines
1.7 KiB
C
/**
|
|
* Copyright (c) 2021 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
#include "card.h"
|
|
|
|
void cardDeal(card_t *source, uint8_t *sourceSize, card_t *dest,
|
|
uint8_t *destSize
|
|
) {
|
|
card_t card;
|
|
uint8_t i;
|
|
|
|
// Take Card
|
|
i = *sourceSize - 1;
|
|
card = source[i];
|
|
*sourceSize = i;
|
|
|
|
// Put card
|
|
i = *destSize;
|
|
dest[i] = card;
|
|
*destSize = i+1;
|
|
}
|
|
|
|
void cardHandSort(card_t *cards, uint8_t length) {
|
|
arraySort(sizeof(card_t), cards, (int32_t)length, (arraysort_t *)&_cardSorter);
|
|
}
|
|
|
|
int32_t _cardSorter(void* left, void* right) {
|
|
card_t cardL = *((card_t *)left);
|
|
card_t cardR = *((card_t *)right);
|
|
|
|
uint8_t suitL = cardGetSuit(cardL);
|
|
uint8_t suitR = cardGetSuit(cardR);
|
|
if(suitL != suitR) return suitL - suitR;
|
|
|
|
uint8_t numberL = cardGetNumber(cardL);
|
|
uint8_t numberR = cardGetNumber(cardR);
|
|
|
|
// Get the suit and the value of the card (reversed)
|
|
return numberR - numberL;
|
|
}
|
|
|
|
int32_t cardContains(card_t *hand, uint8_t length, card_t card) {
|
|
return arrayFind(sizeof(card_t), hand, (int32_t)length, &card);
|
|
}
|
|
|
|
int32_t cardContainsNumber(card_t *hand, uint8_t length, uint8_t number) {
|
|
int32_t i;
|
|
for(i = 0; i < length; i++) {
|
|
if(cardGetNumber(hand[i]) == number) return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
uint8_t cardCountPairs(card_t *in, uint8_t inCount, uint8_t number,
|
|
int32_t out[CARD_SUIT_COUNT]
|
|
) {
|
|
uint8_t i, count;
|
|
int32_t index;
|
|
|
|
count = 0;
|
|
for(i = 0; i <= CARD_SUIT_COUNT; i++) {// "For each suit"
|
|
index = cardContains(in, inCount, cardGet(number, i));
|
|
if(index == -1) continue;
|
|
out[count++] = index;
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
void cardShuffle(card_t *hand, uint8_t length) {
|
|
arrayShuffle(sizeof(card_t), hand, length);
|
|
} |