Nantes Université

Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 8b2a2c35 rédigé par Leo LEMAIRE's avatar Leo LEMAIRE
Parcourir les fichiers

lancer de de+jeu

parent cb9b053b
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -47,12 +47,14 @@ int main(int argc, char ** argv){
p[1] = pipes_b[1]; // pipe d'entree du fils suivant
user_t user = user_init(i, NB_CHEVALS, p, i * NB_STEPS);
while(1) user_loop(user);
while(1) user_loop(&user);
break;
}
}
pipes[0] = pipes_b[0];
printf("%d\n", getpid());
receive_data_t master_data = {
.pipes = pipes,
.id = -1,
......@@ -68,13 +70,14 @@ int main(int argc, char ** argv){
.r_data = &master_data,
};
request req = { .t = REQ_ID, .send_id = -1 };
id_request id_req = { .parent = req };
print_board(&master_user, print_board_onResponse);
int current_player = 0;
//for(int i = 0; i < 100; i++)
// send_message(pipes[1], rand()%4, &id_req, sizeof(id_req), M_REQUEST);
request req = { .t = REQ_PLAY, .send_id = -1};
play_request p_req = { .parent = req };
send_message(pipes[1], 0, &p_req, sizeof(p_req), M_REQUEST);
print_board(&master_user, print_board_onResponse);
while(1){
receive_loop(&master_user);
......@@ -102,6 +105,9 @@ void print_board_onResponse(user_t* u){
else
print_board_flag = 1;
break;
default:
fprintf(stderr, "Unexpected response handler called while printing board");
break;
}
}
......@@ -149,7 +155,26 @@ void print_board(user_t* u, m_onResponse cb){
}
void master_onRequest(user_t* u){
printf("master received request\n");
request req;
receive_data_t* data = u->r_data;
memcpy(&req, data->r_buf, sizeof(req));
switch(req.t){
case REQ_DICE:
{
response resp = { .t = RESP_DICE, .id = data->id };
dice_response d_resp = {
.parent = resp,
.nb = rand()%6 + 1,
};
send_message(data->pipes[1], req.send_id, &d_resp, sizeof(d_resp), M_RESPONSE);
printf("Master received dice request from %d\n", req.send_id);
}
break;
default:
fprintf(stderr, "Unimplemented request handler called, dropping it, (not good)");
break;
}
}
int cmp = 0;
......@@ -165,8 +190,23 @@ void master_onResponse(user_t* u){
;
id_response id_res;
memcpy(&id_res, data->r_buf, sizeof(id_response));
cmp++;
printf("Master received response from id request : %d (n°%d)\n", id_res.id, cmp);
break;
case RESP_PLAY:
;
play_response p_res;
memcpy(&p_res, data->r_buf, sizeof(p_res));
printf("Master received response for play order from player %d : %d\n", res.id, p_res.can);
if(!p_res.can){
printf("Resending order to play to %d\n", res.id);
request req = { .t = REQ_PLAY, .send_id = -1};
play_request p_req = { .parent = req };
send_message(u->pipes[1], res.id, &p_req, sizeof(p_req), M_REQUEST);
}
break;
default:
fprintf(stderr, "Unimplemented response callback called, dropping it\n");
break;
}
}
......@@ -21,12 +21,14 @@ user_t user_init(unsigned int id, unsigned int nb_cheval, int pipes[], int start
.cont_type = -1,
.content_off = 0,
.onRequest = user_onRequest,
.onResponse = user_onResponse,
};
user_t out = {
.id = id,
.nb_chevals = nb_cheval,
.pipes = pipes,
.dice = -1,
};
out.c = malloc(sizeof(cheval) * nb_cheval);
......@@ -38,8 +40,8 @@ user_t user_init(unsigned int id, unsigned int nb_cheval, int pipes[], int start
return out;
}
void user_loop(user_t user){
receive_loop(&user);
void user_loop(user_t* user){
receive_loop(user);
}
void receive_loop(user_t* u){
......@@ -79,7 +81,6 @@ void receive_loop(user_t* u){
return;
}
switch(in.t){
case M_REQUEST:
data->onRequest(u);
......@@ -87,7 +88,7 @@ void receive_loop(user_t* u){
case M_CONT:
break;
case M_RESPONSE:
data->onResponse(u);
break;
......@@ -123,7 +124,7 @@ void user_onRequest(user_t* u){
switch(req.t){
case REQ_ID:
{
response resp = { .t = RESP_ID};
response resp = { .t = RESP_ID, .id = data->id };
id_response id_resp = {
.parent = resp,
.id = data->id,
......@@ -137,7 +138,7 @@ void user_onRequest(user_t* u){
case_request c_req;
memcpy(&c_req, data->r_buf, sizeof(c_req));
response resp = { .t = RESP_CASE };
response resp = { .t = RESP_CASE, .id = data->id };
case_response case_resp = {
.parent = resp,
.player_id = u->id,
......@@ -154,5 +155,61 @@ void user_onRequest(user_t* u){
send_message(data->pipes[1], req.send_id, &case_resp, sizeof(case_resp), M_RESPONSE);
}
break;
case REQ_PLAY:
{
play_request p_req;
memcpy(&p_req, data->r_buf, sizeof(p_req));
response resp = { .t = RESP_PLAY, .id = data->id };
play_response p_resp = {
.parent = resp,
.can = 0,
};
printf("%d : pret à jouer (de=%d / %d)\n", u->id, u->dice, &u->dice);
if(u->dice == -1){ // si on as besoin d'un nouveau lancer de de
p_resp.can = 0; // on dis qu'on peut pas jouer
send_message(u->pipes[1], req.send_id, &p_resp, sizeof(p_resp), M_RESPONSE);
request d_req = { .t = REQ_DICE, .send_id = u->id };
dice_request dc_req = { .parent = d_req };
send_message(u->pipes[1], req.send_id, &dc_req, sizeof(dc_req), M_REQUEST);
}
else{
p_resp.can = 1;
send_message(u->pipes[1], req.send_id, &p_resp, sizeof(p_resp), M_RESPONSE);
user_play(u);
}
}
break;
default:
fprintf(stderr, "%d non implemented request handler called (bad), type=%d\n", u->id, req.t);
break;
}
}
void user_onResponse(user_t* u){
receive_data_t* data = u->r_data;
response res;
memcpy(&res, data->r_buf, sizeof(res));
switch (res.t) {
case RESP_DICE:
;
dice_response dice_res;
memcpy(&dice_res, data->r_buf, sizeof(dice_res));
u->dice = dice_res.nb;
printf("%d received response from dice request : %d (from %d) %d\n", u->id, u->dice, res.id, getpid());
break;
default:
fprintf(stderr, "%d : Unimplemented response callback called, dropping it\n", u->id);
break;
}
}
void user_play(user_t* user){
printf("user %d pret à jouer\n", user->id);
//user->dice = -1; // on invalide le lancer de de maintenant qu'on l'a utilise
}
\ No newline at end of file
......@@ -13,6 +13,7 @@ typedef struct {
cheval_t* c;
unsigned char nb_chevals;
int* pipes;
int dice; // valeur de de stockee, -1 pour une valeur invalide (usee)
receive_data_t* r_data;
} user_t;
......@@ -34,6 +35,8 @@ typedef struct {
typedef enum REQ_TYPE {
REQ_ID, // request d'id (sert a rien, juste un test)
REQ_CASE, // request si il y as un pion sur la case
REQ_PLAY, // demande a un joueur de jouer
REQ_DICE, // demande un lancer de de
} REQ_TYPE;
typedef struct {
......@@ -50,10 +53,19 @@ typedef struct {
int case_nb;
} case_request;
typedef enum RESP_TYPE {RESP_ID, RESP_CASE} RESP_TYPE;
typedef struct {
request parent;
} play_request;
typedef struct {
request parent;
} dice_request;
typedef enum RESP_TYPE {RESP_ID, RESP_CASE, RESP_PLAY, RESP_DICE} RESP_TYPE;
typedef struct {
RESP_TYPE t;
int id;
} response;
typedef struct {
......@@ -67,6 +79,16 @@ typedef struct {
int player_id;
} case_response;
typedef struct {
response parent;
int can; // boolean si le joueur a pu joueur (ex si il as besoin d'un lancer de avant de jouer)
} play_response;
typedef struct {
response parent;
unsigned int nb;
} dice_response;
#define R_CHUNK_SIZE 64
typedef void (*m_onRequest)(user_t* buf);
......@@ -84,7 +106,11 @@ struct receive_data {
};
user_t user_init(unsigned int id, unsigned int nb_cheval, int pipes[], int start);
void user_loop(user_t user);
void user_loop(user_t* user);
void receive_loop(user_t* data);
void user_play(user_t* user);
void send_message(int pipe, int dest_id, void* content, int content_size, M_TYPE type);
void user_onRequest(user_t* data);
\ No newline at end of file
void user_onRequest(user_t* data);
void user_onResponse(user_t* data);
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter