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