/* =========================================================================== * * 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