Мне нужно позволить игроку выбрать, какие карты он хочет сохранить из своей руки из 5 карт. Я пытаюсь сделать это в моей функции chooseCards, но когда пользователь решает заменить карту, она завершается без ошибок.
Я попытался изменить типы указателей в функции, надеясь, что это проблема, но ничего не изменилось. Когда пользователь вводит «n» (для замены карты), программа завершает работу. Однако функция passCard ранее безупречно работала в программе вместе с функцией shuffle, поэтому я не совсем понимаю, в чем проблема. Я знаю, что было бы намного проще использовать массивы, но для назначения требуются связанные списки.
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
typedef struct card_s {
char suit[20];
int face;
struct card_s *next;
}card;
void makeDeck(card** currentCard) {
int i, j;
char cardsuit[20];
card *tempCard = '-', *tail = NULL, *lastcard = NULL;
for (i = 0; i < 13; i += 1) { // 13 cards per suit
for (j = 0; j < 4; j += 1) { // 4 suits
tempCard = (card*)malloc(sizeof(card));
if (j == 0) {
strcpy(cardsuit, "of diamonds");
}
else if (j == 1) {
strcpy(cardsuit, "of hearts");
}
else if (j == 2) {
strcpy(cardsuit, "of clubs");
}
else if (j == 3) {
strcpy(cardsuit, "of spades");
}
tempCard->face = i + 1;
strcpy(tempCard->suit, cardsuit);
tempCard->next = NULL;
lastcard = tempCard;
if (*currentCard == NULL) {
*currentCard = tempCard;
}
else {
tail->next = tempCard;
}
tail = tempCard;
tail->next = NULL; //sets final card place in list to null
}
}
return;
}
int FindLength(card* currentcard) {
int i = 0;
while (currentcard != NULL) {
i += 1; //increment i evry time current card has value
currentcard = currentcard->next;
}
return i;
}
void shuffleDeck(card** currentCard, int deckLength) {
int cardcount, place, i, rng;
int j = 0;
card *shuffled = NULL;
card *unshuffled = NULL;
card *tempCard = NULL;
srand(time(NULL));
for (place = 0; place < deckLength; place += 1) {
shuffled = *currentCard;
unshuffled = *currentCard;
tempCard = (card*)malloc(sizeof(card));
rng = rand() % deckLength;
for (cardcount = 0; cardcount < rng; cardcount += 1) {
unshuffled = unshuffled->next;
}
for (cardcount = 0; cardcount < place; cardcount += 1) {
shuffled = shuffled->next;
}
strcpy(tempCard->suit, unshuffled->suit); //swap the suits of each card
strcpy(unshuffled->suit, shuffled->suit);
strcpy(shuffled->suit, tempCard->suit);
tempCard->face = unshuffled->face; //swap value of the cards
unshuffled->face = shuffled->face;
shuffled->face = tempCard->face;
}
return;
}
void pushFront(card** head, char* suit, int face) {
card* temp = (card*)malloc(sizeof(card));
temp->face = face;
strcpy(temp->suit, suit);
temp->next = *head;
*head = temp; //new card put at head of list
}
void removeFront(card **head) {
card* temp = NULL;
temp = *head; //point temp to first card
*head = (*head)->next; //set head to the next card
free(temp); //free the first
}
void passCard(card** giver, card** taker) {
pushFront(taker, (*giver)->suit, (*giver)->face);
removeFront(giver);
return;
}
void dealCards(card** deck, card** p1, card** p2) {
card* current = NULL;
current = *deck;
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
passCard(deck, p1);
}
else {
passCard(deck, p2);
}
}
return;
}
void chooseCards(card*hand, card*deck) {
int i, chosenCard = 0;
char answer;
for (i = 1; i < 6; i += 1) {
printf("Keep card %d? (y or n): ", i);
scanf(" %c", &answer);
if (answer == 'n') {
passCard(hand, deck);
shuffleDeck(deck, FindLength(deck));
passCard(deck, hand);
}
hand = hand->next;
}
return;
}
int main() {
card *cards = NULL; //deck of cards
card *player1 = NULL; //p1 hand
card *dealer = NULL; //dealer hand
makeDeck(&cards); //create deck of 52 cards
int deckLength = Findlength(cards);
shuffleDeck(&cards, deckLength); //shuffle deck of cards
dealCards(&cards, &player1, &dealer); //deal to player 1 and dealer
//print player 1 hand
chooseCards(&player1, &cards);
//print player 1 hand, chosen cards have been replaced by cards in the deck
return 0;
}
Выход должен заменить выбранную карту картой из колоды.