Spades.c
/* ===========================================================================
* Scoring
*
* Score the round now.
* First see if any player made a 0 bid.
* Each players bid is kept in the player game_data field.
* Then tally up the tricks each team made and score the team.
* Check if the team has too many overtricks during the game.
*/
void Spades_score_round()
{
int team_tricks[SPADES_TEAM_COUNT] = { 0, 0 };
unsigned int i, team, score, off;
struct player * player;
char buf[1024];
int overtricks;
off = 0;
for (player = get_array_b_element(Spades->players, 0); player;
player = next_array_b_element(Spades->players)) {
team = player->number % SPADES_TEAM_COUNT;
score = player->played_card_count / SPADES_PLAYER_COUNT;
if (0 == player->game_data) {
if (0 == score) {
off += sprintf(buf + off,
"Player %d %s made the 0 bid.\n",
player->number, player->name);
Spades_misc->team_score[team] += 100;
} else {
off += sprintf(buf + off,
"Player %d %s failed to make the 0 bid.\n",
player->number, player->name);
Spades_misc->team_score[team] -= 100;
}
}
team_tricks[team] += score;
}
for (team = 0; team < SPADES_TEAM_COUNT; team++) {
overtricks = (team_tricks[team] - Spades_misc->team_bid[team]);
if (0 <= overtricks) {
off += sprintf(buf + off,
"Team %d made their bid of %d with %d overtricks.\n",
team, Spades_misc->team_bid[team], overtricks);
if (overtricks) {
if (overtricks / 10) {
Spades_misc->team_score[team] -= 100;
}
if (((Spades_misc->team_score[team] + overtricks) % 10) <
(Spades_misc->team_score[team] % 10)) {
Spades_misc->team_score[team] -= 100;
}
}
Spades_misc->team_score[team] +=
((Spades_misc->team_bid[team] * 10) + overtricks);
} else { /* Team didn't make team bid */
off += sprintf(buf + off,
"Team %d missed their bid of %d by %d tricks.\n",
team, Spades_misc->team_bid[i], (overtricks * -1));
Spades_misc->team_score[team] -=
(Spades_misc->team_bid[team] * 10);
}
Spades_misc->team_bid[team] = 0;
}
write_all(Spades->players, buf, off);
}
next slide