/** * @brief 从服务端接收数据 * @param * @return -1无法接收数据 >0 接收到的数据长度 */ int c_net_client_impl::recv_data_from_server() { if(m_recv_buffer_len >= (int)sizeof(m_recv_buffer)) {/**< 检查是否有足够的空间接收继续数据*/ return 0; } int bytes_recved = recv_from_server(m_sock_fd, m_recv_buffer + m_recv_buffer_len, sizeof(m_recv_buffer) - m_recv_buffer_len); if(bytes_recved < 0) { disconnect_from_server(); return -1; } else if(bytes_recved == 0) { //nothing to do } else { m_recv_buffer_len += bytes_recved; } return bytes_recved; }
int play(int ac, char **av) { int s; char buff[512]; int size; int cur_energy = 50; char enemy_energy = 0; int demi_act; int fuite_right = 0; char* direc; char* inspect = "inspect #0x00"; if (ac != 3) { printf("Usage: %s host port\n", av[0]); return (0); } s = connect_to(av[1], atoi(av[2])); // on attend le début de la partie while (1) { if ((size = recv(s, buff, 512, 0)) < 0) die("recv"); if (!strcmp(buff,"go")) break; } while (1) { cur_energy -= 2; demi_act = 2; send_to_server(s, "watch", 5); recv_from_server(s, WATCH); printf("%s %s %s %s\n", vision[0], vision[1], vision[2], vision[3]); // face à de l'énergie if (!strcmp(vision[0], "energy")) { send_to_server(s, "gather", 5); recv_from_server(s, OK); demi_act = 0; } // face à un mur else if (!strcmp(vision[0], "")) { send_to_server(s, "right", 5); recv_from_server(s, OK); send_to_server(s, "right", 5); recv_from_server(s, OK); demi_act = 0; } // face à une case vide else if (!strcmp(vision[0], "empty")) { if (!strcmp(vision[2], "")) { send_to_server(s, "rightfwd", 5); recv_from_server(s, OK); } else if (!strcmp(vision[4], "")) { send_to_server(s, "leftfwd", 5); recv_from_server(s, OK); } else { send_to_server(s, "forward", 5); recv_from_server(s, OK); } } // face à un ennemi else { if (fuite_right) { direc = "right"; fuite_right = 1; } else { direc = "left"; fuite_right = 0; } //inspect inspect[11] = vision[0][3]; inspect[12] = vision[0][4]; send_to_server(s, "forward", 5); enemy_energy = recv_from_server(s, OK); // collision if (enemy_energy > cur_energy) { send_to_server(s, "forward", 5); recv_from_server(s, OK); send_to_server(s, direc, 5); recv_from_server(s, OK); } //fuite else { send_to_server(s, direc, 5); recv_from_server(s, OK); send_to_server(s, "forward", 5); recv_from_server(s, OK); } } // fin du cycle if (demi_act != 0) { send_to_server(s, "next", 5); recv_from_server(s, OK); } } }