Probleem in c

Status
Niet open voor verdere reacties.

BAMJW

Gebruiker
Lid geworden
27 dec 2008
Berichten
7
hallo iedereen,
ik heb een klein probleempje zal het zokort mogelijk uitleggen.
heb een project blacjack, ben nog maar een beginner in de C taal en zit nu vast, dit is de code.
dus hiervoor is al een ander stukje dat het bedrag vraagt enzo en het spel start maar dat is inorde.
wat is nu het probleem ik wil bij de functie onzichtbaar kaart die string onzichtbaar_dealer_kaart terug geven en in een variable steken om op te tellen met de andere wel zichtbare kaart. ik hoop dat jullie hier aan uit kunnen.
alvast bedankt,

typedef struct{
int kleur;
int waarde;
} KAART;


void geef_kaart(KAART);
char onzichtbaar_kaart (KAART);


int main (void){
char weergave_kaart [4][5]={"aas","boer","dame","heer"} ;
char weergave_kleur [4][9]={"harten","ruiten","schoppen","klaveren"};

int i_dealer=0,i_speler=0,onzichtbare_kaart=0;
KAART willekeurig_dealer, willekeurig_speler;
char onzichtbaar_dealer_kaart[20];


srand(time(NULL));
while(i_dealer==0)
{
printf("dealer kaarten\n ");
i_dealer=1;
}
i_dealer=0;
while(i_dealer==0||i_dealer==1)
{
willekeurig_dealer.kleur=rand()%4;
willekeurig_dealer.waarde=rand()%13;
if(i_dealer==0)
{
onzichtbaar_kaart(willekeurig_dealer);
} else
{
geef_kaart(willekeurig_dealer) ;
}
i_dealer++;

}

while(i_speler==0) {

printf("\nspeler kaarten\n ");
i_speler=1;
}
i_speler=0;
while(i_speler==0||i_speler==1)
{
willekeurig_speler.kleur=rand()%4;
willekeurig_speler.waarde=rand()%13;
geef_kaart(willekeurig_speler);
i_speler++;

}

return 0;
}
void geef_kaart (KAART kaart)
{
char weergave_kaart [4][5]={"aas","boer","dame","heer"} ;
char weergave_kleur [4][9]={"harten","ruiten","schoppen","klaveren"};


switch(kaart.kleur)
{
case 0:printf("\n%s",weergave_kleur[0]);break;
case 1:printf("\n%s",weergave_kleur[1]);break;
case 2:printf("\n%s",weergave_kleur[2]);break;
case 3:printf("\n%s",weergave_kleur[3]);break;

}
switch(kaart.waarde)
{
case 0:printf("\n%s",weergave_kaart[0]);break;
case 10:printf("\n%s",weergave_kaart[1]);break;
case 11:printf("\n%s",weergave_kaart[2]);break;
case 12:printf("\n%s",weergave_kaart[3]);break;
default:printf("%d\n",kaart.waarde);
}
return (kaart.waarde);
}
char onzichtbaar_kaart (KAART kaart)
{
char weergave_kaart [4][5]={"aas","boer","dame","heer"} ;
char weergave_kleur [4][9]={"harten","ruiten","schoppen","klaveren"};

char onzichtbaar_dealer_kaart[20];


switch(kaart.kleur)
{
case 0:strcpy(onzichtbaar_dealer_kaart,weergave_kleur[0]);break;
case 1:strcpy(onzichtbaar_dealer_kaart,weergave_kleur[1]);break;
case 2:strcpy(onzichtbaar_dealer_kaart,weergave_kleur[2]);break;
case 3:strcpy(onzichtbaar_dealer_kaart,weergave_kleur[3]);break;

}
switch(kaart.waarde)
{
case 0:strcat(onzichtbaar_dealer_kaart,weergave_kaart[0]);break;
case 10:strcat(onzichtbaar_dealer_kaart,weergave_kaart[1]);break;
case 11:strcat(onzichtbaar_dealer_kaart,weergave_kaart[2]);break;
case 12:strcat(onzichtbaar_dealer_kaart,weergave_kaart[3]);break;
default:strcat(onzichtbaar_dealer_kaart,kaart.waarde);
}
return onzichtbaar_dealer_kaart;
 
In C (en ieder andere programmeer taal) kun je niet gehele arrays(in dit geval van karakters) retourneren of als argument meegeven. Vaak laat de syntax dat wel toe maar wordt op de achtergrond slechts een referentie/pointer doorgegeven.

Wat je dus moet doen is char* teruggeven, ipv char.
 
bedankt ik heb al geen fouten meer.

maar nu heb ik een general protection exeption
processor fault.

ik werk met borland. weet je hoe da komt?
alvast bedankt
 
ik heb hier het vernieuwde stukje code ik hoop da je kunt achterhalen waarom ik een general protection exception heb?

alvast bedankt

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <time.h>
#include <ctype.h>

typedef struct{
int kleur;
int waarde;
} KAART;

int geef_kaart(KAART);
char onzichtbaar_kaart (KAART);

int main (void){

int i_dealer=0,i_speler=0;
KAART willekeurig_dealer, willekeurig_speler;
char *resultaat; /* dit is om de pointer p van de functie onzichtbaar_kaart op te nemen in een andere pointer om die later te gebruiken.*/


srand(time(NULL));
while(i_dealer==0)
{
printf("dealer kaarten\n ");
i_dealer=1;
}
i_dealer=0;
while(i_dealer==0||i_dealer==1)
{
willekeurig_dealer.kleur=rand()%4;
willekeurig_dealer.waarde=rand()%13;
if(i_dealer==0)
{
*resultaat=onzichtbaar_kaart(willekeurig_dealer); /*functie voor de eerste dealer die onzichtbaar moet zijn weer te geven.*/
printf("%s",resultaat);
} else
{
geef_kaart(willekeurig_dealer) ;
}
i_dealer++;

}

while(i_speler==0) {

printf("\nspeler kaarten\n ");
i_speler=1;
}
i_speler=0;
while(i_speler==0||i_speler==1)
{
willekeurig_speler.kleur=rand()%4;
willekeurig_speler.waarde=rand()%13;
geef_kaart(willekeurig_speler);
i_speler++;

}

return 0;
}

int geef_kaart (KAART kaart) /* <-- dit is mijn een beetje verwarrend waarom ik 2 maal "kaart" moet zetten???*/
{
char weergave_kaart [4][5]={"aas","boer","dame","heer"} ;
char weergave_kleur [4][9]={"harten","ruiten","schoppen","klaveren"};


switch(kaart.kleur)
{
case 0:printf("\n%s",weergave_kleur[0]);break;
case 1:printf("\n%s",weergave_kleur[1]);break;
case 2:printf("\n%s",weergave_kleur[2]);break;
case 3:printf("\n%s",weergave_kleur[3]);break;

}
switch(kaart.waarde)
{
case 0:printf("\n%s",weergave_kaart[0]);break;
case 10:printf("\n%s",weergave_kaart[1]);break;
case 11:printf("\n%s",weergave_kaart[2]);break;
case 12:printf("\n%s",weergave_kaart[3]);break;
default:printf("%d\n",kaart.waarde);
}
return kaart.waarde;
}
char onzichtbaar_kaart (KAART kaart) /* <-- dit is mijn een beetje verwarrend waarom ik 2 maal "kaart" moet zetten???*/
{
char weergave_kaart [4][5]={"aas","boer","dame","heer"} ;
char weergave_kleur [4][9]={"harten","ruiten","schoppen","klaveren"};

char onzichtbaar_dealer_kaart[20];
char *p;


switch(kaart.kleur)
{
case 0:strcpy(onzichtbaar_dealer_kaart,weergave_kleur[0]);break;
case 1:strcpy(onzichtbaar_dealer_kaart,weergave_kleur[1]);break;
case 2:strcpy(onzichtbaar_dealer_kaart,weergave_kleur[2]);break;
case 3:strcpy(onzichtbaar_dealer_kaart,weergave_kleur[3]);break;

}
switch(kaart.waarde)
{
case 0:strcat(onzichtbaar_dealer_kaart,weergave_kaart[0]);break;
case 10:strcat(onzichtbaar_dealer_kaart,weergave_kaart[1]);break;
case 11:strcat(onzichtbaar_dealer_kaart,weergave_kaart[2]);break;
case 12:strcat(onzichtbaar_dealer_kaart,weergave_kaart[3]);break;
default:strcat(onzichtbaar_dealer_kaart,kaart.waarde);
}
p = onzichtbaar_dealer_kaart;
puts(onzichtbaar_dealer_kaart); /*dit is een test om te zien of dit deel wel werkt*/


return *p; /* <-- hier wil ik die pointer terug geven en in de andere pointer "resultaat" steken maar lukt niet echt*/
}
 
De functie is nog steeds van het type char, dat kan niet als je een pointer wilt retourneren. Daarbij geef je met return *p aan dat je het eerste karakter waar p NAAR WIJST wilt retourneren. Dat wil je niet, je wilt het adres zelf dus return p is genoeg.
 
Laatst bewerkt:
wel dat heb ik gedaan maar dan krijg ik een fout met nonportable pointer converstion wat is da dan?
alvast bedankt
 
wat voor data type moet ik dan mijn functie geven om die door te krijgen in mijn main functie?
 
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

typedef struct
{
    int kleur, waarde;
} KAART;


KAART GeefKaart()
{        
    return (KAART){rand()%4, rand()%13};
}

void print(const KAART k)
{
    
    static const char *weergave_kleur[] = {"Harten", "Ruiten", "Schoppen", "Klaveren" };
    static const char *weergave_kaart[] = {"Aas", "Twee", "Drie", "Vier", "Vijf",
                                           "Zes", "Zeven", "Acht", "Negen", "Tien",
                                           "Boer", "Dame", "Heer"};    
    
    printf("Kleur: %s\tKaart: %s\n", weergave_kleur[k.kleur], weergave_kaart[k.waarde]);              
}

int main(int argc, char *argv[])
{  
  srand(GetTickCount());  
  KAART kaart = GeefKaart();
  print(kaart);  
  
  system("PAUSE");	
  return 0;
}

Op deze manier kun je een verborgen kaart krijgen door de kaart gewoon niet te printen.
 
hallo cod_nl alvast bedankt voor u hulp, maar zou ik graag wat uitleg mogen bij die stappen aub. want zoals ik ervoor al had vermeld ik ben nog maar een beginner in C
en waar moet ik dit plakken in mijn programma.
hier onder heb ik de vragen gezet bij elk regel.
NOGMAALS BEDANKT HEREN VOOR JULLIE STEUN EN HULP!!!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

typedef struct
{
int kleur, waarde;
} KAART;


KAART GeefKaart()/* is da de zelfde geefKaart als in mijn stukje code alleen ben je die _ vergeten of is dit een andere functie*/
{
return (KAART){rand()%4, rand()%13};
}

void print(const KAART k)
{

static const char *weergave_kleur[] = {"Harten", "Ruiten", "Schoppen", "Klaveren" };
static const char *weergave_kaart[] = {"Aas", "Twee", "Drie", "Vier", "Vijf",
"Zes", "Zeven", "Acht", "Negen", "Tien",
"Boer", "Dame", "Heer"};

printf("Kleur: %s\tKaart: %s\n", weergave_kleur[k.kleur], weergave_kaart[k.waarde]);
}

int main(int argc, char *argv[])/* wat is argc en argv???*/
{
srand(GetTickCount()); /* wat is gettickcount*/
KAART kaart = GeefKaart();
print(kaart);

system("PAUSE");
return 0;
}
 
Code:
KAART GeefKaart()/* is da de zelfde geefKaart als in mijn stukje code alleen ben je die _ vergeten of is dit een andere functie*/
{        
    return (KAART){rand()%4, rand()%13};
}

In jouw code genereer je eerst de kaart, en roep je daarna de functies aan om uit te zoeken welke kaart je hebt. In dit geval kun je deze functie aanroepen om een random kaart te krijgen(dit kun je dus voor de speler en de computer doen), en wanneer je de kaart wilt printen hoef je alleen maar de print functie aan te roepen met de desbetreffende kaart.

Code:
int main(int argc, char *argv[])/* wat is argc en argv???*/

Daarmee kun je argumenten meegeven aan de command line. Je kunt ze in dit geval ook weglaten als je ze niet gebruikt.

edit: en de code tussen de [ code] [ /code] tags zetten zorgt ervoor dat de code een stuk leesbaarder is.
 
Yuck!

GeefKaart is volledig random. Dus je hebt een oneindig aantal spellen kaarten in gebruik.
Blackjack wordt gespeeld met een vooraf vastgesteld aantal spellen kaarten (meestal 4 of 6). Dat is erg belangrijk voor het spel en zul je dus ook in je programma mee moeten nemen. De handigste methode is om vooraf een een random stapel kaarten te genereren en daaruit te delen. Zo werkt het in het echt immers ook. (Onee, casino's zijn nu helemaal geautomatiseerd dus niet meer betrouwbaar).
 
Oke bedankt voor de tips allemaal ik waardeer dit enorm.was een goed idee maar had tijd gebrek ik was al blij dat het werkt:d.maar heb intussen al mijn project ingediend. nu nog wachten op de resultaten. thanks
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan