Jogo de cartas - como remover uma carta que já foi escolhida [RESOLVIDO]

1. Jogo de cartas - como remover uma carta que já foi escolhida [RESOLVIDO]

Luis Vilo
LuisVilo

(usa Outra)

Enviado em 03/12/2020 - 15:31h

Bom dia!

Eu tô criando um jogo de cartas (usuario vs PC) e preciso de ajuda. O jogo é o seguinte: Há um baralho com 4 naipes diferentes. Cada grupo de naipe tem 7 cartas (de 1 a 7) e 3 cartas diferentes (valete, cavaleiro e rei). Ou seja, o baralho tem no total 40 cartas. O objetivo é conseguir fazer 7,5 pontos (parece o clássico jogo do blackjack). As 7 primeiras cartas de cada naipe valem o valor que tem a propria carta e as 3 "diferentes" valem 0.5 cada. Daí o programa pergunta pro usuario se quer carta ou quer passar a vez pro PC. Ganha quem fizer os 7,5 pontos ou quem chega mais proximo dessa pontuação, mas sem ultrapassar. Se ultrapassar, perdeu.

Eu fiz isso até agora, mas a última coisa que eu preciso é remover uma carta quando ela já foi escolhida. Com o que eu tenho aqui, como poderia fazer isso? Por favor, eu tô precisando muito de ajuda.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
srand( time(NULL) );
int key, card, cardpc;
int deck[40] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10};
float points, points_pc;

printf("Press 1 to play or 0 to not!\t");
scanf("%d", &key);

printf("\n");

if (key ==0){
printf("BYE\n");

}else if (key==1){
while(key==1){
card = deck[rand()% 40];
if(card==8 || card==9 || card==10){
printf("You got 0.5 points");
points = points + 0.5;
}else{
printf("You got %d points",card);
points = points + card;
}
printf("\n");
printf("Your score is: %0.1f \n", points);

if(points>7.5){
printf("YOU LOST!\n");
system("pause");
}else if (points==7.5) {
printf("YOU WON");
system("pause");
}
cardpc = deck[rand()% 40];
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

if(points_pc>7.5){
printf("YOU WON! The PC score is above 7.5!\n");
system("pause");
}else if (points_pc == 7.5){
printf("The PC won");
system("pause");
}
printf("Do you want another card? (Press 1 if you want it)\t");
scanf("%d", &key);

printf("\n");
}
//if the user passes turn, the pc can still continue playing
while(points_pc<points){
cardpc = deck[rand()% 40];
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

if(points_pc==points){
printf("The PC won! \n");
}else{
if(points_pc>7.5){
printf("You won! The PC score is above 7.5\n");
}else{
if(points_pc>points){
printf("The PC won! \n");
}
}
}
}
printf("\n");

}
return 0;
}



  


2. Re: Jogo de cartas - como remover uma carta que já foi escolhida [RESOLVIDO]

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 03/12/2020 - 17:38h

Uma solução "mais simples" é criar uma outra matriz do mesmo tamanho daquela de cartas com valor 0 ou 1(0 livre e 1 escolhida).
Quando o usuário escolhe uma carta marca como excluída. Acho que é a solução que envolve menos reescrita de código.


3. Re: Jogo de cartas - como remover uma carta que já foi escolhida [RESOLVIDO]

Luis Vilo
LuisVilo

(usa Outra)

Enviado em 03/12/2020 - 20:18h

Eu mudei um pouco o codigo para fazer como vc falou, mas não consigo visulaizar o que deveria colocar entre os colchetes de draw[ ] =1 (a nova array que criei para sinalizar uma carta em 0 ou 1). Se puder me ajudar, por favor!


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
srand( time(NULL) );
int key, card, cardpc;
int deck[40] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10};
int draw[40] = {0}; //array to "delete" a card. Mark a card as "deleted", e.g., by setting it to 1,
// then if the card chosen has been deleted, it choose again.
float points, points_pc;

printf("Press 1 to play or 0 to not!\t");
scanf("%d", &key);

printf("\n");

if (key ==0){
printf("BYE\n");

}else if (key==1){
while(key==1){
card = deck[rand()% 40];
if (draw[] == 1){
card = deck[rand()% 40];
}
if(card==8 || card==9 || card==10){
printf("You got 0.5 points");
points = points + 0.5;
}else{
printf("You got %d points",card);
points = points + card;
}
printf("\n");
printf("Your score is: %0.1f \n", points);

draw[]=1

cardpc = deck[rand()% 40];
if (draw[] == 1){
card = deck[rand()% 40];
}
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

draw[]=1;

printf("Do you want another card? (Press 1 if you want it)\t");
scanf("%d", &key);

printf("\n");
}
//if the user passes turn, the pc can still continue playing
while(points_pc<points){
cardpc = deck[rand()% 40];
if (draw[] == 1){
card = deck[rand()% 40];
}
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

draw[]=1;

}
printf("\n");

}

if(points_pc==points){
printf("The PC won! \n");
}else if(points_pc>7.5){
printf("You won! The PC score is above 7.5\n");
}else if(points_pc>points){
printf("The PC won! \n");
}else if(points>7.5){
printf("YOU LOST!\n");
}else if (points==7.5) {
printf("YOU WON");
}


return 0;
}




4. Re: Jogo de cartas - como remover uma carta que já foi escolhida [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 03/12/2020 - 20:57h


LuisVilo escreveu:

Bom dia!

Eu tô criando um jogo de cartas (usuario vs PC) e preciso de ajuda. O jogo é o seguinte: Há um baralho com 4 naipes diferentes. Cada grupo de naipe tem 7 cartas (de 1 a 7) e 3 cartas diferentes (valete, cavaleiro e rei). Ou seja, o baralho tem no total 40 cartas. O objetivo é conseguir fazer 7,5 pontos (parece o clássico jogo do blackjack). As 7 primeiras cartas de cada naipe valem o valor que tem a propria carta e as 3 "diferentes" valem 0.5 cada. Daí o programa pergunta pro usuario se quer carta ou quer passar a vez pro PC. Ganha quem fizer os 7,5 pontos ou quem chega mais proximo dessa pontuação, mas sem ultrapassar. Se ultrapassar, perdeu.

Eu fiz isso até agora, mas a última coisa que eu preciso é remover uma carta quando ela já foi escolhida. Com o que eu tenho aqui, como poderia fazer isso? Por favor, eu tô precisando muito de ajuda.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
srand( time(NULL) );
int key, card, cardpc;
int deck[40] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10};
float points, points_pc;

printf("Press 1 to play or 0 to not!\t");
scanf("%d", &key);

printf("\n");

if (key ==0){
printf("BYE\n");

}else if (key==1){
while(key==1){
card = deck[rand()% 40];
if(card==8 || card==9 || card==10){
printf("You got 0.5 points");
points = points + 0.5;
}else{
printf("You got %d points",card);
points = points + card;
}
printf("\n");
printf("Your score is: %0.1f \n", points);

if(points>7.5){
printf("YOU LOST!\n");
system("pause");
}else if (points==7.5) {
printf("YOU WON");
system("pause");
}
cardpc = deck[rand()% 40];
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

if(points_pc>7.5){
printf("YOU WON! The PC score is above 7.5!\n");
system("pause");
}else if (points_pc == 7.5){
printf("The PC won");
system("pause");
}
printf("Do you want another card? (Press 1 if you want it)\t");
scanf("%d", &key);

printf("\n");
}
//if the user passes turn, the pc can still continue playing
while(points_pc<points){
cardpc = deck[rand()% 40];
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

if(points_pc==points){
printf("The PC won! \n");
}else{
if(points_pc>7.5){
printf("You won! The PC score is above 7.5\n");
}else{
if(points_pc>points){
printf("The PC won! \n");
}
}
}
}
printf("\n");

}
return 0;
}

Boa noite Luis.
Não entendo da Linguagem C, mas, segue sugestão:
Armazene as cartas sorteadas em uma variável, uma unica vez.
O nº sorteado % 4, é o naipe
Tipo:
"Sorteia"
card = deck[rand()% 40];
naipe=card%4
Checa se o nº sorteado está na var "sorteadas",
Caso negativo, entrega a carta e armazena em "sorteadas.
Caso positivo, despreza e sorteia outra.



