编辑:底部的工作代码
我相对较新的编程,我试图理解为什么这不起作用。我决定通过函数而不是main()
来处理卡片,以使其尽可能保持模块化。这是我下面的代码;我知道错误与指针有关,但我不明白我做错了什么。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int dealCards (char* cards[52][30], int* x, int* y, int* a, int* b)
{
time_t t;
srand((unsigned) time(&t));
printf("\n\nNow let's give you two random cards!\n\n");
*x = rand() % 53;
if (x != 0) {
*x = x - 1;
}
*y = rand() % 53;
if (y == x) {
while (y == x) {
y = rand() % 53;
}
}
if (y != 0) {
y = y - 1;
}
int i;
printf("Card 1 >\n");
for (i = 0; i < 30; i++) {
printf("%c", cards[*x][i]);
}
printf("\nCard 2 >\n");
for (i = 0; i < 30; i++) {
printf("%c", cards[*y][i]);
}
printf("\n%d\n", x);
printf("%d", y);
printf("\n\nNow let's give your opponent two random cards!\n\n");
*a = rand() % 53;
if (a != 0) {
a = a - 1;
}
if ((a == x) || (a == y)) {
while ((a == x) || (a == y)) {
*a = rand() % 53;
}
}
*b = rand() % 53;
if (b == a) {
while ((b == a) || (b == x) || (b == y)) {
*b = rand() % 53;
}
}
if (b != 0) {
*b = b - 1;
}
printf("Card 1 >\n");
for (i = 0; i < 30; i++) {
printf("%c", cards[*a][i]);
}
printf("\nCard 2 >\n");
for (i = 0; i < 30; i++) {
printf("%c", cards[*b][i]);
}
printf("\n%d\n", a);
printf("%d", b);
}
int main()
{
char deck[52][30] = {
{"_____\n|2♥ |\n| |\n|_2♥|\n"},
{"_____\n|3♥ |\n| |\n|_3♥|\n"},
{"_____\n|4♥ |\n| |\n|_4♥|\n"},
{"_____\n|5♥ |\n| |\n|_5♥|\n"},
{"_____\n|6♥ |\n| |\n|_6♥|\n"},
{"_____\n|7♥ |\n| |\n|_7♥|\n"},
{"_____\n|8♥ |\n| |\n|_8♥|\n"},
{"_____\n|9♥ |\n| |\n|_9♥|\n"},
{"_____\n|10♥|\n| |\n|10♥|\n"},
{"_____\n|J♥ |\n| |\n|_J♥|\n"},
{"_____\n|Q♥ |\n| |\n|_Q♥|\n"},
{"_____\n|K♥ |\n| |\n|_K♥|\n"},
{"_____\n|A♥ |\n| |\n|_A♥|\n"},
{"_____\n|2♦ |\n| |\n|_2♦|\n"},
{"_____\n|3♦ |\n| |\n|_3♦|\n"},
{"_____\n|4♦ |\n| |\n|_4♦|\n"},
{"_____\n|5♦ |\n| |\n|_5♦|\n"},
{"_____\n|6♦ |\n| |\n|_6♦|\n"},
{"_____\n|7♦ |\n| |\n|_7♦|\n"},
{"_____\n|8♦ |\n| |\n|_8♦|\n"},
{"_____\n|9♦ |\n| |\n|_9♦|\n"},
{"_____\n|10♦|\n| |\n|10♦|\n"},
{"_____\n|J♦ |\n| |\n|_J♦|\n"},
{"_____\n|Q♦ |\n| |\n|_Q♦|\n"},
{"_____\n|K♦ |\n| |\n|_K♦|\n"},
{"_____\n|A♦ |\n| |\n|_A♦|\n"},
{"_____\n|2♠ |\n| |\n|_2♠|\n"},
{"_____\n|3♠ |\n| |\n|_3♠|\n"},
{"_____\n|4♠ |\n| |\n|_4♠|\n"},
{"_____\n|5♠ |\n| |\n|_5♠|\n"},
{"_____\n|6♠ |\n| |\n|_6♠|\n"},
{"_____\n|7♠ |\n| |\n|_7♠|\n"},
{"_____\n|8♠ |\n| |\n|_8♠|\n"},
{"_____\n|9♠ |\n| |\n|_9♠|\n"},
{"_____\n|10♠|\n| |\n|10♠|\n"},
{"_____\n|J♠ |\n| |\n|_J♠|\n"},
{"_____\n|Q♠ |\n| |\n|_Q♠|\n"},
{"_____\n|K♠ |\n| |\n|_K♠|\n"},
{"_____\n|A♠ |\n| |\n|_A♠|\n"},
{"_____\n|2♣ |\n| |\n|_2♣|\n"},
{"_____\n|3♣ |\n| |\n|_3♣|\n"},
{"_____\n|4♣ |\n| |\n|_4♣|\n"},
{"_____\n|5♣ |\n| |\n|_5♣|\n"},
{"_____\n|6♣ |\n| |\n|_6♣|\n"},
{"_____\n|7♣ |\n| |\n|_7♣|\n"},
{"_____\n|8♣ |\n| |\n|_8♣|\n"},
{"_____\n|9♣ |\n| |\n|_9♣|\n"},
{"_____\n|10♣|\n| |\n|10♣|\n"},
{"_____\n|J♣ |\n| |\n|_J♣|\n"},
{"_____\n|Q♣ |\n| |\n|_Q♣|\n"},
{"_____\n|K♣ |\n| |\n|_K♣|\n"},
{"_____\n|A♣ |\n| |\n|_A♣|\n"},
};
int i, j;
for (i = 0; i < 52; i++) {
for (j = 0; j < 30; j++) {
printf("%c", deck[i][j]);
}
}
//dealing
int heroFirst, heroSecond, villainFirst, villainSecond;
dealCards(deck, &heroFirst, &heroSecond, &villainFirst, &villainSecond);
//bets
}
工作代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int dealCards (char cards[52][30], int *x, int *y, int *a, int *b)
{
time_t t;
srand((unsigned) time(&t));
printf("\n\nYour cards:\n\n");
*x = rand() % 53;
if (*x != 0) {
*x = *x - 1;
}
*y = rand() % 53;
if (*y == *x) {
while (*y == *x) {
*y = rand() % 53;
}
}
if (*y != 0) {
*y = *y - 1;
}
int i;
printf("Card 1 >\n");
for (i = 0; i < 30; i++) {
printf("%c", cards[*x][i]);
}
printf("\nCard 2 >\n");
for (i = 0; i < 30; i++) {
printf("%c", cards[*y][i]);
}
printf("\n\nVillain cards:\n\n");
*a = rand() % 53;
if (*a != 0) {
*a = *a - 1;
}
if ((*a == *x) || (*a == *y)) {
while ((*a == *x) || (*a == *y)) {
*a = rand() % 53;
}
}
*b = rand() % 53;
if (*b == *a) {
while ((*b == *a) || (*b == *x) || (*b == *y)) {
*b = rand() % 53;
}
}
if (*b != 0) {
*b = *b - 1;
}
printf("Card 1 >\n");
for (i = 0; i < 30; i++) {
printf("%c", cards[*a][i]);
}
printf("\nCard 2 >\n");
for (i = 0; i < 30; i++) {
printf("%c", cards[*b][i]);
}
}
int main()
{
char deck[52][30] = {
{"_____\n|2♥ |\n| |\n|_2♥|\n"},
{"_____\n|3♥ |\n| |\n|_3♥|\n"},
{"_____\n|4♥ |\n| |\n|_4♥|\n"},
{"_____\n|5♥ |\n| |\n|_5♥|\n"},
{"_____\n|6♥ |\n| |\n|_6♥|\n"},
{"_____\n|7♥ |\n| |\n|_7♥|\n"},
{"_____\n|8♥ |\n| |\n|_8♥|\n"},
{"_____\n|9♥ |\n| |\n|_9♥|\n"},
{"_____\n|10♥|\n| |\n|10♥|\n"},
{"_____\n|J♥ |\n| |\n|_J♥|\n"},
{"_____\n|Q♥ |\n| |\n|_Q♥|\n"},
{"_____\n|K♥ |\n| |\n|_K♥|\n"},
{"_____\n|A♥ |\n| |\n|_A♥|\n"},
{"_____\n|2♦ |\n| |\n|_2♦|\n"},
{"_____\n|3♦ |\n| |\n|_3♦|\n"},
{"_____\n|4♦ |\n| |\n|_4♦|\n"},
{"_____\n|5♦ |\n| |\n|_5♦|\n"},
{"_____\n|6♦ |\n| |\n|_6♦|\n"},
{"_____\n|7♦ |\n| |\n|_7♦|\n"},
{"_____\n|8♦ |\n| |\n|_8♦|\n"},
{"_____\n|9♦ |\n| |\n|_9♦|\n"},
{"_____\n|10♦|\n| |\n|10♦|\n"},
{"_____\n|J♦ |\n| |\n|_J♦|\n"},
{"_____\n|Q♦ |\n| |\n|_Q♦|\n"},
{"_____\n|K♦ |\n| |\n|_K♦|\n"},
{"_____\n|A♦ |\n| |\n|_A♦|\n"},
{"_____\n|2♠ |\n| |\n|_2♠|\n"},
{"_____\n|3♠ |\n| |\n|_3♠|\n"},
{"_____\n|4♠ |\n| |\n|_4♠|\n"},
{"_____\n|5♠ |\n| |\n|_5♠|\n"},
{"_____\n|6♠ |\n| |\n|_6♠|\n"},
{"_____\n|7♠ |\n| |\n|_7♠|\n"},
{"_____\n|8♠ |\n| |\n|_8♠|\n"},
{"_____\n|9♠ |\n| |\n|_9♠|\n"},
{"_____\n|10♠|\n| |\n|10♠|\n"},
{"_____\n|J♠ |\n| |\n|_J♠|\n"},
{"_____\n|Q♠ |\n| |\n|_Q♠|\n"},
{"_____\n|K♠ |\n| |\n|_K♠|\n"},
{"_____\n|A♠ |\n| |\n|_A♠|\n"},
{"_____\n|2♣ |\n| |\n|_2♣|\n"},
{"_____\n|3♣ |\n| |\n|_3♣|\n"},
{"_____\n|4♣ |\n| |\n|_4♣|\n"},
{"_____\n|5♣ |\n| |\n|_5♣|\n"},
{"_____\n|6♣ |\n| |\n|_6♣|\n"},
{"_____\n|7♣ |\n| |\n|_7♣|\n"},
{"_____\n|8♣ |\n| |\n|_8♣|\n"},
{"_____\n|9♣ |\n| |\n|_9♣|\n"},
{"_____\n|10♣|\n| |\n|10♣|\n"},
{"_____\n|J♣ |\n| |\n|_J♣|\n"},
{"_____\n|Q♣ |\n| |\n|_Q♣|\n"},
{"_____\n|K♣ |\n| |\n|_K♣|\n"},
{"_____\n|A♣ |\n| |\n|_A♣|\n"},
};
int i, j;
for (i = 0; i < 52; i++) {
for (j = 0; j < 30; j++) {
printf("%c", deck[i][j]);
}
}
double heroStack, villainStack;
printf("\n-----------------------------");
printf("\nWelcome to Heads Up Hold 'Em!");
printf("\n-----------------------------");
printf("\nHow many chips are your going to start off with?\n> ");
scanf("%lf", &heroStack);
villainStack = heroStack;
printf("\nYour chipstack: %.lf\n", heroStack);
printf("Villain's chipstack: %.lf\n", villainStack);
//dealing
int heroFirst, heroSecond, villainFirst, villainSecond;
dealCards(deck, &heroFirst, &heroSecond, &villainFirst, &villainSecond);
printf("\n%d\n", heroFirst);
printf("%d\n", heroSecond);
printf("%d\n", villainFirst);
printf("%d\n", villainSecond);
//bets
//double heroBet, villainBet;
//printf("\nYour move");
}
答案 0 :(得分:0)
问题是你在获得价值和计算价值之间混淆不清
这个if
(和类似的),你知道你在做什么吗?
*x = rand() % 53;
if (x != 0) {
*x = x - 1;
}
好吧,你的函数中的x
是一个指针,这意味着,如果你想获取或分配一个值,你必须使用*
之类的运算符*x = rand() % 53
但是当你比较x != 0
时,编译器会认为你正在检查x是否为NULL(默认情况下,NULL是0
)。因此,它不是上述语句的值,这将导致您出现逻辑错误。
如果你仔细观察main
,你会发现x
,y
和你传递的类似参数永远不会为NULL,因为它们是在{{1}本地创建的功能,直到你离开它仍然存在。因此,您的语句main
将意外运行,这可能会导致您的段错误
我认为您使用交易函数来获取这些变量的随机值
*x = x - 1
因此,您可以通过声明函数传递这些值,如下所示:
int heroFirst, heroSecond, villainFirst, villainSecond;
然后像这样调用你的函数
int dealCards (char cards[52][30], int& x, int& y, int& a, int& b)
在您的dealCards定义中,只需移除
此外,您可以安全地打印整个字符串而不使用像这样的for循环,它看起来很糟糕,不是吗?dealCards (deck, heroFirst, heroSecond, villainFirst, villainSecond)
之类的*
或类似内容,您的功能将正常工作(如果您知道将要执行的操作,那些*x
x
)
y
只需正常打印即可
for (i = 0; i < 30; i++) {
printf("%c", cards[*y][i]);
}
Eddited:
语法
您应该将您的cardDecks重新声明为上述评论以使其有效