我一直在写sueca纸牌游戏代码(我是巴西人,所以代码中使用的单词是葡萄牙语)进行练习,但发现了一个难题。我做了一个函数,打算返回一个洗牌的牌组(以sueca标记为40张牌)。为此,我创建了一个由40个字符串组成的char型矩阵,每个字符串2个字符。改组的部分还不错,我已经对其进行了测试,并且可以正常工作(使用printfs进行检查)。我面临的问题是使此函数正确返回经过改组的平台。该程序总是在应该显示返回信息(在另一个函数的printf上)的那一刻崩溃,并且弹出窗口显示“ untitled1.exe已停止工作”消息。
我首先尝试的是使函数(embaralhar())返回矩阵变量,然后在strcpy()上调用它,将返回值复制到相同大小的另一个矩阵中,因此我可以对另一个函数进行操作。该其他功能应该采用第一张卡(baralho [0])并将其显示给用户。 我一直在研究如何使用指针来实现这一目标,但是却什么也没做,而且我想不出任何其他方法来解决这个问题。我将程序这一部分中使用的函数带到一个.c文件中,以使其易于编辑和理解-实际程序有1个主文件(.c)和4个标头,即“ MenuNovoJogo.h”有麻烦的功能。
#include <stdio.h>
#include <stdlib.h>
char embaralhar(void) {
char baralho[40][2] = {{"oA"}, {"oS"}, {"oR"}, {"ov"}, {"or"}, {"os"}, {"oc"}, {"oq"}, {"ot"}, {"od"}, {"cA"}, {"cS"}, {"cR"}, {"cv"}, {"cr"}, {"cs"}, {"cc"}, {"cq"}, {"ct"}, {"cd"}, {"eA"}, {"eS"}, {"eR"}, {"ev"}, {"er"}, {"es"}, {"ec"}, {"eq"}, {"et"}, {"ed"}, {"pA"}, {"pS"}, {"pR"}, {"pv"}, {"pr"}, {"ps"}, {"pc"}, {"pq"}, {"pt"}, {"pd"}};
int i, j, x, k;
char aux[2];
srand(time(NULL));
//shuffling
for(k=0 ; k<=2 ; k++) {
for(i=0 ; i<=39 ; i++) {
x = rand() % 40;
for(j=0 ; j<=1 ; j++)
aux[j] = baralho[x][j];
for(j=0 ; j<=1 ; j++)
baralho[x][j] = baralho[i][j];
for(j=0 ; j<=1 ; j++)
baralho[i][j] = aux[j];
}
}
return baralho;
}
int main(void) {
char baralho[40][2], primeiraCarta[2], naipeTrunfo[7], cartaRevelada[6], cartaTrunfo[20];
int i;
//calling the matrix from the other fuction
strcpy(baralho, embaralhar());
//taking the first card of the deck
for(i=0 ; i<=1 ; i++)
primeiraCarta[i] = baralho[0][i];
//recognizing which card it is
switch(primeiraCarta[0]) {
case 'o': strcpy(naipeTrunfo, "Ouros"); break;
case 'c': strcpy(naipeTrunfo, "Copas"); break;
case 'e': strcpy(naipeTrunfo, "Espadas"); break;
default: strcpy(naipeTrunfo, "Paus"); break;
}
switch(primeiraCarta[1]) {
case 'A': strcpy(cartaRevelada, "As"); break;
case 'S': strcpy(cartaRevelada, "Sete"); break;
case 'R': strcpy(cartaRevelada, "Rei"); break;
case 'v': strcpy(cartaRevelada, "Valete"); break;
case 'r': strcpy(cartaRevelada, "Rainha"); break;
case 's': strcpy(cartaRevelada, "Seis"); break;
case 'c': strcpy(cartaRevelada, "Cinco"); break;
case 'q': strcpy(cartaRevelada, "Quatro"); break;
case 't': strcpy(cartaRevelada, "Tres"); break;
default: strcpy(cartaRevelada, "Dois"); break;
}
//showing the result to the user
strcpy(cartaTrunfo, cartaRevelada);
strcat(cartaTrunfo, " de ");
strcat(cartaTrunfo, naipeTrunfo);
printf(naipeTrunfo);
}