我正在尝试在调用newGame时在drawPile中创建一副纸牌(以特定的纸牌作为参数)
我有4个链接列表来存储卡(drawPile,discardPile,player1的手和player2的手)
我的_game结构会存储给定时间的游戏状态(例如,drawPile,discardPile和玩家1,2手中的卡)
我在尝试了解如何使用struct _game内部的drawPile链表时遇到麻烦。创建_game时,应该如何为drawPile,discardPile..etc分配内存?我相信我目前在newGame中所拥有的完全是错误的。
任何建议或技巧将不胜感激。
typedef enum {RED,BLACK} color;
typedef enum {HEARTS,DIAMONDS,CLUBS,SPADES} suit;
typedef enum {ONE,TWO,THREE,FOUR} value;
typedef struct drawPile{
enum color color;
enum suit suit;
enum value value;
struct drawPile *next;
}*drawPile;
我有点困惑,将*放在drawPile之前有什么区别?
typedef struct discardPile{
enum color color;
enum suit suit;
enum value value;
struct discardPile *next;
};
typedef struct player1Hand{
enum color color;
enum suit suit;
enum value value;
struct player1Hand *next;
};
typedef struct player2Hand{
enum color color;
enum suit suit;
enum value value;
struct player2Hand *next;
};
typedef struct _game{
drawPile game_drawPile;
discardPile game_discardPile;
player1Hand game_player1Hand;
player2Hand game_player2Hand;
}Game;
Game newGame(int deckSize, value values[], color colors[], suit suits[]){
Game nGame;
for(int i = 0; i < deckSize; i++){
nGame->drawPile.value = value[i];
nGame->drawPile.color = colors[i];
nGame->drawPile.suit = suits[i];
}
}
下面是一个示例主要功能,该示例说明newGame函数将如何仅用4张卡运行。
int main (void){
init_deck();
}
static void init_deck(void){
int deck_size = 4;
value values[] = {ONE, TWO, THREE, FOUR};
color colors[] = {RED, BLACK, RED, BLACK};
suit suits[] = {HEARTS, DIAMONDS, CLUBS, SPADES};
Game game = newGame(deck_size, values, colors, suits);
}
我只粘贴了我的代码段,请告诉我是否需要更多信息。
答案 0 :(得分:1)
首先,您可以对所有链接列表使用相同的Struct。
struct Card {
enum color color;
enum suit suit;
enum value value;
};
struct CardList {
struct Card *card;
struct CardList *next;
};
然后,您可以编写将卡添加到列表或从列表中删除卡的功能:
CardList *add(CardList **list, Card *card);
在newGame中:
Game *newGame(int deckSize, value values[], color colors[], suit suits[]){
Game *nGame = (Game*) malloc(sizeof(Game));
for(int i = 0; i < deckSize; i++){
Card* card = (Card*) malloc(sizeof(Card));
... assign variable
add(&game->drawPile, card);
}
return nGame;
}