Spades.c

/* ===========================================================================
 * Spades_play
 */
void Spades_play() 
{
    char buf[1024], card_name[4];
    struct dll_element * current;
    struct player *player, *first;
    struct card *card, *init, *high;
    unsigned int i, j, num, round, off;
    int game_end;

    /* Get the names and write them to all the players */
    off = sprintf(buf, "Players are:");
    for (player = get_array_b_element(Spades->players, 0); player;
      player = next_array_b_element(Spades->players)) {
	off += sprintf(buf + off, " %d %s", player->number, player->name);
    }
    off += sprintf(buf + off, ".\n");
    write_all(Spades->players, buf, off);

    for (game_end = round = 0; (!game_end); round++) {
	/* 
         * Figure out who goes first for this round.
         * Shuffle and deal the cards to the players.
         * Write the name of the player that starts the round to everyone.
         */
	first = get_array_b_element(Spades->players, round);
        shuffle_deck(Spades->deck, standard_deck_shuffle_count);
        game_deal_deck_to_players(Spades, SPADES_PLAYER_CARD_COUNT);
        off = sprintf(buf, "Player %d %s starts the bidding.\n", 
          first->number, first->name);

        write_all(Spades->players, buf, off);

        num = first->number;
        for (i = 0; i < Spades->player_count; i++) {
            player = get_array_b_element(Spades->players, num + i);

	    write_player_unplayed_cards(player);
            read_spades_bid(player->fd, &player->game_data);
	    Spades_misc->team_bid[player->number % SPADES_TEAM_COUNT] += player->game_data;
	
            off = sprintf(buf, "Player %d %s bid %d.\n", player->number, 
              player->name, player->game_data);
            write_all(Spades->players, buf, off);
        }

        for (i = 0; i < SPADES_TEAM_COUNT; i++) {
	    if (Spades_misc->team_bid[i] < 4) {
		Spades_misc->team_bid[i] = 4;
	    }
	    if (Spades_misc->team_bid[i] > SPADES_PLAYER_CARD_COUNT) {
		Spades_misc->team_bid[i] = SPADES_PLAYER_CARD_COUNT;
	    }
        }

	/* Write the team bids out to everyone */
        off = sprintf(buf, "Current bids are: Team 0: %d. Team 1: %d\n",
          Spades_misc->team_bid[0], Spades_misc->team_bid[1]);
        write_all(Spades->players, buf, off);

	/* Play a round now. */
        for (j = 0; j < SPADES_PLAYER_CARD_COUNT; j++) {
            /* Write the name of the player that starts the round to everyone */
            off = sprintf(buf, "Player %d %s starts the round.\n", 
              first->number, first->name);

            write_all(Spades->players, buf, off);
    
	    init = high = NULL;
            num = first->number;
            for (i = 0; i < Spades->player_count; i++) {
              player = get_array_b_element(Spades->players, num + i);
try_again:;
                write_player_unplayed_cards(player);
		/* Get a card from the current player. */
for (read_spades_card(player->fd,READ_SPADES_CARD_PLAY,card_name); 
  !find_card_dll_cards(&card, card_name,
    player->unplayed_cards, SPADES_PLAYER_CARD_COUNT);
  write(player->fd, "You don't have that card\n", 26),
  read_spades_card(player->fd, READ_SPADES_CARD_PLAY, card_name));

                if (init) { 
	            /* Must follow suit if possible */
	            if ((card->suit != init->suit) && 
                      find_suit_dll_cards(init->suit, player->unplayed_cards)) {
	                write(player->fd,"You must follow suit\n", 23);
                        insert_card_dll_cards(card, player->unplayed_cards);
	                goto try_again;
	            }
                } else {
	            init = card;
                }

		insert_before_dll_element(Spades_misc->current_cards,NULL,card);

	        /* determine if this player should go first in the next round */
	        if ((NULL == high) || ((high->suit != 3)&&(card->suit == 3)) ||
    	          ((high->suit == card->suit)&&(high->number < card->number))) {
		    first = player;
        	    high = card;
	        } 

	        write_all_current_cards(Spades->players,
                  Spades_misc->current_cards);
            }

	    /*
             * End the round by moving the current_cards to played_cards of the 
             * first player of the next round. (The winner of this round.)
             */
            while ((current = get_first_dll_element(
              Spades_misc->current_cards, (void **)&card))) {
	        delete_dll_element(Spades_misc->current_cards, current);
	        insert_before_dll_element(first->played_cards, NULL, card);
	    }
	    first->played_card_count += SPADES_PLAYER_COUNT;
        }

        Spades_score_round();

        off = sprintf(buf, "Current scores are: Team 0: %d. Team 1: %d\n",
          Spades_misc->team_score[0], Spades_misc->team_score[1]);
        write_all(Spades->players, buf, off);

        game_collect_deck_from_players(Spades);
    }
}
next slide