Spades.c
/* ===========================================================================
*
* Initialize each level of abstraction.
*
* Spades_init
*/
void Spades_init(char * game_name)
{
/* Initialize game */
Spades = alloc_game_full(game_name, SPADES_PLAYER_COUNT);
/* Initialize misc data */
{
unsigned int i;
Spades_misc = (struct Spades_misc *)
malloc(sizeof(struct Spades_misc));
/* Create a place for the current round of cards */
Spades_misc->current_cards = alloc_dll(0);
for (i = 0; i < SPADES_TEAM_COUNT; i++) {
Spades_misc->team_bid[i] = 0;
Spades_misc->team_score[i] = 0;
}
Spades_misc->game_end_score = score;
Spades->misc_data = Spades_misc;
}
/* Player count is already set */
/* Player turn is set when the game starts */
/* Player array is already initialized, each player isn't */
/* Initialize the deck of cards */
{
/* Create a deck of cards for the game */
Spades->deck = alloc_deck(standard_cards_count);
/* Load the specific cards into the deck */
load_deck(Spades->deck, standard_cards, standard_cards_count);
}
/* Initialize all the players now */
{
struct sockaddr_in addr;
int game_fd, addrlen;
unsigned int i;
if (0 > (game_fd = socket(PF_INET, SOCK_STREAM, 0))) {
exit(1);
}
addrlen = 1;
/* Set the sockopt to SO_REUSEPORT */
if (0 > (setsockopt(game_fd, SOL_SOCKET, SO_REUSEADDR,
&addrlen, sizeof(addrlen)))) {
exit(1);
}
// addr.sin_len = INET_ADDRSTRLEN;
addr.sin_family = AF_INET;
addr.sin_port = htons(Spades_port);
addr.sin_addr.s_addr = ntohl(INADDR_ANY);
addrlen = sizeof(struct sockaddr_in);
if (bind(game_fd, (struct sockaddr *)&addr, addrlen)) {
exit(1);
}
if (listen(game_fd, SPADES_PLAYER_COUNT)) {
exit(1);
}
/* Player numbers start at 0 */
for (i = 0; i < Spades->player_count; i++) {
struct player * player;
int fd;
addrlen = sizeof(struct sockaddr_in);
if (0 > (fd = accept(game_fd, (struct sockaddr *)&addr,
(unsigned int *) &addrlen))) {
exit(1);
}
write(fd, Spades->name, GAME_NAME_LEN - 1);
write(fd, "\n", strlen("\n"));
if (NULL == (player = alloc_and_get_player(i, fd))) {
/* Player quit before entering name. */
i--; /* undo inc */
close(fd);
continue;
}
put_array_b_element(Spades->players, i, player);
}
/* Done getting players */
close(game_fd);
}
}
next slide