I wanted to edit the last message to add code but for some reason I can't so sorry for the multiple replies.
I realized that after all the changes I made you will need the new code.
signatures:
Code:
#ifndef CARDS_GAME_H
#define CARDS_GAME_H
#define CARDS_PER_SUIT 13
#define DECK_SIZE 52
#define NUM_OF_PLAYERS 4
#define NUM_OF_SUITS 4
#define NUM_OF_ROUNDS 20
enum suits {Spade, Club, Diamond, Heart};
typedef enum suits suits;
struct Card {
int number;
int value;
suits suit;
};
typedef struct Card Card;
struct Player {
char name[20];
int numOfCards;
Card playerCards[DECK_SIZE];
int winner;
};
typedef struct Player Player;
Card * ShuffleCards (Card *);
Player * Dealing (Player *, Card *);
void Print (Player *);
void PlayGame (Player * _player);
int Match(Card _attackerCard, Player _attacker, Player _defender);
void PlayGame (Player * _players);
#endif
Main
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Cards_Signatures.h"
int main(int argc, char **argv) {
int cont = 1;
int option;
Card cards[DECK_SIZE];
Card * cardsPtr = cards;
Player players[NUM_OF_PLAYERS] = {0};
Player * playersPtr = players;
while (cont)
{
printf("Choose option: \n");
printf("1: Play \n");
printf("Any other nuber - Quit \n");
scanf("%d", &option);
switch (option) {
case 1:
system("clear");
cardsPtr = ShuffleCards (cards);
playersPtr = Dealing (playersPtr, cardsPtr);
Print (players);
PlayGame (playersPtr);
getchar();
break;
default:
cont = 0;
break;
}
putchar('\n');
}
return 0;
}
functions
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "Cards_Signatures.h"
Player * SortCards (Player*, int, int);
void PrintSuit (Player*, int, int);
Card * ShuffleCards (Card * _cards)
{
int cardsArray[DECK_SIZE];
int i;
int place;
for (i = 0 ; i < DECK_SIZE ; i++)
{
cardsArray[i] = 0;
}
i = 2;
srand(time(NULL));
while (i < DECK_SIZE + 2)
{
place = rand() % DECK_SIZE;
if (cardsArray[place] == 0)
{
cardsArray[place] = i;
i++;
}
}
for (i = 0 ; i < DECK_SIZE ; i++)
{
_cards[i].number = cardsArray[i];
_cards[i].value = (cardsArray[i] - 2) % CARDS_PER_SUIT + 2;
_cards[i].suit = (cardsArray[i] - 2) / CARDS_PER_SUIT;
}
return _cards;
}
Player * Dealing (Player * _players, Card * _cardsArray)
{
int i;
for (i = 0 ; i < NUM_OF_PLAYERS ; i++)
{
_players[i].numOfCards = CARDS_PER_SUIT;
}
for (i = 0 ; i < DECK_SIZE ; i++)
{
_players[i % NUM_OF_PLAYERS].playerCards[i / NUM_OF_PLAYERS].number = _cardsArray[i].number;
_players[i % NUM_OF_PLAYERS].playerCards[i / NUM_OF_PLAYERS].value = _cardsArray[i].value;
_players[i % NUM_OF_PLAYERS].playerCards[i / NUM_OF_PLAYERS].suit = _cardsArray[i].suit;
}
for (i = 0 ; i < NUM_OF_PLAYERS ; i++)
{
_players = SortCards(_players, _players[i].numOfCards, i);
sprintf(_players[i].name, "Player %d", i + 1);
}
return _players;
}
void Print (Player * _players)
{
int i;
for (i = 0 ; i < NUM_OF_PLAYERS ; i++)
{
putchar('\n');
printf("Player %d cards are:\n\n", i + 1);
printf("Spades: ");
PrintSuit(_players, i, 0);
putchar('\n');
printf("Clubs: ");
PrintSuit(_players, i, 1);
putchar('\n');
printf("Diamonds: ");
PrintSuit(_players, i, 2);
putchar('\n');
printf("Hearts: ");
PrintSuit(_players, i, 3);
putchar('\n');
putchar('\n');
}
}
void PrintSuit (Player * _players, int i, int suit)
{
int j;
for (j = 0 ; j < _players[i].numOfCards ; j++)
{
if (_players[i].playerCards[j].suit == suit)
{
if (_players[i].playerCards[j].value > 1 && _players[i].playerCards[j].value < 10)
printf ("%d ", _players[i].playerCards[j].value);
if (_players[i].playerCards[j].value == 10)
printf ("T ");
if (_players[i].playerCards[j].value == 11)
printf ("J ");
if (_players[i].playerCards[j].value == 12)
printf ("Q ");
if (_players[i].playerCards[j].value == 13)
printf ("K ");
if (_players[i].playerCards[j].value == 14)
printf ("A ");
}
}
}
Player * SortCards (Player * _players, int _n, int _numOfPlayer)
{
int i,j;
Card temp;
for (i = 1 ; i < _n ; i++)
{
for (j = i ; j > 0 ; j--)
{
if (_players[_numOfPlayer].playerCards[j].number < _players[_numOfPlayer].playerCards[j - 1].number)
{
temp = _players[_numOfPlayer].playerCards[j];
_players[_numOfPlayer].playerCards[j] = _players[_numOfPlayer].playerCards[j - 1];
_players[_numOfPlayer].playerCards[j - 1] = temp;
}
else
{
break;
}
}
}
return _players;
}
int Match(Card _attackerCard, Player _attacker, Player _defender)
{
int i;
printf("\n%s attacks with card %d-%d. ", _attacker.name, _attackerCard.suit +1, _attackerCard.value);
for (i = _defender.numOfCards - 1; i >= 0; i--)
{
if (((_attackerCard.suit == ((_defender.playerCards)[i]).suit)))
{
if (((_attackerCard.value < ((_defender.playerCards)[i]).value)))
{
printf("%s defends with card %d-%d\n", _defender.name, _defender.playerCards[i].suit +1, _defender.playerCards[i].value);
return i; /* Second player won the match. Returnes number of card in player's hand */
}
}
}
printf("%s couldn't counter and loses his turn!!\n", _defender.name);
printf("\n%s forfeits!!\n", _defender.name);
return 0; /* First player won the match */
}
Player InternalSort(Player _player)
{
int i,j;
Card temp;
for (i = _player.numOfCards - 1; i > 0; i--)
{
for (j = 0; j < _player.numOfCards - 1; j++)
{
if (((_player.playerCards[j].number > _player.playerCards[j + 1].number)))
{
temp = ((_player.playerCards)[j]);
(_player.playerCards)[j] = (_player.playerCards)[j + 1];
(_player.playerCards)[j + 1] = temp;
}
}
}
return _player;
}
Player DiscardLeftShift(Player _player, Card _attackerCard)
{
int i, place;
Card temp;
place = _player.numOfCards - 1;
for (i = 0; i < place - 1; i++)
{
if (_attackerCard.number == ((_player.playerCards)[i]).number)
{
temp = (_player.playerCards)[place];
(_player.playerCards)[place] = (_player.playerCards)[i];
(_player.playerCards)[i] = temp;
break;
}
}
if (_player.numOfCards > 0)
{
(_player.numOfCards)--;
}
place = _player.numOfCards;
_player = InternalSort(_player);
return _player;
}
Player RightShift(Player _player, Card _card)
{
_player.numOfCards++;
_player.playerCards[_player.numOfCards - 1] = _card;
_player = InternalSort(_player);
return _player;
}
void PlayGame (Player * _players)
{
int i, j, lowestCardCount, currentWinner;
int attackerNum = 0;
int defenderNum = 0;
int matchResult = 0;
int winNumber = 0; /* '0' - nobody won, '1' - first won, '2' - second won. '3' - both players won */
Card attackerCard;
lowestCardCount = 0;
currentWinner = 0;
system("clear");
for (i = 0 ; i < (NUM_OF_PLAYERS * NUM_OF_ROUNDS) ; i++)
{
attackerNum = (i % 4);
defenderNum = (attackerNum + 1) % NUM_OF_PLAYERS;
if ((attackerNum == 0) && (i > 0))
{
printf("************************************************************************************************\nEnd of round %d\n", (i / 4));
printf("************************************************************************************************\n\n");
putchar('\n');
printf("Here are the players hand at the end of the round: \n");
Print(_players);
getchar();
}
/*printf("%s number of cards %d\n",_players[attackerNum].name, _players[attackerNum].numOfCards);*/
attackerCard = (_players[attackerNum].playerCards[rand() % _players[attackerNum].numOfCards]);
matchResult = Match(attackerCard, _players[attackerNum], _players[defenderNum]);
if (matchResult == 0) /* First (attacking) player won the match */
{
_players[attackerNum] = DiscardLeftShift(_players[attackerNum], attackerCard);
_players[defenderNum] = RightShift(_players[defenderNum], attackerCard);
i++;
}
else /* Second (defending) player won the match */
{
_players[attackerNum] = DiscardLeftShift(_players[attackerNum], attackerCard);
_players[defenderNum] = DiscardLeftShift(_players[defenderNum], _players[defenderNum].playerCards[matchResult]);
}
if (((_players[attackerNum].numOfCards) == 0) && (_players[defenderNum].numOfCards) > 0)
{
printf("break1");
winNumber = 1;
break;
}
if (((_players[attackerNum].numOfCards) > 0) && (_players[defenderNum].numOfCards) == 0)
{
printf(" break2 ");
winNumber = 2;
break;
}
if (((_players[attackerNum].numOfCards) == 0) && (_players[defenderNum].numOfCards) == 0)
{
printf("break3");
winNumber = 3;
break;
}
}
switch (winNumber)
{
case(1):
printf("\nPlayer %d won!!", attackerNum + 1);
break;
case(2):
printf("\nPlayer %d won!!", defenderNum +1);
break;
case(3):
printf("\nPlayers %d and %d won together! Hooray for partnership, good will and stuff!\n\n", attackerNum +1 , defenderNum + 1);
break;
case(0):
for (j = 0; j < NUM_OF_PLAYERS; j++)
{
if (_players[j + 1].numOfCards < _players[attackerNum].numOfCards)
{
lowestCardCount = _players[j + 1].numOfCards;
currentWinner = j + 1;
break;
}
}
printf("\nThere were no outright winners, so the players holding the lowest number of cards win: Player %d\n\n", currentWinner);
for (i = 0; i < NUM_OF_PLAYERS; i++)
{
if (i !=currentWinner && _players[i].numOfCards == lowestCardCount)
{
printf(" and Player %d", i);
}
}
printf("!!");
break;
}
}