______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________



5. Re: Jogo de cartas - como remover uma carta que já foi escolhida [RESOLVIDO]

Luis Vilo
LuisVilo

(usa Outra)

Enviado em 03/12/2020 - 21:30h

Grato pela dica, Marcelo. Tentei fazer deste jeito parecido, mas não sei se tá prestando... (tentei reduzir o número de cartas para testar, mas acho que não funcionou. Alguém pode me dizer o porquê?)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
srand( time(NULL) );
int key, card, cardpc, n;
int deck[6] = {1,2,3,8,9,10};
int draw[6] = {0}; //array to "delete" a card. Mark a card as "deleted", e.g., by setting it to 1,
// then if the card chosen has been deleted, it choose again.
float points, points_pc;
points=0;
points_pc=0;

printf("Press 1 to play or 0 to not!\t");
scanf("%d", &key);

printf("\n");

if (key ==0){
printf("BYE\n");

}else if (key==1){
while(key==1){
n = deck[rand()% 6];
card = deck[n];
if (draw[n] == 1){
card = deck[rand()% 6];
}
if(card==8 || card==9 || card==10){
printf("You got 0.5 points");
points = points + 0.5;
}else{
printf("You got %d points",card);
points = points + card;
}
printf("\n");
printf("Your score is: %0.1f \n", points);

draw[n]=1;

cardpc = deck[rand()% 6];
cardpc = deck[n];
if (draw[n] == 1){
cardpc = deck[rand()% 6];
}
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

draw[n]=1;

printf("Do you want another card? (Press 1 if you want it)\t");
scanf("%d", &key);

printf("\n");
}
//if the user passes turn, the pc can still continue playing
while(points_pc<points){
cardpc = deck[rand()% 6];
cardpc = deck[n];
if (draw[n] == 1){
cardpc = deck[rand()% 6];
}
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

draw[n]=1;

}
printf("\n");

}

if(points_pc==points){
printf("The PC won! \n");
}else if(points_pc>7.5){
printf("You won! The PC score is above 7.5\n");
}else if(points_pc>points){
printf("The PC won! \n");
}else if(points>7.5){
printf("YOU LOST!\n");
}else if (points==7.5) {
printf("YOU WON");
}


return 0;
}




6. Re: Jogo de cartas - como remover uma carta que já foi escolhida

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 04/12/2020 - 20:15h

Boa noite Luis, como disse, não "manjo" de C,
Fiz um exemplo do "Sorteio" em "BASH".
#!/bin/bash
naipes=(Copas Ouro Paus Espada);
baralho=(10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43 50 51 52 53 60 61 62 63 70 71 72 73 J0 J1 J2 J3 Q0 Q1 Q2 Q3 K0 K1 K2 K3)
clear;

while :;do
read -p "Press [Cc] to continue: " -n1 key;echo;
if [[ $key =~ ^([Cc])$ && ${#baralho[@]} -gt 0 ]];then
rnd=$((RANDOM % ${#baralho[@]}));
carta=${baralho[$rnd]}
d0=${carta:0:1};
d1=${carta:1:1}; #Usado para definir o "naipe"
[[ "$d0" =~ ^([1-7])$ ]] && ponto=$d0 || ponto=0.5 #Define a pontuação da carta
echo -e "Rnd:${rnd} Carta: ${baralho[$rnd]} ${naipes[$d1]} Vlr: ${ponto}\n";
baralho=($(sed -r 's/'${baralho[${rnd}]}'[ ]?//' <<< ${baralho[@]}));
else
echo -e "Acabaram as cartas"
break;
fi
done

------------------------------------------------------------------------------------------------------------------
Explicação:
Sorteia de "0" até o nº de elementos na "Matriz baralho", sendo que,
a cada sorteio efetuado, a matriz é "refeita", eliminando "${baralho[${rnd}]}" da mesma,
com o comando:
baralho=($(sed -r 's/'${baralho[${rnd}]}'[ ]?//' <<< ${baralho[@]})); 

Testei aqui, funcionando a contento....


______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________



7. Re: Jogo de cartas - como remover uma carta que já foi escolhida [RESOLVIDO]

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 04/12/2020 - 20:32h

LuisVilo escreveu:

Eu mudei um pouco o codigo para fazer como vc falou, mas não consigo visulaizar o que deveria colocar entre os colchetes de draw[ ] =1 (a nova array que criei para sinalizar uma carta em 0 ou 1). Se puder me ajudar, por favor!


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
srand( time(NULL) );
int key, card, cardpc;
int deck[40] = {1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10};
int draw[40] = {0}; //array to "delete" a card. Mark a card as "deleted", e.g., by setting it to 1,
// then if the card chosen has been deleted, it choose again.
float points, points_pc;

printf("Press 1 to play or 0 to not!\t");
scanf("%d", &key);

printf("\n");

if (key ==0){
printf("BYE\n");

}else if (key==1){
while(key==1){
card = deck[rand()% 40];
if (draw[] == 1){
card = deck[rand()% 40];
}
if(card==8 || card==9 || card==10){
printf("You got 0.5 points");
points = points + 0.5;
}else{
printf("You got %d points",card);
points = points + card;
}
printf("\n");
printf("Your score is: %0.1f \n", points);

draw[]=1

cardpc = deck[rand()% 40];
if (draw[] == 1){
card = deck[rand()% 40];
}
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

draw[]=1;

printf("Do you want another card? (Press 1 if you want it)\t");
scanf("%d", &key);

printf("\n");
}
//if the user passes turn, the pc can still continue playing
while(points_pc<points){
cardpc = deck[rand()% 40];
if (draw[] == 1){
card = deck[rand()% 40];
}
if(cardpc==8 || cardpc==9 || cardpc==10){
printf("The PC got 0.5 points");
points_pc = points_pc + 0.5;
}else{
printf("The PC got %d points", cardpc);
points_pc = points_pc + cardpc;
}
printf("\n");
printf("The PC score is: %0.1f \n", points_pc);

draw[]=1;

}
printf("\n");

}

if(points_pc==points){
printf("The PC won! \n");
}else if(points_pc>7.5){
printf("You won! The PC score is above 7.5\n");
}else if(points_pc>points){
printf("The PC won! \n");
}else if(points>7.5){
printf("YOU LOST!\n");
}else if (points==7.5) {
printf("YOU WON");
}


return 0;
}


Seria
int draw[6] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
Se a carta é selecionada vc faz
draw[6] =1;
Vc tem de manter a info do estado da carta(selecionada, não selecionada) dentro do array draw. Daí vc pode fazer coisas como verificar se a carta foi selecionada
if (draw[5] == 1) {...
Como falei essa é a forma que imaginei com o mínimo de reescrita de código). Vc pode usar constante p definir o indice das cartas
#define REI_COPAS 1
#define VALETE_COPAS 2
e assim por diante


8. Re: Jogo de cartas - como remover uma carta que já foi escolhida

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/12/2020 - 23:45h

Eis como eu faria (em pseudo-código — não é C!):

const char baralho[]="1111222233334444555566667777JJJJQQQQKKKK";
#define N_BARALHO (sizeof baralho-1)

char jogo[N_BARALHO]=baralho; // Eu disse que não é C: não existe cópia de arrays em C (mas tenho certeza que você sabe copiar elementos de um array para outro).
embaralha(jogo); // Use um algoritmo de embaralhar, tal como “for(k=0; k<N_BARALHO; ++k) swap(&jogo[k], &jogo[(int)(N_BARALHO*rand()/(double)RAND_MAX)]);”.

size_t proxima_carta=0;
while(!final_da_rodada){
carta_entregue=jogo[proxima_carta];
++proxima_carta; // As cartas que já foram entregues se tornam indisponíveis.
}



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


9. Re: Jogo de cartas - como remover uma carta que já foi escolhida [RESOLVIDO]

Luis Vilo
LuisVilo

(usa Outra)

Enviado em 05/12/2020 - 06:25h

Muito obrigado pela ajuda, rapazes. Consegui resolver o problema, já tá funcionando.