I just wanted to make a fun project for practise and as far as I know the program runs just fine without any flaws, but I would like to add an option to it, if a round ends to ask the user if he wants to play another round. Maybe I should put the whole thing in a while loop or something but everything I tried failed. And I should reset the first array int values_w_p[][2]
, but I dont know what would be the best method for that. Another thing would be of course the betting and balance, but for that I have atleast some ideas which I will try. Tips are welcome too! Here is the code:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <stdbool.h>
int *actValue(int values[][2]){ // function to create the array based on probability
int len = 0;
for (int i = 0; i<10;i++){
len = len + values[i][1];
}
int *arr = (int*)malloc(len*(sizeof(int)));
int count=0;
for (int q = 0; q<10; q++){
for (int w = 0; w < values[q][1]; w++){
arr[count]=values[q][0];
count++;
}
}
return arr;
}
int lenOfArr(int values[][2]){ //based on the probability array returns the length of it (values_w_p)
int len = 0;
for (int i = 0; i<10;i++){
len = len + values[i][1];
}
return len;
}
int drawacard(int *valuenow, int len, int values_w_p[][2]){ // picks a random value from the array generated with actValue and takes one from the probability
int yourcard = valuenow[rand() % (len - 0) + 0];
int sec=1;
values_w_p[yourcard-2][sec] -= 1;
return yourcard;
}
void name(int card) { //prints the name of the card baed on the value
const char *color [] = {"Clubs", "Diamonds", "Hearts", "Spades" };
const char *nev [] = {"2","3","4","5","6","7","8","9","10","Jack", "Queen", "King","Ace" };
if(card < 10){
printf("%s of %s\n", nev[card-2], color[rand()%4]);
}
else if (card == 10){
printf("%s of %s\n", nev[rand() % (11 + 1 - 8) + 8], color[rand()%4]);
}
else if(card == 11){
printf("%s of %s\n", nev[12], color[rand()%4]);
}
}
int total(int total[]){ //it will calc the total value of a the cards based on the array(player or dealer)
int sum = 0;
for (int j = 0; j<16;j++){
sum = sum + total[j];
}
return sum;
}
int main(){
srand((unsigned int)time(0));
int values_w_p [][2] = {
{2,8},{3,8},{4,8},{5,8},{6,8},{7,8},{8,8},{9,8},{10,32},{11,8}
};
int *ptotal = (int*)calloc(16,sizeof(int));
int *dtotal = (int*)calloc(16,sizeof(int));
ptotal[0]= drawacard(actValue(values_w_p), lenOfArr(values_w_p), values_w_p);
ptotal[1]= drawacard(actValue(values_w_p), lenOfArr(values_w_p), values_w_p);
dtotal[0]= drawacard(actValue(values_w_p), lenOfArr(values_w_p), values_w_p);
printf("\nyour card: ");
name(ptotal[0]);
printf("\nyour card: ");
name(ptotal[1]);
printf("\ndealers card: ");
name(dtotal[0]);
printf("\n------------------------------------------------\n");
int inp=0;
int count=0;
while(inp==0){
if (total(ptotal)==21){
printf("\nYou have a blackjack, lets see the dealers hand");
dtotal[count] = drawacard(actValue(values_w_p), lenOfArr(values_w_p), values_w_p);
printf("\ndealers card: ");
name(dtotal[count]);
if (total(dtotal)!=21){
printf("\nCongrats! You win!");
break;
}
else{
printf("\nSadly its a TIE");
break;
}
}
printf("Hit or stand?(0 for hit, 1 for stand): ");
scanf("%d", &inp);
if (inp == 1){
while(total(dtotal)<17){
count++;
dtotal[count] = drawacard(actValue(values_w_p), lenOfArr(values_w_p),values_w_p);
printf("\ndealers card: ");
name(dtotal[count]);
if (total(dtotal)==21){
printf("\nThe dealer has a blackjack, you lost");
break;
}
else if(total(dtotal)>21 && total(ptotal)<22){
printf("\nYou win");
break;
}
else if(total(dtotal)>21 && total(ptotal)>21){
printf("\n Its a TIE");
break;
}
else if(total(dtotal)>16 && total(dtotal)>total(ptotal)){
printf("You lost");
break;
}
else if(total(dtotal)==total(ptotal) && total(dtotal)>16){
printf("its a TIE");
break;
}
else if(total(dtotal)<total(ptotal) && total(dtotal)>16){
printf("You win");
break;
}
}
}
else{
count++;
ptotal[count+1] = drawacard(actValue(values_w_p), lenOfArr(values_w_p), values_w_p);
printf("\nyour card: ");
name(ptotal[count+1]);
if (total(ptotal)>21){
printf("\nYou lost");
break;
}
}
}
return 0;
}