Code:
/******************************************************************
Basisstructeren:
*******************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h> /* Tijd weergeven */
#define GESCHIEDENIS_FILE "bjges.txt" /* Geschiedenis file oproepen */
#define MAX 80
#define size_array 52 /* 52 Kaarten in één spel */
/******************************************************************
Structuren:
*******************************************************************/
const char *kaart_naam[] =
{
"Aas", "Twee", "Drie", "Vier", "Vijf", "Zes", "Zeven",
"Acht", "Negen", "Tien", "Boer", "Koningin", "Koning"
}; /* Gebruik voor het tonen van de kaarten op naam! */
const char *soort_naam[] =
{
"Harten", "Klaveren", "Koeken", "Schoppen"
};/*Gebruik voor het tonen van de kaarten op soort!*/
/* Globale Variabelen */
int deck[size_array];
char soort[size_array];
int spelercredit;
int delercredit;
/* Deck is globaal! */
void verwissel (int *n1, int *n2)
{
int temp;
temp = *n1;
*n1 = *n2;
*n2 = temp;
} /* Verwisselen */
void schud_array(int *array)
{
int ctr;
int n1,n2;
/*Verwisselt de kaarten 1000 keer!*/
/*Schudden */
for (ctr=0;ctr<1000;ctr++)
{
n1 = rand()%size_array;
n2 = rand()%size_array;
verwissel((array + n1), (array+n2));
}
} /* Schud_Array */
void nieuw_spel(void)
{
int ctr;
for (ctr=0;ctr<size_array;ctr++)
{
deck[ctr]=ctr/4; //kaarten 0-12
soort[ctr]=ctr%4; //soort 0-3
}
schud_array(deck); //Schud deck.
} /* Nieuw_spel */
void toon_computer(char *hand, char many)
{
int ctr;
gotoxy(1,1);
/* Ga naar de eerste box op het scherm om af te printen! */
printf("Computer heft één kaart die je niet kan zien en:\n");
for (ctr=1;ctr<many;ctr++) /*Op één starten om eerste kaart niet weer te geven!*/
printf("%s of %s\n", kaart_naam[deck[hand[ctr]]],
soort_naam[soort[hand[ctr]]]);
} /* Toon_Computer */
void toon_computer2(char *hand, char many, int totaal)
{
int ctr;
gotoxy(1,1);
printf("Computer heeft:");
for (ctr=0;ctr<many;ctr++)
printf("%s of %s\n", kaart_naam[deck[hand[ctr]]],
soort_naam[soort[hand[ctr]]]);
printf("\ntotaal %i\n", totaal);
} /* Toon_Computer2 */
void toon_speler(char *hand, char many, int totaal)
{
int ctr;
printf("\n\n\n\n\n\nU heeft:\n");
for (ctr=0;ctr<many;ctr++)
printf("%s of %s\n", kaart_naam[deck[hand[ctr]]],
soort_naam[soort[hand[ctr]]]);
printf("totaal %i\n", totaal);
} /* toon_speler */
void comp_wint(void)
{
printf("Computer wint!");
delercredit++;
spelercredit--;
} /* comp_wint */
void speler_wint(void)
{
printf("U wint!");
spelercredit++;
delercredit--;
} /* speler_wint */
void niemand_wint(void)
{
printf("ex aequo!");
} /* niemand_wint*/
int get_totaal(char *hand, char many)
{
int ctr;
int totaal=0;
int azen=0;
int temp;
for (ctr=0;ctr<many;ctr++)
{
temp = deck[hand[ctr]]+1;
if (temp>10) temp=10; //Alle beeldjes (Koning, Koningin, Boer) word gelijk aan 10
totaal+=temp;
if (deck[hand[ctr]]==0)
{
azen++;
totaal+=10;
}
} /* Einde van de loop */
while (totaal>21 && azen>0)
{
totaal-=10;
azen--;
}
return totaal;
} /* get_totaal */
int main (void)
{
char s_kaarten[7],c_kaarten[7]; // Kan niet meer dan 7 kaarten hebben zonder kapot te raken
int s_credits, c_credits;
int s_totaal;
int c_totaal;
int slot_in_deck;
char done=0;
char key;
FILE* geschiedenis;
char aLine[MAX];
char *ptr;
int errFlag;
struct tm t;
struct tm* tp;
time_t zijntijd;
srand (time(NULL));
clrscr();
spelercredit = delercredit = 100; /* Tenzij geschiedenisbestand is opgestart */
printf("\tMenu Black Jack\n\n");
printf("1. Nieuw Spel\n2. Laad Geschiedenis\n3. High Scores\n4. Instructies\n5. Opties\n6. Extra's\n\n\n\nWat is uw keuze?: ");
for (; ; )
{
if ( (key = getch()) == '1' )
break;
if ( key == '2' )
{
/* Toon de geschiedenis file */
clrscr();
errFlag = 0;
if ( (geschiedenis = fopen(GESCHIEDENIS_FILE, "r")) == NULL )
errFlag = 1;
else
{
fgets(aLine, MAX, geschiedenis);
fclose(geschiedenis);
if ( (ptr = strtok(aLine, " ")) == NULL )
errFlag = 1; /* ERROR */
else
{
zijntijd = (time_t)atol(ptr);
if ( (ptr = strtok(NULL, " ")) == NULL )
errFlag = 1; /* ERROR */
else
{
spelercredit = atoi(ptr);
if ( (ptr = strtok(NULL, " ")) == NULL )
errFlag = 1; /* ERROR */
else
delercredit = atoi(ptr);
}
}
}
if ( errFlag )
{
zijntijd = 0;
printf("Geen of slechte geschiedenis File. Spel start met 100 credits elk\n");
}
else
{
tp = localtime(&zijntijd);
t = *tp;
strftime(aLine, MAX-1, "%A, %B %d, %I:%M %p", &t);
printf("Laatst gespeeld: %s\n", aLine);
printf("Beschikbare credits speler: %i\n", spelercredit);
printf("Beschikbare credits deler: %i\n", delercredit);
}
printf("Druk op een toets om het spel te starten...\n");
(void)getch();
break;
} /*Eindigen van geschiedenis file*/
else if ( key == '3' )
return 0;
} /*Einde van de loop - negeren van andere toetsen die ingegeven zijn*/
while (!done)
{
nieuw_spel;/*"Installeren" van de kaarten*/
s_kaarten[0]=0;
c_kaarten[0]=1;
s_kaarten[1]=2;
c_kaarten[1]=3;
/*Delen van de eerste 4 kaarten*/
s_credits=2;
c_credits=2;
/*Speler en computer hebben 2 kaarten*/
slot_in_deck = 4; /*4 kaarten gedeelt*/
clrscr(); //Het scherm leegmaken om het spel te tonen
/*Get totalen*/
c_totaal = get_totaal(c_kaarten,c_credits);
s_totaal = get_totaal(s_kaarten,s_credits);
toon_computer(c_kaarten,c_credits);
toon_speler(s_kaarten, s_credits, s_totaal);
if (c_totaal!=21 && s_totaal!=21)
{
while (s_totaal <21)
{
printf("\n\n\n(H)it of (S)tay?");
key = getch();
if (key=='h' || key=='H')
{
s_kaarten[s_credits]=slot_in_deck;
s_credits++;
slot_in_deck++;
}
else
break;
/*Get totaal*/
c_totaal = get_totaal(c_kaarten,c_credits);
s_totaal = get_totaal(s_kaarten,s_credits);
clrscr();
toon_computer(c_kaarten,c_credits);
toon_speler(s_kaarten, s_credits, s_totaal);
}
while (c_totaal<16 && s_totaal<22)
{
c_kaarten[c_credits]=slot_in_deck;
c_credits++;
slot_in_deck++;
/*Get totalen*/
c_totaal = get_totaal(c_kaarten,c_credits);
s_totaal = get_totaal(s_kaarten,s_credits);
clrscr();
toon_computer2(c_kaarten,c_credits,c_totaal);
toon_speler(s_kaarten,s_credits,s_totaal);
printf("\n\n\nComputer hits");
(void)getch();
}
}
else
{
if (c_totaal == 21 && s_totaal<21) //Zeker zijn dat het geen gelijkspel is
printf("Computer heeft Black Jack!");
else if (c_totaal == 21) //Als c_totaal 21 is en s_totaal ook 21 is
printf("Jullie hebben beide Black Jack!");
else
printf("U heeft Black Jack!");
}
clrscr();
toon_computer2(c_kaarten, c_credits, c_totaal);
toon_speler(s_kaarten, s_credits, s_totaal);
printf("\n\n\n\n");
if (s_totaal<22)
{
if (s_totaal>c_totaal)
speler_wint();
else if (c_totaal<22)
comp_wint();
else
speler_wint();
}
else
comp_wint();
printf(" Speler Credits: %i Deler Credits: %i\n", spelercredit,
delercredit);
printf(" Speel opnieuw? (J)a of (N)ee");
key=getch();
if (key=='n' || key=='N')
done=1;
}
if ( (geschiedenis = fopen(GESCHIEDENIS_FILE, "w" )) == NULL )
printf("ERROR: Kan spelgeschiedenis niet opslaan!\n");
else
{
fprintf(geschiedenis, "%ld %i %i\n", (long)time(NULL), spelercredit,
delercredit);
fclose(geschiedenis);
}
return 0;
} /* Return naar begin */