void do_moves(dungeon_t *d) { pair_t next; character *c; /* Remove the PC when it is PC turn. Replace on next call. This allows * * use to completely uninit the heap when generating a new level without * * worrying about deleting the PC. */ if (pc_is_alive(d)) { heap_insert(&d->next_turn, d->pc); } while (pc_is_alive(d) && ((c = ((character *) heap_remove_min(&d->next_turn))) != d->pc)) { if (!character_is_alive(c)) { if (d->charmap[character_get_y(c)][character_get_x(c)] == c) { d->charmap[character_get_y(c)][character_get_x(c)] = NULL; } if (c != d->pc) { character_delete(c); } continue; } character_next_turn(c); npc_next_pos(d, c, next); move_character(d, c, next); heap_insert(&d->next_turn, c); } if (pc_is_alive(d) && c == d->pc) { character_next_turn(c); if(d->objmap[character_get_y(c)][character_get_x(c)]){ if(add_to_inventory(d, d->objmap[character_get_y(c)][character_get_x(c)]) == 0){ d->objmap[character_get_y(c)][character_get_x(c)] = NULL; } } } }
int main(){ int s_ecoute, s_dial, cli_len; int option = 1; struct sockaddr_in serv_addr, cli_addr; fd_set readfds; /*buf contient le déplacement (compris entre 0 et 3) * map contient la map (qu'il faudra renvoyer à chaque changement * character contiendra les états des deux personnages, 0 sera le premier arrivé */ int buf[1] = {0}; int map[20][15] = {(0,0)}; int bufMapJoueur[310] ={0}; int i,j,k; int continuer = 1; Character character[2]; for(i=0;i<2;i++){ character[i] = malloc(sizeof(struct character)); } int so_reuseaddr = 1; int actualNumberClient = 0; int nb_client_aff = 0; int descmax = 0; int client[2]; struct timeval compte_rebours; compte_rebours.tv_usec = 0; compte_rebours.tv_sec = 600; /*********/ /*********/ serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(31337); memset(&serv_addr.sin_zero, 0, sizeof(serv_addr.sin_zero)); s_ecoute = socket(PF_INET, SOCK_STREAM, 0); setsockopt(s_ecoute, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr); bind(s_ecoute, (struct sockaddr *)&serv_addr, sizeof serv_addr); while(1) { listen(s_ecoute, 5); actualNumberClient = 0; /*Premiere boucle afin de récupérer le bon nombre de joueur*/ while(actualNumberClient < 2){ FD_ZERO(&readfds); FD_SET(s_ecoute, &readfds); descmax = s_ecoute; for(i=0;i<actualNumberClient;i++){ FD_SET(client[i], &readfds); } if(s_dial > descmax){ descmax = s_dial; } nb_client_aff = select(descmax + 1, &readfds, NULL, NULL, &compte_rebours); /*Lorsque nb_client_aff > 0, un des descripteur surveillé a reçu quelque chose*/ if(nb_client_aff){ if(FD_ISSET(s_ecoute, &readfds)){ cli_len = sizeof cli_addr; s_dial = accept(s_ecoute, (struct sockaddr *)&cli_addr, (socklen_t *)&cli_len); printf("Le client %s s'est connecte\n", inet_ntoa (cli_addr.sin_addr), ntohs(cli_addr.sin_port)); client[actualNumberClient] = s_dial; actualNumberClient++; } } } /*Initialisation de la map et des joueurs * A completer */ initGame(character, map); k = 0; while(k < 300) { for(i=0;i<NB_BLOCS_LARGEUR;i++){ for(j=0;j<NB_BLOCS_HAUTEUR;j++){ bufMapJoueur[k] = map[i][j]; k++; } } } bufMapJoueur[300] = character[0]->life; bufMapJoueur[301] = character[0]->key; bufMapJoueur[302] = character[0]->gold; bufMapJoueur[303] = character[0]->x; bufMapJoueur[304] = character[0]->y; bufMapJoueur[305] = character[1]->life; bufMapJoueur[306] = character[1]->key; bufMapJoueur[307] = character[1]->gold; bufMapJoueur[308] = character[1]->x; bufMapJoueur[309] = character[1]->y; printf("Envoi des données en cours\n"); for(i=0;i<2;i++){ write(client[i],bufMapJoueur,310*sizeof(int)); } printf("Envoi des données fini\n"); /*Tant que l'un des joueurs n'a pas gagné ou perdu...*/ continuer = 1; while(continuer){ printf("Waiting for client action\n"); FD_ZERO(&readfds); FD_SET(s_ecoute, &readfds); descmax = s_ecoute; for(i=0;i<actualNumberClient;i++){ FD_SET(client[i], &readfds); } if(s_dial > descmax){ descmax = s_dial; } nb_client_aff = select(descmax + 1, &readfds, NULL, NULL, &compte_rebours); /*Lorsque nb_client_aff > 0, un des descripteur surveillé a reçu quelque chose*/ if(nb_client_aff){ printf("Received client action, proceding...\n"); /*Lecture des touches */ for(i = 0;i<actualNumberClient;i++){ if(FD_ISSET(client[i], &readfds)){ //printf("Un client est en train de parler\n"); bzero(buf,1); if(read(client[i], buf, 1) == -1){ perror("Erreur lors de la lecture du socket, client déconnecté\n"); } /*Traitement des touches que l'on recoit * i=J1 ou J2 (prendre i+1) */ if(buf[0] == 5) { bufMapJoueur[0] = 30; bufMapJoueur[1] = 35; bufMapJoueur[3] = 0; write(client[i],bufMapJoueur,310*sizeof(int)); bufMapJoueur[0] = 35; bufMapJoueur[1] = 30; bufMapJoueur[3] = 1; if(i == 0) { write(client[1],bufMapJoueur,310*sizeof(int)); } else { write(client[0],bufMapJoueur,310*sizeof(int)); } continuer = 0; } else if(buf[0] == 0 || buf[0] == 1 || buf[0] == 2 || buf[0] == 3 || buf[0] == 18 || buf[0] == 5){ move_character(map, buf[0], character[i]); if(character[i]->life == 0 || character[i]->gold == 10) { bufMapJoueur[0] = 30; bufMapJoueur[1] = 35; bufMapJoueur[3] = 0; write(client[i],bufMapJoueur,310*sizeof(int)); bufMapJoueur[3] = 1; if(i == 0) { write(client[1],bufMapJoueur,310*sizeof(int)); } else { write(client[0],bufMapJoueur,310*sizeof(int)); } continuer = 0; } else { k = 0; while(k < 300) { for(i=0;i<NB_BLOCS_LARGEUR;i++){ for(j=0;j<NB_BLOCS_HAUTEUR;j++){ bufMapJoueur[k] = map[i][j]; k++; } } } bufMapJoueur[300] = character[0]->life; bufMapJoueur[301] = character[0]->key; bufMapJoueur[302] = character[0]->gold; bufMapJoueur[303] = character[0]->x; bufMapJoueur[304] = character[0]->y; bufMapJoueur[305] = character[1]->life; bufMapJoueur[306] = character[1]->key; bufMapJoueur[307] = character[1]->gold; bufMapJoueur[308] = character[1]->x; bufMapJoueur[309] = character[1]->y; } printf("Envoi des données en cours\n"); for(i=0;i<2;i++){ if(write(client[i],bufMapJoueur,310*sizeof(int)) == -1) { bufMapJoueur[0] = 30; bufMapJoueur[1] = 35; bufMapJoueur[3] = 0; printf("L'un des deux joueurs s'est déconnecté, arrêt de la partie.\n"); if(i == 0) { write(client[1],bufMapJoueur,310*sizeof(int)); } else { write(client[0],bufMapJoueur,310*sizeof(int)); } continuer = 0; } } printf("Envoi des données fini\n"); } } } } /*Il faut renvoyer les données de la map, les données des deux joueurs * (life/key/gold/position * aux deux joueurs * Ou renvoyer une indication de fin de jeu si l'un des personnages * a gagné et mettre continuer à 0 */ } close(client[0]); printf("Deconnexion premier client.\n"); close(client[1]); printf("Deconnexion second client.\n"); } close(s_ecoute); printf("Deconnexion du serveur.\n"); return 0; }
uint32_t move_pc(dungeon_t *d, uint32_t dir) { pair_t next; uint32_t was_stairs = 0; next[dim_y] = character_get_y(d->pc); next[dim_x] = character_get_x(d->pc); switch (dir) { case 1: case 2: case 3: next[dim_y]++; break; case 4: case 5: case 6: break; case 7: case 8: case 9: next[dim_y]--; break; } switch (dir) { case 1: case 4: case 7: next[dim_x]--; break; case 2: case 5: case 8: break; case 3: case 6: case 9: next[dim_x]++; break; case '<': if (mappair(character_get_pos(d->pc)) == ter_stairs_up) { was_stairs = 1; new_dungeon_level(d, '<'); } break; case '>': if (mappair(character_get_pos(d->pc)) == ter_stairs_down) { was_stairs = 1; new_dungeon_level(d, '>'); } break; } if (was_stairs) { return 0; } if ((dir != '>') && (dir != '<') && (mappair(next) >= ter_floor)) { move_character(d, d->pc, next); dijkstra(d); dijkstra_tunnel(d); return 0; } return 1; }