【问题标题】:How can I assign int values to const char array in my blackjack game, C [closed]如何在我的二十一点游戏中将 int 值分配给 const char 数组,C [关闭]
【发布时间】:2016-04-11 00:51:50
【问题描述】:

我正在用 C 语言开发二十一点游戏。我有三个功能,一个用来装牌,一个用来洗牌,一个用来发牌。我的问题是我不知道如何给我的卡片一个整数值,我需要它来看看谁赢了。对于如何解决这个问题,我将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "func.h"

/*fill deck with 52 cards*/
void fillDeck(Card * const Deck, const char *suit[], const char *deck[]){

int s;
for (s = 0; s < 52; s++){
    Deck[s].suits = deck[s % 13];
    Deck[s].decks = suit[s / 13];
}
return;
}



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "func.h"

/*shuffle cards*/
void shuffle(Card * const Deck){
int i, j;
Card temp;

for (i = 0; i < 52; i++){
    j = rand() % 52;
    temp = Deck[i];
    Deck[i] = Deck[j];
    Deck[j] = temp;
}
return;
}



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "func.h"

/*deal cards*/
void deal(const Card * const Deck, int size, int size_1, int size_2){

int i, j, length;
char anotherCard[2];
char name1[30];
char name2[30];

printf("Name player one > ");
scanf("%s", name1);
printf("Name player two > ");
scanf("%s", name2);

printf("\nWelcome %s and %s, lets begin!\n\n", name1, name2);
getchar();

    printf("%s's card:\n", name1);
    for (i = 0; i < size; i++){
        printf("%5s of %-8s%c", Deck[i].decks, Deck[i].suits, (i + 1) % 2 ? '\t' : '\n');
    }

    printf("\n%s's card:\n", name2);
    for (i = 2; i < size_1; i++){
        printf("%5s of %-8s%c", Deck[i].decks, Deck[i].suits, (i + 1) % 2 ? '\t' : '\n');
    }

    printf("\nDealer card:\n");
    for (i = 4; i < size_2; i++){
        printf("%5s of %-8s%c", Deck[i].decks, Deck[i].suits, (i + 1) % 2 ? '\t' : '\n');
    }
return;
}



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "func.h"

int main(void){

Card allCards[52];
const char *suits[] = { "spades", "hearts", "diamonds", "clubs" };
char *decks[] = { "ace", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "jack", "queen", "king" };
int *values[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };

srand(time(NULL));

fillDeck(allCards, suits, decks, values);
shuffle(allCards);
deal(allCards, 2, 4, 6);

getchar();
return 0;
}



/*func.h*/
struct card{
    const char *suits;
    const char *decks;
};

typedef struct card Card;

void fillDeck(Card * const Deck, char *suit[], char *deck[]);

void shuffle(Card * const Deck);

void deal(const Card * const Deck, int size, int size_1, int size_2);

#endif

【问题讨论】:

  • 到底是什么问题?不是很清楚。
  • "I don't know how to give my cards an integer value" 的代码过多。你在哪里尝试这样做?
  • 给牌编号0..51,然后花色可以是card / 13,等级可以是card % 13。西装编号为0..3,等级编号为0..12
  • 我无法从他的问题中看出,但重要的是要注意 ENUMS 可以很容易地做到这一点,因为您可以分配 ENUMS 在幕后的“隐藏”值。
  • 使用enums 定义名次和花色,使用字符串数组将索引值0... 转换为名次和花色。

标签: c blackjack const-char


【解决方案1】:

我建议您在卡片结构中添加一个字段来保存该值。

typedef struct card {
    const char *suits;
    const char *decks;
    int value;
}

为卡分配您将使用的值:

void fillDeck(Card * const Deck, const char *suit[], const char *deck[], const int *value[])
{
    int s;
    for (s = 0; s < 52; s++){
        Deck[s].suits = suit[s / 13];
        Deck[s].decks = deck[s % 13];
        Deck[s].value = value[s % 13];
    }
}

然后,当您确定获胜者时,您可以简单地查看他们手中的所有牌并总结价值。

【讨论】:

  • 谢谢,这很有帮助。我想当我在 fillDeck 函数中有值时,我也需要在 shuffle 和 deal 函数中使用它?我试图在 shuffle 中实现它,但我得到了错误。 void shuffle(Card * const Deck, const int *value[]){ int i, j;卡温度;对于 (i = 0; i
  • 是的,理想情况下,您可以在任何使用套牌和西装的地方增加价值。另外,只是一个建议,我会考虑重命名包含 {"ace", "two", etc...} 的数组,因为名称牌组或牌组很容易与您的包含一组 52 张牌的类牌组混淆。
  • 我在 for 循环内的 shuffle 函数中写了 value[i] = value[j];,但它不起作用。我不能这样写吗?
  • 使用您在帖子中编写的随机播放功能,您不需要在随机播放中使用值。当我说在你使用牌组的地方使用它时,我指的是数组 {"ace", "two", etc...},而不是实际的牌组。这就是为什么我建议为您的变量提供更多唯一名称。
【解决方案2】:

不要将程序的卡片值与其等级混淆 - 明确区分程序使用的等级 0..12 和卡片的描述值。

//char *suitname[] = { "Hearts", "Clubs", "Diamonds", "Spades" };
//char *rankname[] = { "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", 
                          "Ten", "Jack", "Queen", "King", "Ace" };

char *suitname[] = { "Hearts", "Diamonds", "Spades", "Clubs" };
char *rankname[] = { "Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", 
                          "Ten", "Jack", "Queen", "King" };

无论“Ace”是高还是低,在这两种情况下,排名“三”的值都不为3。我建议处理(双关语!)卡值0..51 并根据需要获得花色和排名

int suit = card / 13;       // range 0..3
int rank = card % 13;       // range 0..12

在这两种情况下,花色或排名都是一个范围为 0 的值,以适应(双关语!)数组索引。

至于排名的分数值,你可以像这样定义另一个数组

int cardvalue[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 };

这样你就可以得到卡的价值了

int value = cardvalue[card % 13];

并用

打印它的描述
printf("%s of %s", rankname[card % 13], suitname[card / 13]);

你也可以按照你定义的顺序来获得套装等级(在某些纸牌游戏中很重要),正如我所展示的那样。

【讨论】:

  • 你说的是主函数吗?我仍然需要fillDeck、shuffle 和deal 功能对吗?我根据你的建议改了名字。
  • 如果您觉得需要单独的功能。填充数组是单行的,改组几乎没有。
猜你喜欢
  • 2012-10-16
  • 2023-02-22
  • 1970-01-01
  • 2023-03-21
  • 2021-10-10
  • 2021-12-02
  • 2012-07-13
  • 2014-07-17
  • 1970-01-01
相关资源
最近更新 更多