You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SQA-Homework/Results/gcov & lcov/output/terminal-stg/server.cpp.gcov.html

2892 lines
424 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - test.info - terminal-stg/server.cpp</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">terminal-stg</a> - server.cpp<span style="font-size: 80%;"> (source / <a href="server.cpp.func-sort-c.html">functions</a>)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">test.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">1410</td>
<td class="headerCovTableEntry">1410</td>
<td class="headerCovTableEntryHi">100.0 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2022-06-07 00:36:57</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">106</td>
<td class="headerCovTableEntry">106</td>
<td class="headerCovTableEntryHi">100.0 %</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td class="headerItem">Branches:</td>
<td class="headerCovTableEntry">619</td>
<td class="headerCovTableEntry">619</td>
<td class="headerCovTableEntryHi">100.0 %</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td><br></td>
</tr>
<tr>
<td>
<pre class="sourceHeading"> Branch data Line data Source code</pre>
<pre class="source">
<a name="1"><span class="lineNum"> 1 </span> : : #include &lt;arpa/inet.h&gt;</a>
<a name="2"><span class="lineNum"> 2 </span> : : #include &lt;netinet/in.h&gt;</a>
<a name="3"><span class="lineNum"> 3 </span> : : #include &lt;pthread.h&gt;</a>
<a name="4"><span class="lineNum"> 4 </span> : : #include &lt;sys/socket.h&gt;</a>
<a name="5"><span class="lineNum"> 5 </span> : : #include &lt;sys/types.h&gt;</a>
<a name="6"><span class="lineNum"> 6 </span> : : #include &lt;sys/time.h&gt;</a>
<a name="7"><span class="lineNum"> 7 </span> : : #include &lt;unistd.h&gt;</a>
<a name="8"><span class="lineNum"> 8 </span> : : </a>
<a name="9"><span class="lineNum"> 9 </span> : : #include &lt;cstdarg&gt;</a>
<a name="10"><span class="lineNum"> 10 </span> : : #include &lt;csignal&gt;</a>
<a name="11"><span class="lineNum"> 11 </span> : : #include &lt;cstring&gt;</a>
<a name="12"><span class="lineNum"> 12 </span> : : #include &lt;cctype&gt;</a>
<a name="13"><span class="lineNum"> 13 </span> : : #include &lt;ctime&gt;</a>
<a name="14"><span class="lineNum"> 14 </span> : : #include &lt;cmath&gt;</a>
<a name="15"><span class="lineNum"> 15 </span> : : </a>
<a name="16"><span class="lineNum"> 16 </span> : : #include &lt;vector&gt;</a>
<a name="17"><span class="lineNum"> 17 </span> : : #include &lt;list&gt;</a>
<a name="18"><span class="lineNum"> 18 </span> : : #include &lt;set&gt;</a>
<a name="19"><span class="lineNum"> 19 </span> : : </a>
<a name="20"><span class="lineNum"> 20 </span> : : #include &quot;constants.h&quot;</a>
<a name="21"><span class="lineNum"> 21 </span> : : #include &quot;server.h&quot;</a>
<a name="22"><span class="lineNum"> 22 </span> : : #include &quot;common.h&quot;</a>
<a name="23"><span class="lineNum"> 23 </span> : : #include &quot;func.h&quot;</a>
<a name="24"><span class="lineNum"> 24 </span> : : </a>
<a name="25"><span class="lineNum"> 25 </span> : : #include &lt;iostream&gt;</a>
<a name="26"><span class="lineNum"> 26 </span> : : #include &lt;cstdlib&gt;</a>
<a name="27"><span class="lineNum"> 27 </span> : : #include &lt;iomanip&gt;</a>
<a name="28"><span class="lineNum"> 28 </span> : : #include &lt;queue&gt;</a>
<a name="29"><span class="lineNum"> 29 </span> : : </a>
<a name="30"><span class="lineNum"> 30 </span> : : //#define REGISTERED_USER_LIST_SIZE 100</a>
<a name="31"><span class="lineNum"> 31 </span> : : #define REGISTERED_USER_LIST_SIZE 10</a>
<a name="32"><span class="lineNum"> 32 </span> : : </a>
<a name="33"><span class="lineNum"> 33 </span> : : #define REGISTERED_USER_FILE &quot;userlists.log&quot;</a>
<a name="34"><span class="lineNum"> 34 </span> : : </a>
<a name="35"><span class="lineNum"> 35 </span> : : using std::multiset;</a>
<a name="36"><span class="lineNum"> 36 </span> : : using std::vector;</a>
<a name="37"><span class="lineNum"> 37 </span> : : </a>
<a name="38"><span class="lineNum"> 38 </span> : : pthread_mutex_t userlist_lock = PTHREAD_MUTEX_INITIALIZER;</a>
<a name="39"><span class="lineNum"> 39 </span> : : pthread_mutex_t sessions_lock = PTHREAD_MUTEX_INITIALIZER;</a>
<a name="40"><span class="lineNum"> 40 </span> : : pthread_mutex_t battles_lock = PTHREAD_MUTEX_INITIALIZER;</a>
<a name="41"><span class="lineNum"> 41 </span> : : pthread_mutex_t default_lock = PTHREAD_MUTEX_INITIALIZER;</a>
<a name="42"><span class="lineNum"> 42 </span> : : pthread_mutex_t items_lock[USER_CNT];</a>
<a name="43"><span class="lineNum"> 43 </span> : : </a>
<a name="44"><span class="lineNum"> 44 </span> : : int server_fd = 0, port = 50000, port_range = 100;</a>
<a name="45"><span class="lineNum"> 45 </span> : : </a>
<a name="46"><span class="lineNum"> 46 </span> : : </a>
<a name="47"><span class="lineNum"> 47 </span> : : </a>
<a name="48"><span class="lineNum"> 48 </span> : : void check_user_status(int uid);</a>
<a name="49"><span class="lineNum"> 49 </span> : : void wrap_recv(int conn, client_message_t* pcm);</a>
<a name="50"><span class="lineNum"> 50 </span> : : void wrap_send(int conn, server_message_t* psm);</a>
<a name="51"><span class="lineNum"> 51 </span> : : void send_to_client(int uid, int message);</a>
<a name="52"><span class="lineNum"> 52 </span> : : void send_to_client(int uid, int message, char* str);</a>
<a name="53"><span class="lineNum"> 53 </span> : : void say_to_client(int uid, char* message);</a>
<a name="54"><span class="lineNum"> 54 </span> : : void send_to_client_with_username(int uid, int message, char* user_name);</a>
<a name="55"><span class="lineNum"> 55 </span> : : void close_session(int conn, int message);</a>
<a name="56"><span class="lineNum"> 56 </span> : : void terminate_process(int recved_signal);</a>
<a name="57"><span class="lineNum"> 57 </span> : : void load_user_list();</a>
<a name="58"><span class="lineNum"> 58 </span> : : void save_user_list();</a>
<a name="59"><span class="lineNum"> 59 </span> : : void save_user(int i);</a>
<a name="60"><span class="lineNum"> 60 </span> : : int query_session_built(uint32_t uid);</a>
<a name="61"><span class="lineNum"> 61 </span> : : void inform_all_user_battle_player(int bid);</a>
<a name="62"><span class="lineNum"> 62 </span> : : void user_quit_battle(uint32_t bid, uint32_t uid);</a>
<a name="63"><span class="lineNum"> 63 </span> : : void user_join_battle_common_part(uint32_t bid, uint32_t uid, uint32_t joined_state);</a>
<a name="64"><span class="lineNum"> 64 </span> : : void user_join_battle(uint32_t bid, uint32_t uid);</a>
<a name="65"><span class="lineNum"> 65 </span> : : void user_invited_to_join_battle(uint32_t bid, uint32_t uid);</a>
<a name="66"><span class="lineNum"> 66 </span> : : int find_uid_by_user_name(const char* user_name);</a>
<a name="67"><span class="lineNum"> 67 </span> : : int get_unalloced_battle();</a>
<a name="68"><span class="lineNum"> 68 </span> : : int get_unused_session();</a>
<a name="69"><span class="lineNum"> 69 </span> : : void inform_friends(int uid, int message);</a>
<a name="70"><span class="lineNum"> 70 </span> : : //void forced_generate_items(int bid, int x, int y, int kind, int count, int uid = -1);</a>
<a name="71"><span class="lineNum"> 71 </span> : : void random_generate_items(int bid);</a>
<a name="72"><span class="lineNum"> 72 </span> : : void move_bullets(int bid);</a>
<a name="73"><span class="lineNum"> 73 </span> : : void check_user_status(int uid);</a>
<a name="74"><span class="lineNum"> 74 </span> : : void check_all_user_status(int bid);</a>
<a name="75"><span class="lineNum"> 75 </span> : : void check_who_is_dead(int bid);</a>
<a name="76"><span class="lineNum"> 76 </span> : : void clear_items(int bid);</a>
<a name="77"><span class="lineNum"> 77 </span> : : void render_map_for_user(int uid, server_message_t* psm);</a>
<a name="78"><span class="lineNum"> 78 </span> : : void inform_all_user_battle_state(int bid);</a>
<a name="79"><span class="lineNum"> 79 </span> : : void* battle_ruler(void* args);</a>
<a name="80"><span class="lineNum"> 80 </span> : : int check_user_registered(char* user_name, char* password);</a>
<a name="81"><span class="lineNum"> 81 </span> : : void launch_battle(int bid);</a>
<a name="82"><span class="lineNum"> 82 </span> : : int admin_set_admin(int argc, char** argv);</a>
<a name="83"><span class="lineNum"> 83 </span> : : int admin_set_energy(int argc, char** argv);</a>
<a name="84"><span class="lineNum"> 84 </span> : : int admin_set_hp(int argc, char** argv);</a>
<a name="85"><span class="lineNum"> 85 </span> : : int admin_set_pos(int argc, char** argv);</a>
<a name="86"><span class="lineNum"> 86 </span> : : int admin_ban_user(int argc, char** argv);</a>
<a name="87"><span class="lineNum"> 87 </span> : : int client_command_admin_control(int uid);</a>
<a name="88"><span class="lineNum"> 88 </span> : : int client_message_fatal(int uid);</a>
<a name="89"><span class="lineNum"> 89 </span> : : void init_handler();</a>
<a name="90"><span class="lineNum"> 90 </span> : : void* session_start(void* args);</a>
<a name="91"><span class="lineNum"> 91 </span> : : void* run_battle(void* args);</a>
<a name="92"><span class="lineNum"> 92 </span> : : int server_start();</a>
<a name="93"><span class="lineNum"> 93 </span> : : void terminate_process(int signum);</a>
<a name="94"><span class="lineNum"> 94 </span> : : void terminate_entrance(int signum);</a>
<a name="95"><span class="lineNum"> 95 </span> : : </a>
<a name="96"><span class="lineNum"> 96 </span> : : void list_all_users(server_message_t* psm);</a>
<a name="97"><span class="lineNum"> 97 </span> : : int invite_friend_to_battle(int bid, int uid, char* friend_name);</a>
<a name="98"><span class="lineNum"> 98 </span> : : </a>
<a name="99"><span class="lineNum"> 99 </span> : : </a>
<a name="100"><span class="lineNum"> 100 </span> : : int client_command_user_login(int uid);</a>
<a name="101"><span class="lineNum"> 101 </span> : : int client_command_user_register(int uid);</a>
<a name="102"><span class="lineNum"> 102 </span> : : </a>
<a name="103"><span class="lineNum"> 103 </span> : : </a>
<a name="104"><span class="lineNum"> 104 </span> : : </a>
<a name="105"><span class="lineNum"> 105 </span> : : </a>
<a name="106"><span class="lineNum"> 106 </span> : : int client_command_launch_battle(int uid);</a>
<a name="107"><span class="lineNum"> 107 </span> : : int client_command_quit_battle(int uid);</a>
<a name="108"><span class="lineNum"> 108 </span> : : int client_command_invite_user(int uid);</a>
<a name="109"><span class="lineNum"> 109 </span> : : int client_command_send_message(int uid);</a>
<a name="110"><span class="lineNum"> 110 </span> : : int client_command_create_ffa(int uid);</a>
<a name="111"><span class="lineNum"> 111 </span> : : int client_command_launch_ffa(int uid);</a>
<a name="112"><span class="lineNum"> 112 </span> : : int client_command_accept_battle(int uid);</a>
<a name="113"><span class="lineNum"> 113 </span> : : int client_command_reject_battle(int uid);</a>
<a name="114"><span class="lineNum"> 114 </span> : : int client_command_quit(int uid);</a>
<a name="115"><span class="lineNum"> 115 </span> : : int client_command_move_up(int uid);</a>
<a name="116"><span class="lineNum"> 116 </span> : : int client_command_move_down(int uid);</a>
<a name="117"><span class="lineNum"> 117 </span> : : int client_command_move_left(int uid);</a>
<a name="118"><span class="lineNum"> 118 </span> : : int client_command_move_right(int uid);</a>
<a name="119"><span class="lineNum"> 119 </span> : : int client_command_put_landmine(int uid);</a>
<a name="120"><span class="lineNum"> 120 </span> : : int client_command_fire(int uid, int delta_x, int delta_y, int dir);</a>
<a name="121"><span class="lineNum"> 121 </span> : : int client_command_fire_up(int uid);</a>
<a name="122"><span class="lineNum"> 122 </span> : : int client_command_fire_down(int uid);</a>
<a name="123"><span class="lineNum"> 123 </span> : : int client_command_fire_left(int uid);</a>
<a name="124"><span class="lineNum"> 124 </span> : : int client_command_fire_right(int uid);</a>
<a name="125"><span class="lineNum"> 125 </span> : : int client_command_fire_up_left(int uid);</a>
<a name="126"><span class="lineNum"> 126 </span> : : int client_command_fire_up_right(int uid);</a>
<a name="127"><span class="lineNum"> 127 </span> : : int client_command_fire_down_left(int uid);</a>
<a name="128"><span class="lineNum"> 128 </span> : : int client_command_fire_down_right(int uid);</a>
<a name="129"><span class="lineNum"> 129 </span> : : int client_command_fire_aoe(int uid, int dir);</a>
<a name="130"><span class="lineNum"> 130 </span> : : int client_command_fire_aoe_up(int uid);</a>
<a name="131"><span class="lineNum"> 131 </span> : : int client_command_fire_aoe_down(int uid);</a>
<a name="132"><span class="lineNum"> 132 </span> : : int client_command_fire_aoe_left(int uid);</a>
<a name="133"><span class="lineNum"> 133 </span> : : int client_command_fire_aoe_right(int uid);</a>
<a name="134"><span class="lineNum"> 134 </span> : : int client_command_melee(int uid);</a>
<a name="135"><span class="lineNum"> 135 </span> : : </a>
<a name="136"><span class="lineNum"> 136 </span> : : </a>
<a name="137"><span class="lineNum"> 137 </span> : : int client_command_user_logout(int uid);</a>
<a name="138"><span class="lineNum"> 138 </span> : : int client_command_fetch_all_users(int uid);</a>
<a name="139"><span class="lineNum"> 139 </span> : : int client_command_fetch_all_friends(int uid);</a>
<a name="140"><span class="lineNum"> 140 </span> : : </a>
<a name="141"><span class="lineNum"> 141 </span> : : static int user_list_size = 0;</a>
<a name="142"><span class="lineNum"> 142 </span> : : //static uint64_t sum_delay_time = 0, prev_time;</a>
<a name="143"><span class="lineNum"> 143 </span> : : </a>
<a name="144"><span class="lineNum"> 144 </span> : : struct {</a>
<a name="145"><span class="lineNum"> 145 </span> : : char user_name[USERNAME_SIZE];</a>
<a name="146"><span class="lineNum"> 146 </span> : : char password[PASSWORD_SIZE];</a>
<a name="147"><span class="lineNum"> 147 </span> : : } registered_user_list[REGISTERED_USER_LIST_SIZE];</a>
<a name="148"><span class="lineNum"> 148 </span> : : </a>
<a name="149"><span class="lineNum"> 149 </span> : : struct session_t {</a>
<a name="150"><span class="lineNum"> 150 </span> : : char user_name[USERNAME_SIZE];</a>
<a name="151"><span class="lineNum"> 151 </span> : : char ip_addr[IPADDR_SIZE];</a>
<a name="152"><span class="lineNum"> 152 </span> : : int conn;</a>
<a name="153"><span class="lineNum"> 153 </span> : : int state;</a>
<a name="154"><span class="lineNum"> 154 </span> : : int is_admin;</a>
<a name="155"><span class="lineNum"> 155 </span> : : int score;</a>
<a name="156"><span class="lineNum"> 156 </span> : : int kill;</a>
<a name="157"><span class="lineNum"> 157 </span> : : int death;</a>
<a name="158"><span class="lineNum"> 158 </span> : : uint32_t bid;</a>
<a name="159"><span class="lineNum"> 159 </span> : : uint32_t inviter_id;</a>
<a name="160"><span class="lineNum"> 160 </span> : : client_message_t cm;</a>
<a name="161"><span class="lineNum"> 161 </span> : : } sessions[USER_CNT];</a>
<a name="162"><span class="lineNum"> 162 </span> : : </a>
<a name="163"><span class="lineNum"> 163 </span> : : struct session_args_t {</a>
<a name="164"><span class="lineNum"> 164 </span> : : int conn;</a>
<a name="165"><span class="lineNum"> 165 </span> : : char ip_addr[IPADDR_SIZE];</a>
<a name="166"><span class="lineNum"> 166 </span> : : };</a>
<a name="167"><span class="lineNum"> 167 </span> : : </a>
<a name="168"><span class="lineNum"> 168 </span> : : typedef struct session_args_t session_args_t;</a>
<a name="169"><span class="lineNum"> 169 </span> : : </a>
<a name="170"><span class="lineNum"> 170 </span> : : class item_t { public:</a>
<a name="171"><span class="lineNum"> 171 </span> : : int id;</a>
<a name="172"><span class="lineNum"> 172 </span> : : int dir;</a>
<a name="173"><span class="lineNum"> 173 </span> : : int owner;</a>
<a name="174"><span class="lineNum"> 174 </span> : : uint64_t time;</a>
<a name="175"><span class="lineNum"> 175 </span> : : int count;</a>
<a name="176"><span class="lineNum"> 176 </span> : : int kind;</a>
<a name="177"><span class="lineNum"> 177 </span> : : pos_t pos;</a>
<a name="178"><span class="lineNum"> 178 </span> :<span class="lineCov"> 73 : item_t(const item_t &amp;it) : id(it.id),</span></a>
<a name="179"><span class="lineNum"> 179 </span> :<span class="lineCov"> 73 : dir(it.dir),</span></a>
<a name="180"><span class="lineNum"> 180 </span> :<span class="lineCov"> 73 : owner(it.owner),</span></a>
<a name="181"><span class="lineNum"> 181 </span> :<span class="lineCov"> 73 : time(it.time),</span></a>
<a name="182"><span class="lineNum"> 182 </span> :<span class="lineCov"> 73 : count(it.count),</span></a>
<a name="183"><span class="lineNum"> 183 </span> :<span class="lineCov"> 73 : kind(it.kind),</span></a>
<a name="184"><span class="lineNum"> 184 </span> :<span class="lineCov"> 73 : pos(it.pos)</span></a>
<a name="185"><span class="lineNum"> 185 </span> :<span class="lineCov"> 73 : {}</span></a>
<a name="186"><span class="lineNum"> 186 </span> :<span class="lineCov"> 109 : item_t() {</span></a>
<a name="187"><span class="lineNum"> 187 </span> :<span class="lineCov"> 109 : id = 0;</span></a>
<a name="188"><span class="lineNum"> 188 </span> :<span class="lineCov"> 109 : dir = owner = time = count = kind = 0;</span></a>
<a name="189"><span class="lineNum"> 189 </span> :<span class="lineCov"> 109 : pos.x = pos.y = 0;</span></a>
<a name="190"><span class="lineNum"> 190 </span> :<span class="lineCov"> 109 : }</span></a>
<a name="191"><span class="lineNum"> 191 </span> : : friend const bool operator &lt; (const item_t it1, const item_t it2) {</a>
<a name="192"><span class="lineNum"> 192 </span> : : return it1.time &lt; it2.time;</a>
<a name="193"><span class="lineNum"> 193 </span> : : }</a>
<a name="194"><span class="lineNum"> 194 </span> : : };</a>
<a name="195"><span class="lineNum"> 195 </span> : : </a>
<a name="196"><span class="lineNum"> 196 </span> : : class battle_t { public:</a>
<a name="197"><span class="lineNum"> 197 </span> : : int is_alloced;</a>
<a name="198"><span class="lineNum"> 198 </span> : : size_t alive_users;</a>
<a name="199"><span class="lineNum"> 199 </span> : : size_t all_users;</a>
<a name="200"><span class="lineNum"> 200 </span> : : class user_t { public:</a>
<a name="201"><span class="lineNum"> 201 </span> : : int battle_state;</a>
<a name="202"><span class="lineNum"> 202 </span> : : int energy;</a>
<a name="203"><span class="lineNum"> 203 </span> : : int dir;</a>
<a name="204"><span class="lineNum"> 204 </span> : : int life;</a>
<a name="205"><span class="lineNum"> 205 </span> : : int killby;</a>
<a name="206"><span class="lineNum"> 206 </span> : : pos_t pos;</a>
<a name="207"><span class="lineNum"> 207 </span> : : pos_t last_pos;</a>
<a name="208"><span class="lineNum"> 208 </span> : : } users[USER_CNT];</a>
<a name="209"><span class="lineNum"> 209 </span> : : </a>
<a name="210"><span class="lineNum"> 210 </span> : : int num_of_other; // number of other alloced item except for bullet</a>
<a name="211"><span class="lineNum"> 211 </span> : : int item_count;</a>
<a name="212"><span class="lineNum"> 212 </span> : : uint64_t global_time;</a>
<a name="213"><span class="lineNum"> 213 </span> : : </a>
<a name="214"><span class="lineNum"> 214 </span> : : std::list&lt;item_t&gt; items;</a>
<a name="215"><span class="lineNum"> 215 </span> : : </a>
<a name="216"><span class="lineNum"> 216 </span> :<span class="lineCov"> 19 : void reset() {</span></a>
<a name="217"><span class="lineNum"> 217 </span> :<span class="lineCov"> 19 : is_alloced = all_users = alive_users = num_of_other = item_count = 0;</span></a>
<a name="218"><span class="lineNum"> 218 </span> :<span class="lineCov"> 19 : global_time = 0;</span></a>
<a name="219"><span class="lineNum"> 219 </span> :<span class="lineCov"> 19 : items.clear();</span></a>
<a name="220"><span class="lineNum"> 220 </span> :<span class="lineCov"> 19 : }</span></a>
<a name="221"><span class="lineNum"> 221 </span> :<span class="lineCov"> 14 : battle_t() {</span></a>
<a name="222"><span class="lineNum"> 222 </span> :<span class="lineCov"> 14 : reset();</span></a>
<a name="223"><span class="lineNum"> 223 </span> :<span class="lineCov"> 14 : }</span></a>
<a name="224"><span class="lineNum"> 224 </span> : : </a>
<a name="225"><span class="lineNum"> 225 </span> : : } battles[USER_CNT];</a>
<a name="226"><span class="lineNum"> 226 </span> : : </a>
<a name="227"><span class="lineNum"> 227 </span> :<span class="lineCov"> 6 : void load_user_list() {</span></a>
<a name="228"><span class="lineNum"> 228 </span> : : </a>
<a name="229"><span class="lineNum"> 229 </span> :<span class="lineCov"> 6 : FILE* userlist = fopen(REGISTERED_USER_FILE, &quot;r&quot;);</span></a>
<a name="230"><span class="lineNum"> 230 </span> : : </a>
<a name="231"><span class="lineNum"> 231 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 5 times"> + </span>]:<span class="lineCov"> 6 : if (userlist == NULL) {</span></a>
<a name="232"><span class="lineNum"> 232 </span> :<span class="lineCov"> 1 : log(&quot;can not find &quot; REGISTERED_USER_FILE &quot;&quot;);</span></a>
<a name="233"><span class="lineNum"> 233 </span> :<span class="lineCov"> 1 : return;</span></a>
<a name="234"><span class="lineNum"> 234 </span> : : }</a>
<a name="235"><span class="lineNum"> 235 </span> : : </a>
<a name="236"><span class="lineNum"> 236 </span> : : #define LOAD_FAIL \</a>
<a name="237"><span class="lineNum"> 237 </span> : : log(&quot;failed to load users, try to delete &quot; REGISTERED_USER_FILE &quot;.&quot;), \</a>
<a name="238"><span class="lineNum"> 238 </span> : : user_list_size = 0, memset(registered_user_list, 0, sizeof(registered_user_list)), \</a>
<a name="239"><span class="lineNum"> 239 </span> : : fclose(userlist);</a>
<a name="240"><span class="lineNum"> 240 </span> [<span class="branchCov" title="Branch 0 was taken 29 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 30 : for (int i = 0; i &lt; REGISTERED_USER_LIST_SIZE; i++) {</span></a>
<a name="241"><span class="lineNum"> 241 </span> :<span class="lineCov"> 29 : cout&lt;&lt;&quot;asdad:&quot;&lt;&lt;i&lt;&lt;endl;</span></a>
<a name="242"><span class="lineNum"> 242 </span> [<span class="branchCov" title="Branch 0 was taken 27 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 29 : if (fgets(registered_user_list[i].user_name, USERNAME_SIZE, userlist) != NULL) {</span></a>
<a name="243"><span class="lineNum"> 243 </span> :<span class="lineCov"> 27 : registered_user_list[i].user_name[strlen(registered_user_list[i].user_name) - 1] = 0;</span></a>
<a name="244"><span class="lineNum"> 244 </span> [<span class="branchCov" title="Branch 0 was taken 95 times"> + </span><span class="branchCov" title="Branch 1 was taken 26 times"> + </span>]:<span class="lineCov"> 121 : for (int j = 0; j &lt; i; j++) {</span></a>
<a name="245"><span class="lineNum"> 245 </span> [<span class="branchCov" title="Branch 0 was taken 94 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 95 : if (strncmp(registered_user_list[i].user_name, registered_user_list[j].user_name, USERNAME_SIZE - 1) != 0)</span></a>
<a name="246"><span class="lineNum"> 246 </span> :<span class="lineCov"> 94 : continue;</span></a>
<a name="247"><span class="lineNum"> 247 </span> :<span class="lineCov"> 1 : LOAD_FAIL;</span></a>
<a name="248"><span class="lineNum"> 248 </span> :<span class="lineCov"> 1 : return;</span></a>
<a name="249"><span class="lineNum"> 249 </span> : : }</a>
<a name="250"><span class="lineNum"> 250 </span> :<span class="lineCov"> 26 : user_list_size++;</span></a>
<a name="251"><span class="lineNum"> 251 </span> : : } else {</a>
<a name="252"><span class="lineNum"> 252 </span> :<span class="lineCov"> 2 : break;</span></a>
<a name="253"><span class="lineNum"> 253 </span> : : }</a>
<a name="254"><span class="lineNum"> 254 </span> : : </a>
<a name="255"><span class="lineNum"> 255 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 25 times"> + </span>]:<span class="lineCov"> 26 : if (fgets(registered_user_list[i].password, PASSWORD_SIZE, userlist) == NULL) {</span></a>
<a name="256"><span class="lineNum"> 256 </span> :<span class="lineCov"> 1 : LOAD_FAIL;</span></a>
<a name="257"><span class="lineNum"> 257 </span> :<span class="lineCov"> 1 : return;</span></a>
<a name="258"><span class="lineNum"> 258 </span> : : }</a>
<a name="259"><span class="lineNum"> 259 </span> : : </a>
<a name="260"><span class="lineNum"> 260 </span> :<span class="lineCov"> 25 : registered_user_list[i].password[strlen(registered_user_list[i].password) - 1] = 0;</span></a>
<a name="261"><span class="lineNum"> 261 </span> : : }</a>
<a name="262"><span class="lineNum"> 262 </span> : : #undef LOAD_FAIL</a>
<a name="263"><span class="lineNum"> 263 </span> : : //for (int i = 0; i &lt; user_list_size; i++) {</a>
<a name="264"><span class="lineNum"> 264 </span> : : // log(&quot;loaded user %s&quot;, registered_user_list[i].user_name);</a>
<a name="265"><span class="lineNum"> 265 </span> : : //}</a>
<a name="266"><span class="lineNum"> 266 </span> :<span class="lineCov"> 3 : log(&quot;loaded %d user(s) from &quot; REGISTERED_USER_FILE &quot;.&quot;, user_list_size);</span></a>
<a name="267"><span class="lineNum"> 267 </span> :<span class="lineCov"> 3 : fclose(userlist);</span></a>
<a name="268"><span class="lineNum"> 268 </span> : : }</a>
<a name="269"><span class="lineNum"> 269 </span> :<span class="lineCov"> 1 : void save_user_list() {</span></a>
<a name="270"><span class="lineNum"> 270 </span> :<span class="lineCov"> 1 : FILE* userlist = fopen(REGISTERED_USER_FILE, &quot;w&quot;);</span></a>
<a name="271"><span class="lineNum"> 271 </span> [<span class="branchCov" title="Branch 0 was taken 4 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 5 : for (int i = 0; i &lt; user_list_size; i++) {</span></a>
<a name="272"><span class="lineNum"> 272 </span> :<span class="lineCov"> 4 : fprintf(userlist, &quot;%s\n&quot;, registered_user_list[i].user_name);</span></a>
<a name="273"><span class="lineNum"> 273 </span> :<span class="lineCov"> 4 : fprintf(userlist, &quot;%s\n&quot;, registered_user_list[i].password);</span></a>
<a name="274"><span class="lineNum"> 274 </span> : : }</a>
<a name="275"><span class="lineNum"> 275 </span> :<span class="lineCov"> 1 : log(&quot;saved %d users to &quot; REGISTERED_USER_FILE &quot;.&quot;, user_list_size);</span></a>
<a name="276"><span class="lineNum"> 276 </span> :<span class="lineCov"> 1 : fclose(userlist);</span></a>
<a name="277"><span class="lineNum"> 277 </span> :<span class="lineCov"> 1 : }</span></a>
<a name="278"><span class="lineNum"> 278 </span> : : </a>
<a name="279"><span class="lineNum"> 279 </span> :<span class="lineCov"> 2 : void save_user(int i) {</span></a>
<a name="280"><span class="lineNum"> 280 </span> :<span class="lineCov"> 2 : FILE* userlist = fopen(REGISTERED_USER_FILE, &quot;a&quot;);</span></a>
<a name="281"><span class="lineNum"> 281 </span> :<span class="lineCov"> 2 : fprintf(userlist, &quot;%s\n&quot;, registered_user_list[i].user_name);</span></a>
<a name="282"><span class="lineNum"> 282 </span> :<span class="lineCov"> 2 : fprintf(userlist, &quot;%s\n&quot;, registered_user_list[i].password);</span></a>
<a name="283"><span class="lineNum"> 283 </span> :<span class="lineCov"> 2 : log(&quot;saved users %s to &quot; REGISTERED_USER_FILE &quot;.&quot;, registered_user_list[i].user_name);</span></a>
<a name="284"><span class="lineNum"> 284 </span> :<span class="lineCov"> 2 : fclose(userlist);</span></a>
<a name="285"><span class="lineNum"> 285 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="286"><span class="lineNum"> 286 </span> : : </a>
<a name="287"><span class="lineNum"> 287 </span> :<span class="lineCov"> 5 : int client_command_user_register(int uid) {</span></a>
<a name="288"><span class="lineNum"> 288 </span> :<span class="lineCov"> 5 : int ul_index = -1;</span></a>
<a name="289"><span class="lineNum"> 289 </span> :<span class="lineCov"> 5 : char* user_name = sessions[uid].cm.user_name;</span></a>
<a name="290"><span class="lineNum"> 290 </span> :<span class="lineCov"> 5 : char* password = sessions[uid].cm.password;</span></a>
<a name="291"><span class="lineNum"> 291 </span> :<span class="lineCov"> 5 : log(&quot;user %s tries to register with password %s&quot;, user_name, password);</span></a>
<a name="292"><span class="lineNum"> 292 </span> : : </a>
<a name="293"><span class="lineNum"> 293 </span> [<span class="branchCov" title="Branch 0 was taken 38 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 41 : for (int i = 0; i &lt; REGISTERED_USER_LIST_SIZE; i++) {</span></a>
<a name="294"><span class="lineNum"> 294 </span> [<span class="branchCov" title="Branch 0 was taken 36 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 38 : if (strncmp(user_name, registered_user_list[i].user_name, USERNAME_SIZE - 1) != 0)</span></a>
<a name="295"><span class="lineNum"> 295 </span> :<span class="lineCov"> 36 : continue;</span></a>
<a name="296"><span class="lineNum"> 296 </span> : : </a>
<a name="297"><span class="lineNum"> 297 </span> :<span class="lineCov"> 2 : log(&quot;user %s&amp;%s has been registered&quot;, user_name, password);</span></a>
<a name="298"><span class="lineNum"> 298 </span> :<span class="lineCov"> 2 : send_to_client(uid, SERVER_RESPONSE_YOU_HAVE_REGISTERED);</span></a>
<a name="299"><span class="lineNum"> 299 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="300"><span class="lineNum"> 300 </span> : : }</a>
<a name="301"><span class="lineNum"> 301 </span> : : </a>
<a name="302"><span class="lineNum"> 302 </span> :<span class="lineCov"> 3 : pthread_mutex_lock(&amp;userlist_lock);</span></a>
<a name="303"><span class="lineNum"> 303 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : if (user_list_size &lt; REGISTERED_USER_LIST_SIZE)</span></a>
<a name="304"><span class="lineNum"> 304 </span> :<span class="lineCov"> 1 : ul_index = user_list_size++;</span></a>
<a name="305"><span class="lineNum"> 305 </span> :<span class="lineCov"> 3 : pthread_mutex_unlock(&amp;userlist_lock);</span></a>
<a name="306"><span class="lineNum"> 306 </span> : : </a>
<a name="307"><span class="lineNum"> 307 </span> :<span class="lineCov"> 3 : log(&quot;fetch empty user list index #%d&quot;, ul_index);</span></a>
<a name="308"><span class="lineNum"> 308 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (ul_index == -1) {</span></a>
<a name="309"><span class="lineNum"> 309 </span> :<span class="lineCov"> 2 : log(&quot;user %s registers fail&quot;, user_name);</span></a>
<a name="310"><span class="lineNum"> 310 </span> :<span class="lineCov"> 2 : send_to_client(uid, SERVER_RESPONSE_REGISTER_FAIL);</span></a>
<a name="311"><span class="lineNum"> 311 </span> : : } else {</a>
<a name="312"><span class="lineNum"> 312 </span> :<span class="lineCov"> 1 : log(&quot;user %s registers success&quot;, user_name);</span></a>
<a name="313"><span class="lineNum"> 313 </span> :<span class="lineCov"> 1 : strncpy(registered_user_list[ul_index].user_name,</span></a>
<a name="314"><span class="lineNum"> 314 </span> : : user_name, USERNAME_SIZE - 1);</a>
<a name="315"><span class="lineNum"> 315 </span> :<span class="lineCov"> 1 : strncpy(registered_user_list[ul_index].password,</span></a>
<a name="316"><span class="lineNum"> 316 </span> : : password, PASSWORD_SIZE - 1);</a>
<a name="317"><span class="lineNum"> 317 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_REGISTER_SUCCESS);</span></a>
<a name="318"><span class="lineNum"> 318 </span> :<span class="lineCov"> 1 : save_user(ul_index);</span></a>
<a name="319"><span class="lineNum"> 319 </span> : : }</a>
<a name="320"><span class="lineNum"> 320 </span> :<span class="lineCov"> 3 : return 0;</span></a>
<a name="321"><span class="lineNum"> 321 </span> : : }</a>
<a name="322"><span class="lineNum"> 322 </span> : : </a>
<a name="323"><span class="lineNum"> 323 </span> :<span class="lineCov"> 9 : int client_command_user_login(int uid) {</span></a>
<a name="324"><span class="lineNum"> 324 </span> :<span class="lineCov"> 9 : int is_dup = 0;</span></a>
<a name="325"><span class="lineNum"> 325 </span> :<span class="lineCov"> 9 : client_message_t* pcm = &amp;sessions[uid].cm;</span></a>
<a name="326"><span class="lineNum"> 326 </span> :<span class="lineCov"> 9 : char* user_name = pcm-&gt;user_name;</span></a>
<a name="327"><span class="lineNum"> 327 </span> :<span class="lineCov"> 9 : char* password = pcm-&gt;password;</span></a>
<a name="328"><span class="lineNum"> 328 </span> :<span class="lineCov"> 9 : char* ip_addr = sessions[uid].ip_addr;</span></a>
<a name="329"><span class="lineNum"> 329 </span> :<span class="lineCov"> 9 : log(&quot;user #%d %s\033[2m(%s)\033[0m try to login&quot;, uid, user_name, ip_addr);</span></a>
<a name="330"><span class="lineNum"> 330 </span> :<span class="lineCov"> 9 : int message = check_user_registered(user_name, password);</span></a>
<a name="331"><span class="lineNum"> 331 </span> : : </a>
<a name="332"><span class="lineNum"> 332 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 6 times"> + </span>]:<span class="lineCov"> 9 : if (query_session_built(uid)) {</span></a>
<a name="333"><span class="lineNum"> 333 </span> :<span class="lineCov"> 3 : log(&quot;user #%d %s\033[2m(%s)\033[0m has logined&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="334"><span class="lineNum"> 334 </span> :<span class="lineCov"> 3 : send_to_client(uid, SERVER_RESPONSE_YOU_HAVE_LOGINED);</span></a>
<a name="335"><span class="lineNum"> 335 </span> :<span class="lineCov"> 3 : return 0;</span></a>
<a name="336"><span class="lineNum"> 336 </span> : : }</a>
<a name="337"><span class="lineNum"> 337 </span> : : </a>
<a name="338"><span class="lineNum"> 338 </span> [<span class="branchCov" title="Branch 0 was taken 36 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 38 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="339"><span class="lineNum"> 339 </span> [<span class="branchCov" title="Branch 0 was taken 5 times"> + </span><span class="branchCov" title="Branch 1 was taken 31 times"> + </span>]:<span class="lineCov"> 36 : if (query_session_built(i)) {</span></a>
<a name="340"><span class="lineNum"> 340 </span> :<span class="lineCov"> 5 : logi(&quot;check dup user id: %s vs. %s&quot;, user_name, sessions[i].user_name);</span></a>
<a name="341"><span class="lineNum"> 341 </span> [<span class="branchCov" title="Branch 0 was taken 4 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 5 : if (strncmp(user_name, sessions[i].user_name, USERNAME_SIZE - 1) == 0) {</span></a>
<a name="342"><span class="lineNum"> 342 </span> :<span class="lineCov"> 4 : log(&quot;user #%d %s duplicate with %dth user %s\033[2m(%s)\033[0m&quot;, uid, user_name, i, sessions[i].user_name, sessions[i].ip_addr);</span></a>
<a name="343"><span class="lineNum"> 343 </span> :<span class="lineCov"> 4 : is_dup = 1;</span></a>
<a name="344"><span class="lineNum"> 344 </span> :<span class="lineCov"> 4 : break;</span></a>
<a name="345"><span class="lineNum"> 345 </span> : : }</a>
<a name="346"><span class="lineNum"> 346 </span> : : }</a>
<a name="347"><span class="lineNum"> 347 </span> : : }</a>
<a name="348"><span class="lineNum"> 348 </span> : : </a>
<a name="349"><span class="lineNum"> 349 </span> : : // no duplicate user ids found</a>
<a name="350"><span class="lineNum"> 350 </span> :<span class="lineCov"> 6 : cout&lt;&lt;&quot;dup: &quot;&lt;&lt;is_dup&lt;&lt;endl;</span></a>
<a name="351"><span class="lineNum"> 351 </span> [<span class="branchCov" title="Branch 0 was taken 4 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 6 : if (is_dup) {</span></a>
<a name="352"><span class="lineNum"> 352 </span> :<span class="lineCov"> 4 : log(&quot;send fail dup id message to client.&quot;);</span></a>
<a name="353"><span class="lineNum"> 353 </span> :<span class="lineCov"> 4 : send_to_client(uid, SERVER_RESPONSE_LOGIN_FAIL_DUP_USERID);</span></a>
<a name="354"><span class="lineNum"> 354 </span> :<span class="lineCov"> 4 : sessions[uid].state = USER_STATE_NOT_LOGIN;</span></a>
<a name="355"><span class="lineNum"> 355 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : } else if (message == SERVER_RESPONSE_LOGIN_SUCCESS) {</span></a>
<a name="356"><span class="lineNum"> 356 </span> :<span class="lineCov"> 1 : log(&quot;user %s login success&quot;, user_name);</span></a>
<a name="357"><span class="lineNum"> 357 </span> :<span class="lineCov"> 1 : sessions[uid].state = USER_STATE_LOGIN;</span></a>
<a name="358"><span class="lineNum"> 358 </span> :<span class="lineCov"> 1 : send_to_client(</span></a>
<a name="359"><span class="lineNum"> 359 </span> : : uid,</a>
<a name="360"><span class="lineNum"> 360 </span> : : SERVER_RESPONSE_LOGIN_SUCCESS,</a>
<a name="361"><span class="lineNum"> 361 </span> : : sformat(&quot;Welcome to multiplayer shooting game! server \033[0;32m%s%s&quot;, version, color_s[0]));</a>
<a name="362"><span class="lineNum"> 362 </span> :<span class="lineCov"> 1 : strncpy(sessions[uid].user_name, user_name, USERNAME_SIZE - 1);</span></a>
<a name="363"><span class="lineNum"> 363 </span> :<span class="lineCov"> 1 : inform_friends(uid, SERVER_MESSAGE_FRIEND_LOGIN);</span></a>
<a name="364"><span class="lineNum"> 364 </span> : : } else {</a>
<a name="365"><span class="lineNum"> 365 </span> :<span class="lineCov"> 1 : send_to_client(uid, message);</span></a>
<a name="366"><span class="lineNum"> 366 </span> : : }</a>
<a name="367"><span class="lineNum"> 367 </span> : : </a>
<a name="368"><span class="lineNum"> 368 </span> :<span class="lineCov"> 6 : return 0;</span></a>
<a name="369"><span class="lineNum"> 369 </span> : : }</a>
<a name="370"><span class="lineNum"> 370 </span> : : </a>
<a name="371"><span class="lineNum"> 371 </span> :<span class="lineCov"> 5 : int client_command_user_logout(int uid) {</span></a>
<a name="372"><span class="lineNum"> 372 </span> [<span class="branchCov" title="Branch 0 was taken 4 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 5 : if (sessions[uid].state == USER_STATE_BATTLE</span></a>
<a name="373"><span class="lineNum"> 373 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 4 : || sessions[uid].state == USER_STATE_WAIT_TO_BATTLE) {</span></a>
<a name="374"><span class="lineNum"> 374 </span> :<span class="lineCov"> 2 : log(&quot;user #%d %s\033[2m(%s)\033[0m tries to logout was in battle&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="375"><span class="lineNum"> 375 </span> :<span class="lineCov"> 2 : user_quit_battle(sessions[uid].bid, uid);</span></a>
<a name="376"><span class="lineNum"> 376 </span> : : }</a>
<a name="377"><span class="lineNum"> 377 </span> : : </a>
<a name="378"><span class="lineNum"> 378 </span> :<span class="lineCov"> 5 : log(&quot;user #%d %s\033[2m(%s)\033[0m logout&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="379"><span class="lineNum"> 379 </span> :<span class="lineCov"> 5 : sessions[uid].state = USER_STATE_NOT_LOGIN;</span></a>
<a name="380"><span class="lineNum"> 380 </span> :<span class="lineCov"> 5 : inform_friends(uid, SERVER_MESSAGE_FRIEND_LOGOUT);</span></a>
<a name="381"><span class="lineNum"> 381 </span> :<span class="lineCov"> 5 : return 0;</span></a>
<a name="382"><span class="lineNum"> 382 </span> : : }</a>
<a name="383"><span class="lineNum"> 383 </span> : : </a>
<a name="384"><span class="lineNum"> 384 </span> :<span class="lineCov"> 338 : int query_session_built(uint32_t uid) {</span></a>
<a name="385"><span class="lineNum"> 385 </span> : : //assert(uid &lt; USER_CNT);</a>
<a name="386"><span class="lineNum"> 386 </span> : : </a>
<a name="387"><span class="lineNum"> 387 </span> [<span class="branchCov" title="Branch 0 was taken 210 times"> + </span><span class="branchCov" title="Branch 1 was taken 128 times"> + </span>]:<span class="lineCov"> 338 : if (sessions[uid].state == USER_STATE_UNUSED</span></a>
<a name="388"><span class="lineNum"> 388 </span> [<span class="branchCov" title="Branch 0 was taken 13 times"> + </span><span class="branchCov" title="Branch 1 was taken 197 times"> + </span>]:<span class="lineCov"> 210 : || sessions[uid].state == USER_STATE_NOT_LOGIN) {</span></a>
<a name="389"><span class="lineNum"> 389 </span> :<span class="lineCov"> 141 : return false;</span></a>
<a name="390"><span class="lineNum"> 390 </span> : : } else {</a>
<a name="391"><span class="lineNum"> 391 </span> :<span class="lineCov"> 197 : return true;</span></a>
<a name="392"><span class="lineNum"> 392 </span> : : }</a>
<a name="393"><span class="lineNum"> 393 </span> : : }</a>
<a name="394"><span class="lineNum"> 394 </span> : : </a>
<a name="395"><span class="lineNum"> 395 </span> : : void inform_all_user_battle_player(int bid);</a>
<a name="396"><span class="lineNum"> 396 </span> : : </a>
<a name="397"><span class="lineNum"> 397 </span> :<span class="lineCov"> 11 : void user_quit_battle(uint32_t bid, uint32_t uid) {</span></a>
<a name="398"><span class="lineNum"> 398 </span> : : //assert(bid &lt; USER_CNT &amp;&amp; uid &lt; USER_CNT);</a>
<a name="399"><span class="lineNum"> 399 </span> : : </a>
<a name="400"><span class="lineNum"> 400 </span> :<span class="lineCov"> 11 : log(&quot;user %s\033[2m(%s)\033[0m quit from battle %d(%ld/%ld users)&quot;, sessions[uid].user_name, sessions[uid].ip_addr, bid, battles[bid].alive_users, battles[bid].all_users);</span></a>
<a name="401"><span class="lineNum"> 401 </span> :<span class="lineCov"> 11 : battles[bid].all_users--;</span></a>
<a name="402"><span class="lineNum"> 402 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 8 times"> + </span>]:<span class="lineCov"> 11 : if (battles[bid].users[uid].battle_state == BATTLE_STATE_LIVE) {</span></a>
<a name="403"><span class="lineNum"> 403 </span> :<span class="lineCov"> 3 : battles[bid].alive_users--;</span></a>
<a name="404"><span class="lineNum"> 404 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (battles[bid].alive_users != 0) {</span></a>
<a name="405"><span class="lineNum"> 405 </span> :<span class="lineCov"> 2 : sessions[uid].score = max(sessions[uid].score - 5, 0);</span></a>
<a name="406"><span class="lineNum"> 406 </span> :<span class="lineCov"> 2 : sessions[uid].death ++;</span></a>
<a name="407"><span class="lineNum"> 407 </span> : : }</a>
<a name="408"><span class="lineNum"> 408 </span> : : }</a>
<a name="409"><span class="lineNum"> 409 </span> :<span class="lineCov"> 11 : battles[bid].users[uid].battle_state = BATTLE_STATE_UNJOINED;</span></a>
<a name="410"><span class="lineNum"> 410 </span> :<span class="lineCov"> 11 : sessions[uid].state = USER_STATE_LOGIN;</span></a>
<a name="411"><span class="lineNum"> 411 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 9 times"> + </span>]:<span class="lineCov"> 11 : if (battles[bid].all_users == 0) {</span></a>
<a name="412"><span class="lineNum"> 412 </span> : : // disband battle</a>
<a name="413"><span class="lineNum"> 413 </span> :<span class="lineCov"> 2 : log(&quot;disband battle %d&quot;, bid);</span></a>
<a name="414"><span class="lineNum"> 414 </span> :<span class="lineCov"> 2 : battles[bid].reset();</span></a>
<a name="415"><span class="lineNum"> 415 </span> : : } else {</a>
<a name="416"><span class="lineNum"> 416 </span> : : server_message_t sm;</a>
<a name="417"><span class="lineNum"> 417 </span> :<span class="lineCov"> 9 : sm.message = SERVER_MESSAGE_USER_QUIT_BATTLE;</span></a>
<a name="418"><span class="lineNum"> 418 </span> :<span class="lineCov"> 9 : strncpy(sm.friend_name, sessions[uid].user_name, USERNAME_SIZE - 1);</span></a>
<a name="419"><span class="lineNum"> 419 </span> : : </a>
<a name="420"><span class="lineNum"> 420 </span> [<span class="branchCov" title="Branch 0 was taken 126 times"> + </span><span class="branchCov" title="Branch 1 was taken 9 times"> + </span>]:<span class="lineCov"> 135 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="421"><span class="lineNum"> 421 </span> : : if (battles[bid].users[i].battle_state != BATTLE_STATE_UNJOINED) {</a>
<a name="422"><span class="lineNum"> 422 </span> : : //wrap_send(sessions[i].conn, &amp;sm);</a>
<a name="423"><span class="lineNum"> 423 </span> : : }</a>
<a name="424"><span class="lineNum"> 424 </span> : : }</a>
<a name="425"><span class="lineNum"> 425 </span> : : }</a>
<a name="426"><span class="lineNum"> 426 </span> :<span class="lineCov"> 11 : }</span></a>
<a name="427"><span class="lineNum"> 427 </span> : : </a>
<a name="428"><span class="lineNum"> 428 </span> :<span class="lineCov"> 10 : void user_join_battle_common_part(uint32_t bid, uint32_t uid, uint32_t joined_state) {</span></a>
<a name="429"><span class="lineNum"> 429 </span> :<span class="lineCov"> 10 : log(&quot;user %s\033[2m(%s)\033[0m join in battle %d&quot;, sessions[uid].user_name, sessions[uid].ip_addr, bid);</span></a>
<a name="430"><span class="lineNum"> 430 </span> : : </a>
<a name="431"><span class="lineNum"> 431 </span> [<span class="branchCov" title="Branch 0 was taken 4 times"> + </span><span class="branchCov" title="Branch 1 was taken 6 times"> + </span>]:<span class="lineCov"> 10 : if (joined_state == USER_STATE_BATTLE) {</span></a>
<a name="432"><span class="lineNum"> 432 </span> :<span class="lineCov"> 4 : battles[bid].all_users++;</span></a>
<a name="433"><span class="lineNum"> 433 </span> :<span class="lineCov"> 4 : battles[bid].alive_users++;</span></a>
<a name="434"><span class="lineNum"> 434 </span> :<span class="lineCov"> 4 : log(&quot;now %ld alive of %ld users&quot;, battles[bid].alive_users, battles[bid].all_users);</span></a>
<a name="435"><span class="lineNum"> 435 </span> :<span class="lineCov"> 4 : battles[bid].users[uid].battle_state = BATTLE_STATE_LIVE;</span></a>
<a name="436"><span class="lineNum"> 436 </span> [<span class="branchCov" title="Branch 0 was taken 5 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 6 : } else if (joined_state == USER_STATE_WAIT_TO_BATTLE) {</span></a>
<a name="437"><span class="lineNum"> 437 </span> :<span class="lineCov"> 5 : battles[bid].users[uid].battle_state = BATTLE_STATE_UNJOINED;</span></a>
<a name="438"><span class="lineNum"> 438 </span> : : } else {</a>
<a name="439"><span class="lineNum"> 439 </span> :<span class="lineCov"> 1 : loge(&quot;check here, other joined_state:%d&quot;, joined_state);</span></a>
<a name="440"><span class="lineNum"> 440 </span> : : }</a>
<a name="441"><span class="lineNum"> 441 </span> : : </a>
<a name="442"><span class="lineNum"> 442 </span> :<span class="lineCov"> 10 : battles[bid].users[uid].life = INIT_LIFE;</span></a>
<a name="443"><span class="lineNum"> 443 </span> :<span class="lineCov"> 10 : battles[bid].users[uid].energy = INIT_BULLETS;</span></a>
<a name="444"><span class="lineNum"> 444 </span> : : </a>
<a name="445"><span class="lineNum"> 445 </span> :<span class="lineCov"> 10 : sessions[uid].state = joined_state;</span></a>
<a name="446"><span class="lineNum"> 446 </span> :<span class="lineCov"> 10 : sessions[uid].bid = bid;</span></a>
<a name="447"><span class="lineNum"> 447 </span> :<span class="lineCov"> 10 : }</span></a>
<a name="448"><span class="lineNum"> 448 </span> : : </a>
<a name="449"><span class="lineNum"> 449 </span> :<span class="lineCov"> 8 : void user_join_battle(uint32_t bid, uint32_t uid) {</span></a>
<a name="450"><span class="lineNum"> 450 </span> :<span class="lineCov"> 8 : int ux = (rand() &amp; 0x7FFF) % BATTLE_W;</span></a>
<a name="451"><span class="lineNum"> 451 </span> :<span class="lineCov"> 8 : int uy = (rand() &amp; 0x7FFF) % BATTLE_H;</span></a>
<a name="452"><span class="lineNum"> 452 </span> :<span class="lineCov"> 8 : battles[bid].users[uid].pos.x = ux;</span></a>
<a name="453"><span class="lineNum"> 453 </span> :<span class="lineCov"> 8 : battles[bid].users[uid].pos.y = uy;</span></a>
<a name="454"><span class="lineNum"> 454 </span> :<span class="lineCov"> 8 : log(&quot;alloc position (%hhu, %hhu) for launcher #%d %s&quot;,</span></a>
<a name="455"><span class="lineNum"> 455 </span> : : ux, uy, uid, sessions[uid].user_name);</a>
<a name="456"><span class="lineNum"> 456 </span> : : </a>
<a name="457"><span class="lineNum"> 457 </span> :<span class="lineCov"> 8 : sessions[uid].state = USER_STATE_BATTLE;</span></a>
<a name="458"><span class="lineNum"> 458 </span> : : </a>
<a name="459"><span class="lineNum"> 459 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 5 times"> + </span>]:<span class="lineCov"> 8 : if (battles[bid].users[uid].battle_state == BATTLE_STATE_UNJOINED) {</span></a>
<a name="460"><span class="lineNum"> 460 </span> :<span class="lineCov"> 3 : user_join_battle_common_part(bid, uid, USER_STATE_BATTLE);</span></a>
<a name="461"><span class="lineNum"> 461 </span> : : }</a>
<a name="462"><span class="lineNum"> 462 </span> :<span class="lineCov"> 8 : }</span></a>
<a name="463"><span class="lineNum"> 463 </span> : : </a>
<a name="464"><span class="lineNum"> 464 </span> :<span class="lineCov"> 4 : void user_invited_to_join_battle(uint32_t bid, uint32_t uid) {</span></a>
<a name="465"><span class="lineNum"> 465 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 4 : if (sessions[uid].state == USER_STATE_WAIT_TO_BATTLE</span></a>
<a name="466"><span class="lineNum"> 466 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : &amp;&amp; bid != sessions[uid].bid) {</span></a>
<a name="467"><span class="lineNum"> 467 </span> :<span class="lineCov"> 1 : log(&quot;user #%d %s\033[2m(%s)\033[0m rejects old battle #%d since he was invited to a new battle&quot;,</span></a>
<a name="468"><span class="lineNum"> 468 </span> : : uid, sessions[uid].user_name, sessions[uid].ip_addr, sessions[uid].bid);</a>
<a name="469"><span class="lineNum"> 469 </span> : : </a>
<a name="470"><span class="lineNum"> 470 </span> :<span class="lineCov"> 1 : send_to_client_with_username(sessions[uid].inviter_id, SERVER_MESSAGE_FRIEND_REJECT_BATTLE, sessions[uid].user_name);</span></a>
<a name="471"><span class="lineNum"> 471 </span> : : }</a>
<a name="472"><span class="lineNum"> 472 </span> : : </a>
<a name="473"><span class="lineNum"> 473 </span> :<span class="lineCov"> 4 : user_join_battle_common_part(bid, uid, USER_STATE_WAIT_TO_BATTLE);</span></a>
<a name="474"><span class="lineNum"> 474 </span> :<span class="lineCov"> 4 : }</span></a>
<a name="475"><span class="lineNum"> 475 </span> : : </a>
<a name="476"><span class="lineNum"> 476 </span> :<span class="lineCov"> 37 : int find_uid_by_user_name(const char* user_name) {</span></a>
<a name="477"><span class="lineNum"> 477 </span> :<span class="lineCov"> 37 : int ret_uid = -1;</span></a>
<a name="478"><span class="lineNum"> 478 </span> :<span class="lineCov"> 37 : log(&quot;find user %s&quot;, user_name);</span></a>
<a name="479"><span class="lineNum"> 479 </span> [<span class="branchCov" title="Branch 0 was taken 178 times"> + </span><span class="branchCov" title="Branch 1 was taken 10 times"> + </span>]:<span class="lineCov"> 188 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="480"><span class="lineNum"> 480 </span> [<span class="branchCov" title="Branch 0 was taken 155 times"> + </span><span class="branchCov" title="Branch 1 was taken 23 times"> + </span>]:<span class="lineCov"> 178 : if (query_session_built(i)) {</span></a>
<a name="481"><span class="lineNum"> 481 </span> [<span class="branchCov" title="Branch 0 was taken 27 times"> + </span><span class="branchCov" title="Branch 1 was taken 128 times"> + </span>]:<span class="lineCov"> 155 : if (strncmp(user_name, sessions[i].user_name, USERNAME_SIZE - 1) == 0) {</span></a>
<a name="482"><span class="lineNum"> 482 </span> :<span class="lineCov"> 27 : ret_uid = i;</span></a>
<a name="483"><span class="lineNum"> 483 </span> :<span class="lineCov"> 27 : break;</span></a>
<a name="484"><span class="lineNum"> 484 </span> : : }</a>
<a name="485"><span class="lineNum"> 485 </span> : : }</a>
<a name="486"><span class="lineNum"> 486 </span> : : }</a>
<a name="487"><span class="lineNum"> 487 </span> : : </a>
<a name="488"><span class="lineNum"> 488 </span> [<span class="branchCov" title="Branch 0 was taken 10 times"> + </span><span class="branchCov" title="Branch 1 was taken 27 times"> + </span>]:<span class="lineCov"> 37 : if (ret_uid == -1) {</span></a>
<a name="489"><span class="lineNum"> 489 </span> :<span class="lineCov"> 10 : logi(&quot;fail&quot;);</span></a>
<a name="490"><span class="lineNum"> 490 </span> : : } else {</a>
<a name="491"><span class="lineNum"> 491 </span> :<span class="lineCov"> 27 : logi(&quot;found: #%d %s\033[2m(%s)\033[0m&quot;, ret_uid, sessions[ret_uid].user_name, sessions[ret_uid].ip_addr);</span></a>
<a name="492"><span class="lineNum"> 492 </span> : : }</a>
<a name="493"><span class="lineNum"> 493 </span> : : </a>
<a name="494"><span class="lineNum"> 494 </span> :<span class="lineCov"> 37 : return ret_uid;</span></a>
<a name="495"><span class="lineNum"> 495 </span> : : }</a>
<a name="496"><span class="lineNum"> 496 </span> : : </a>
<a name="497"><span class="lineNum"> 497 </span> :<span class="lineCov"> 5 : int get_unalloced_battle() {</span></a>
<a name="498"><span class="lineNum"> 498 </span> :<span class="lineCov"> 5 : int ret_bid = -1;</span></a>
<a name="499"><span class="lineNum"> 499 </span> :<span class="lineCov"> 5 : pthread_mutex_lock(&amp;battles_lock);</span></a>
<a name="500"><span class="lineNum"> 500 </span> [<span class="branchCov" title="Branch 0 was taken 29 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 31 : for (int i = 1; i &lt; USER_CNT; i++) {</span></a>
<a name="501"><span class="lineNum"> 501 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 26 times"> + </span>]:<span class="lineCov"> 29 : if (battles[i].is_alloced == false) {</span></a>
<a name="502"><span class="lineNum"> 502 </span> :<span class="lineCov"> 3 : battles[i].reset();</span></a>
<a name="503"><span class="lineNum"> 503 </span> :<span class="lineCov"> 3 : battles[i].is_alloced = true;</span></a>
<a name="504"><span class="lineNum"> 504 </span> :<span class="lineCov"> 3 : ret_bid = i;</span></a>
<a name="505"><span class="lineNum"> 505 </span> :<span class="lineCov"> 3 : break;</span></a>
<a name="506"><span class="lineNum"> 506 </span> : : }</a>
<a name="507"><span class="lineNum"> 507 </span> : : }</a>
<a name="508"><span class="lineNum"> 508 </span> :<span class="lineCov"> 5 : pthread_mutex_unlock(&amp;battles_lock);</span></a>
<a name="509"><span class="lineNum"> 509 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 5 : if (ret_bid == -1) {</span></a>
<a name="510"><span class="lineNum"> 510 </span> :<span class="lineCov"> 2 : loge(&quot;check here, returned battle id should not be -1&quot;);</span></a>
<a name="511"><span class="lineNum"> 511 </span> : : } else {</a>
<a name="512"><span class="lineNum"> 512 </span> :<span class="lineCov"> 3 : log(&quot;alloc unalloced battle id #%d&quot;, ret_bid);</span></a>
<a name="513"><span class="lineNum"> 513 </span> : : }</a>
<a name="514"><span class="lineNum"> 514 </span> :<span class="lineCov"> 5 : return ret_bid;</span></a>
<a name="515"><span class="lineNum"> 515 </span> : : }</a>
<a name="516"><span class="lineNum"> 516 </span> : : </a>
<a name="517"><span class="lineNum"> 517 </span> :<span class="lineCov"> 2 : int get_unused_session() {</span></a>
<a name="518"><span class="lineNum"> 518 </span> :<span class="lineCov"> 2 : int ret_uid = -1;</span></a>
<a name="519"><span class="lineNum"> 519 </span> :<span class="lineCov"> 2 : pthread_mutex_lock(&amp;sessions_lock);</span></a>
<a name="520"><span class="lineNum"> 520 </span> [<span class="branchCov" title="Branch 0 was taken 17 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 18 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="521"><span class="lineNum"> 521 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 16 times"> + </span>]:<span class="lineCov"> 17 : if (sessions[i].state == USER_STATE_UNUSED) {</span></a>
<a name="522"><span class="lineNum"> 522 </span> :<span class="lineCov"> 1 : memset(&amp;sessions[i], 0, sizeof(struct session_t));</span></a>
<a name="523"><span class="lineNum"> 523 </span> :<span class="lineCov"> 1 : sessions[i].conn = -1;</span></a>
<a name="524"><span class="lineNum"> 524 </span> :<span class="lineCov"> 1 : sessions[i].state = USER_STATE_NOT_LOGIN;</span></a>
<a name="525"><span class="lineNum"> 525 </span> :<span class="lineCov"> 1 : ret_uid = i;</span></a>
<a name="526"><span class="lineNum"> 526 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="527"><span class="lineNum"> 527 </span> : : }</a>
<a name="528"><span class="lineNum"> 528 </span> : : }</a>
<a name="529"><span class="lineNum"> 529 </span> :<span class="lineCov"> 2 : pthread_mutex_unlock(&amp;sessions_lock);</span></a>
<a name="530"><span class="lineNum"> 530 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (ret_uid == -1) {</span></a>
<a name="531"><span class="lineNum"> 531 </span> :<span class="lineCov"> 1 : log(&quot;fail to alloc session id&quot;);</span></a>
<a name="532"><span class="lineNum"> 532 </span> : : } else {</a>
<a name="533"><span class="lineNum"> 533 </span> :<span class="lineCov"> 1 : log(&quot;alloc unused session id #%d&quot;, ret_uid);</span></a>
<a name="534"><span class="lineNum"> 534 </span> : : }</a>
<a name="535"><span class="lineNum"> 535 </span> :<span class="lineCov"> 2 : return ret_uid;</span></a>
<a name="536"><span class="lineNum"> 536 </span> : : }</a>
<a name="537"><span class="lineNum"> 537 </span> : : </a>
<a name="538"><span class="lineNum"> 538 </span> :<span class="lineCov"> 6 : void inform_friends(int uid, int message) {</span></a>
<a name="539"><span class="lineNum"> 539 </span> : : server_message_t sm;</a>
<a name="540"><span class="lineNum"> 540 </span> :<span class="lineCov"> 6 : char* user_name = sessions[uid].user_name;</span></a>
<a name="541"><span class="lineNum"> 541 </span> :<span class="lineCov"> 6 : memset(&amp;sm, 0, sizeof(server_message_t));</span></a>
<a name="542"><span class="lineNum"> 542 </span> :<span class="lineCov"> 6 : sm.message = message;</span></a>
<a name="543"><span class="lineNum"> 543 </span> [<span class="branchCov" title="Branch 0 was taken 84 times"> + </span><span class="branchCov" title="Branch 1 was taken 6 times"> + </span>]:<span class="lineCov"> 90 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="544"><span class="lineNum"> 544 </span> [<span class="branchCov" title="Branch 0 was taken 78 times"> + </span><span class="branchCov" title="Branch 1 was taken 6 times"> + </span><span class="branchCov" title="Branch 2 was taken 73 times"> + </span><span class="branchCov" title="Branch 3 was taken 5 times"> + </span> :<span class="lineCov"> 84 : if (i == uid || !query_session_built(i))</span></a>
<span class="lineNum"> </span> <span class="branchCov" title="Branch 4 was taken 79 times"> + </span><span class="branchCov" title="Branch 5 was taken 5 times"> + </span>]
<a name="545"><span class="lineNum"> 545 </span> :<span class="lineCov"> 79 : continue;</span></a>
<a name="546"><span class="lineNum"> 546 </span> :<span class="lineCov"> 5 : strncpy(sm.friend_name, user_name, USERNAME_SIZE - 1);</span></a>
<a name="547"><span class="lineNum"> 547 </span> : : //wrap_send(sessions[i].conn, &amp;sm);</a>
<a name="548"><span class="lineNum"> 548 </span> : : }</a>
<a name="549"><span class="lineNum"> 549 </span> :<span class="lineCov"> 6 : }</span></a>
<a name="550"><span class="lineNum"> 550 </span> : : </a>
<a name="551"><span class="lineNum"> 551 </span> :<span class="lineCov"> 49 : void forced_generate_items(int bid, int x, int y, int kind, int count, int uid = -1) {</span></a>
<a name="552"><span class="lineNum"> 552 </span> : : //if (battles[bid].num_of_other &gt;= MAX_OTHER) return;</a>
<a name="553"><span class="lineNum"> 553 </span> [<span class="branchCov" title="Branch 0 was taken 47 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span><span class="branchCov" title="Branch 2 was taken 1 time"> + </span><span class="branchCov" title="Branch 3 was taken 46 times"> + </span>]:<span class="lineCov"> 52 : if (x &lt; 0 || x &gt;= BATTLE_W) return; //60</span></a>
<a name="554"><span class="lineNum"> 554 </span> [<span class="branchCov" title="Branch 0 was taken 44 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span><span class="branchCov" title="Branch 2 was taken 1 time"> + </span><span class="branchCov" title="Branch 3 was taken 43 times"> + </span>]:<span class="lineCov"> 46 : if (y &lt; 0 || y &gt;= BATTLE_H) return; //21</span></a>
<a name="555"><span class="lineNum"> 555 </span> :<span class="lineCov"> 43 : battles[bid].item_count++;</span></a>
<a name="556"><span class="lineNum"> 556 </span> :<span class="lineCov"> 43 : item_t new_item;</span></a>
<a name="557"><span class="lineNum"> 557 </span> :<span class="lineCov"> 43 : new_item.id = battles[bid].item_count;</span></a>
<a name="558"><span class="lineNum"> 558 </span> :<span class="lineCov"> 43 : new_item.kind = kind;</span></a>
<a name="559"><span class="lineNum"> 559 </span> :<span class="lineCov"> 43 : new_item.pos.x = x;</span></a>
<a name="560"><span class="lineNum"> 560 </span> :<span class="lineCov"> 43 : new_item.pos.y = y;</span></a>
<a name="561"><span class="lineNum"> 561 </span> :<span class="lineCov"> 43 : new_item.time = battles[bid].global_time + count;</span></a>
<a name="562"><span class="lineNum"> 562 </span> :<span class="lineCov"> 43 : new_item.owner = uid;</span></a>
<a name="563"><span class="lineNum"> 563 </span> [<span class="branchCov" title="Branch 0 was taken 12 times"> + </span><span class="branchCov" title="Branch 1 was taken 31 times"> + </span>]:<span class="lineCov"> 43 : if (kind == ITEM_MAGMA) {</span></a>
<a name="564"><span class="lineNum"> 564 </span> :<span class="lineCov"> 12 : new_item.count = MAGMA_INIT_TIMES;</span></a>
<a name="565"><span class="lineNum"> 565 </span> : : }</a>
<a name="566"><span class="lineNum"> 566 </span> : : </a>
<a name="567"><span class="lineNum"> 567 </span> : : /*</a>
<a name="568"><span class="lineNum"> 568 </span> : : battles[bid].items.push_back(new_item);</a>
<a name="569"><span class="lineNum"> 569 </span> : : log(&quot;new %s #%d (%d,%d)&quot;,</a>
<a name="570"><span class="lineNum"> 570 </span> : : item_s[new_item.kind],</a>
<a name="571"><span class="lineNum"> 571 </span> : : new_item.id,</a>
<a name="572"><span class="lineNum"> 572 </span> : : new_item.pos.x,</a>
<a name="573"><span class="lineNum"> 573 </span> : : new_item.pos.y);</a>
<a name="574"><span class="lineNum"> 574 </span> : : */</a>
<a name="575"><span class="lineNum"> 575 </span> : : }</a>
<a name="576"><span class="lineNum"> 576 </span> : : </a>
<a name="577"><span class="lineNum"> 577 </span> :<span class="lineCov"> 3501 : void random_generate_items(int bid) {</span></a>
<a name="578"><span class="lineNum"> 578 </span> : : int random_kind;</a>
<a name="579"><span class="lineNum"> 579 </span> : : //if (!probability(1, 100)) return; // rand 退出</a>
<a name="580"><span class="lineNum"> 580 </span> [<span class="branchCov" title="Branch 0 was taken 3458 times"> + </span><span class="branchCov" title="Branch 1 was taken 43 times"> + </span>]:<span class="lineCov"> 3501 : if (battles[bid].num_of_other &gt;= MAX_OTHER) return;</span></a>
<a name="581"><span class="lineNum"> 581 </span> : : /* delete</a>
<a name="582"><span class="lineNum"> 582 </span> : : random_kind = rand() % (ITEM_END - 1) + 1;</a>
<a name="583"><span class="lineNum"> 583 </span> : : if (random_kind == ITEM_BLOOD_VIAL &amp;&amp; probability(1, 2))</a>
<a name="584"><span class="lineNum"> 584 </span> : : random_kind = ITEM_MAGAZINE;</a>
<a name="585"><span class="lineNum"> 585 </span> : : */</a>
<a name="586"><span class="lineNum"> 586 </span> :<span class="lineCov"> 43 : random_kind = ITEM_MAGAZINE;</span></a>
<a name="587"><span class="lineNum"> 587 </span> :<span class="lineCov"> 43 : battles[bid].item_count++;</span></a>
<a name="588"><span class="lineNum"> 588 </span> :<span class="lineCov"> 43 : item_t new_item;</span></a>
<a name="589"><span class="lineNum"> 589 </span> :<span class="lineCov"> 43 : new_item.id = battles[bid].item_count;</span></a>
<a name="590"><span class="lineNum"> 590 </span> :<span class="lineCov"> 43 : new_item.kind = random_kind;</span></a>
<a name="591"><span class="lineNum"> 591 </span> :<span class="lineCov"> 43 : new_item.pos.x = (rand() &amp; 0x7FFF) % BATTLE_W;</span></a>
<a name="592"><span class="lineNum"> 592 </span> :<span class="lineCov"> 43 : new_item.pos.y = (rand() &amp; 0x7FFF) % BATTLE_H;</span></a>
<a name="593"><span class="lineNum"> 593 </span> :<span class="lineCov"> 43 : new_item.time = battles[bid].global_time + OTHER_ITEM_LASTS_TIME;</span></a>
<a name="594"><span class="lineNum"> 594 </span> :<span class="lineCov"> 43 : battles[bid].num_of_other++;</span></a>
<a name="595"><span class="lineNum"> 595 </span> : : /* delete</a>
<a name="596"><span class="lineNum"> 596 </span> : : log(&quot;new %s #%d (%d,%d)&quot;,</a>
<a name="597"><span class="lineNum"> 597 </span> : : item_s[new_item.kind],</a>
<a name="598"><span class="lineNum"> 598 </span> : : new_item.id,</a>
<a name="599"><span class="lineNum"> 599 </span> : : new_item.pos.x,</a>
<a name="600"><span class="lineNum"> 600 </span> : : new_item.pos.y);</a>
<a name="601"><span class="lineNum"> 601 </span> : : */</a>
<a name="602"><span class="lineNum"> 602 </span> : : /* delete</a>
<a name="603"><span class="lineNum"> 603 </span> : : if (random_kind == ITEM_MAGMA) {</a>
<a name="604"><span class="lineNum"> 604 </span> : : new_item.count = MAGMA_INIT_TIMES;</a>
<a name="605"><span class="lineNum"> 605 </span> : : }</a>
<a name="606"><span class="lineNum"> 606 </span> : : */</a>
<a name="607"><span class="lineNum"> 607 </span> : : </a>
<a name="608"><span class="lineNum"> 608 </span> : : //battles[bid].items.push_back(new_item); //delete</a>
<a name="609"><span class="lineNum"> 609 </span> : : </a>
<a name="610"><span class="lineNum"> 610 </span> : : //for (int i = 0; i &lt; USER_CNT; i++) {</a>
<a name="611"><span class="lineNum"> 611 </span> : : // if (battles[bid].users[i].battle_state != BATTLE_STATE_LIVE)</a>
<a name="612"><span class="lineNum"> 612 </span> : : // continue;</a>
<a name="613"><span class="lineNum"> 613 </span> : : // check_user_status(i);</a>
<a name="614"><span class="lineNum"> 614 </span> : : //}</a>
<a name="615"><span class="lineNum"> 615 </span> : : }</a>
<a name="616"><span class="lineNum"> 616 </span> : : </a>
<a name="617"><span class="lineNum"> 617 </span> :<span class="lineCov"> 3525 : void move_bullets(int bid) {</span></a>
<a name="618"><span class="lineNum"> 618 </span> [<span class="branchCov" title="Branch 0 was taken 23 times"> + </span><span class="branchCov" title="Branch 1 was taken 3525 times"> + </span>]:<span class="lineCov"> 3548 : for (auto&amp; cur : battles[bid].items) {</span></a>
<a name="619"><span class="lineNum"> 619 </span> : : //for (int i = 0; i &lt; MAX_ITEM; i++) {</a>
<a name="620"><span class="lineNum"> 620 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 21 times"> + </span>]:<span class="lineCov"> 23 : if (cur.kind != ITEM_BULLET)</span></a>
<a name="621"><span class="lineNum"> 621 </span> :<span class="lineCov"> 2 : continue;</span></a>
<a name="622"><span class="lineNum"> 622 </span> : : // log(&quot;try to move bullet %d with dir %d&quot;, i, cur.dir);</a>
<a name="623"><span class="lineNum"> 623 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span><span class="branchCov" title="Branch 2 was taken 2 times"> + </span><span class="branchCov" title="Branch 3 was taken 2 times"> + </span> :<span class="lineCov"> 21 : switch (cur.dir) {</span></a>
<span class="lineNum"> </span> <span class="branchCov" title="Branch 4 was taken 3 times"> + </span><span class="branchCov" title="Branch 5 was taken 3 times"> + </span><span class="branchCov" title="Branch 6 was taken 3 times"> + </span><span class="branchCov" title="Branch 7 was taken 3 times"> + </span>
<span class="lineNum"> </span> <span class="branchCov" title="Branch 8 was taken 1 time"> + </span>]
<a name="624"><span class="lineNum"> 624 </span> :<span class="lineCov"> 2 : case DIR_UP: {</span></a>
<a name="625"><span class="lineNum"> 625 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (cur.pos.y &gt; 0) {</span></a>
<a name="626"><span class="lineNum"> 626 </span> :<span class="lineCov"> 1 : (cur.pos.y)--;</span></a>
<a name="627"><span class="lineNum"> 627 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="628"><span class="lineNum"> 628 </span> : : }</a>
<a name="629"><span class="lineNum"> 629 </span> : : else {</a>
<a name="630"><span class="lineNum"> 630 </span> :<span class="lineCov"> 1 : cur.dir = DIR_DOWN;</span></a>
<a name="631"><span class="lineNum"> 631 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="632"><span class="lineNum"> 632 </span> : : }</a>
<a name="633"><span class="lineNum"> 633 </span> : : }</a>
<a name="634"><span class="lineNum"> 634 </span> :<span class="lineCov"> 2 : case DIR_DOWN: {</span></a>
<a name="635"><span class="lineNum"> 635 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (cur.pos.y &lt; BATTLE_H - 1) {</span></a>
<a name="636"><span class="lineNum"> 636 </span> :<span class="lineCov"> 1 : (cur.pos.y)++;</span></a>
<a name="637"><span class="lineNum"> 637 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="638"><span class="lineNum"> 638 </span> : : }</a>
<a name="639"><span class="lineNum"> 639 </span> : : else {</a>
<a name="640"><span class="lineNum"> 640 </span> :<span class="lineCov"> 1 : cur.dir = DIR_UP;</span></a>
<a name="641"><span class="lineNum"> 641 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="642"><span class="lineNum"> 642 </span> : : }</a>
<a name="643"><span class="lineNum"> 643 </span> : : }</a>
<a name="644"><span class="lineNum"> 644 </span> :<span class="lineCov"> 2 : case DIR_LEFT: {</span></a>
<a name="645"><span class="lineNum"> 645 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (cur.pos.x &gt; 0) {</span></a>
<a name="646"><span class="lineNum"> 646 </span> :<span class="lineCov"> 1 : (cur.pos.x)--;</span></a>
<a name="647"><span class="lineNum"> 647 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="648"><span class="lineNum"> 648 </span> : : }</a>
<a name="649"><span class="lineNum"> 649 </span> : : else {</a>
<a name="650"><span class="lineNum"> 650 </span> :<span class="lineCov"> 1 : cur.dir = DIR_RIGHT;</span></a>
<a name="651"><span class="lineNum"> 651 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="652"><span class="lineNum"> 652 </span> : : }</a>
<a name="653"><span class="lineNum"> 653 </span> : : }</a>
<a name="654"><span class="lineNum"> 654 </span> :<span class="lineCov"> 2 : case DIR_RIGHT: {</span></a>
<a name="655"><span class="lineNum"> 655 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (cur.pos.x &lt; BATTLE_W - 1) {</span></a>
<a name="656"><span class="lineNum"> 656 </span> :<span class="lineCov"> 1 : (cur.pos.x)++;</span></a>
<a name="657"><span class="lineNum"> 657 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="658"><span class="lineNum"> 658 </span> : : }</a>
<a name="659"><span class="lineNum"> 659 </span> : : else {</a>
<a name="660"><span class="lineNum"> 660 </span> :<span class="lineCov"> 1 : cur.dir = DIR_LEFT;</span></a>
<a name="661"><span class="lineNum"> 661 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="662"><span class="lineNum"> 662 </span> : : }</a>
<a name="663"><span class="lineNum"> 663 </span> : : }</a>
<a name="664"><span class="lineNum"> 664 </span> :<span class="lineCov"> 3 : case DIR_UP_LEFT: {</span></a>
<a name="665"><span class="lineNum"> 665 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (cur.pos.y &gt; 0) {</span></a>
<a name="666"><span class="lineNum"> 666 </span> :<span class="lineCov"> 2 : (cur.pos.y)--;</span></a>
<a name="667"><span class="lineNum"> 667 </span> : : }</a>
<a name="668"><span class="lineNum"> 668 </span> : : else {</a>
<a name="669"><span class="lineNum"> 669 </span> :<span class="lineCov"> 1 : cur.dir = DIR_DOWN_LEFT;</span></a>
<a name="670"><span class="lineNum"> 670 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="671"><span class="lineNum"> 671 </span> : : }</a>
<a name="672"><span class="lineNum"> 672 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (cur.pos.x &gt; 1) {</span></a>
<a name="673"><span class="lineNum"> 673 </span> :<span class="lineCov"> 1 : (cur.pos.x) -= 2;</span></a>
<a name="674"><span class="lineNum"> 674 </span> : : }</a>
<a name="675"><span class="lineNum"> 675 </span> : : else {</a>
<a name="676"><span class="lineNum"> 676 </span> :<span class="lineCov"> 1 : cur.dir = DIR_UP_RIGHT;</span></a>
<a name="677"><span class="lineNum"> 677 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="678"><span class="lineNum"> 678 </span> : : }</a>
<a name="679"><span class="lineNum"> 679 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="680"><span class="lineNum"> 680 </span> : : }</a>
<a name="681"><span class="lineNum"> 681 </span> :<span class="lineCov"> 3 : case DIR_UP_RIGHT: {</span></a>
<a name="682"><span class="lineNum"> 682 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (cur.pos.y &gt; 0) {</span></a>
<a name="683"><span class="lineNum"> 683 </span> :<span class="lineCov"> 2 : (cur.pos.y)--;</span></a>
<a name="684"><span class="lineNum"> 684 </span> : : }</a>
<a name="685"><span class="lineNum"> 685 </span> : : else {</a>
<a name="686"><span class="lineNum"> 686 </span> :<span class="lineCov"> 1 : cur.dir = DIR_DOWN_RIGHT;</span></a>
<a name="687"><span class="lineNum"> 687 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="688"><span class="lineNum"> 688 </span> : : }</a>
<a name="689"><span class="lineNum"> 689 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (cur.pos.x &lt; BATTLE_W - 2) {</span></a>
<a name="690"><span class="lineNum"> 690 </span> :<span class="lineCov"> 1 : (cur.pos.x) += 2;</span></a>
<a name="691"><span class="lineNum"> 691 </span> : : }</a>
<a name="692"><span class="lineNum"> 692 </span> : : else {</a>
<a name="693"><span class="lineNum"> 693 </span> :<span class="lineCov"> 1 : cur.dir = DIR_UP_LEFT;</span></a>
<a name="694"><span class="lineNum"> 694 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="695"><span class="lineNum"> 695 </span> : : }</a>
<a name="696"><span class="lineNum"> 696 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="697"><span class="lineNum"> 697 </span> : : }</a>
<a name="698"><span class="lineNum"> 698 </span> :<span class="lineCov"> 3 : case DIR_DOWN_LEFT: {</span></a>
<a name="699"><span class="lineNum"> 699 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (cur.pos.y &lt; BATTLE_H - 2) {</span></a>
<a name="700"><span class="lineNum"> 700 </span> :<span class="lineCov"> 2 : (cur.pos.y)++;</span></a>
<a name="701"><span class="lineNum"> 701 </span> : : }</a>
<a name="702"><span class="lineNum"> 702 </span> : : else {</a>
<a name="703"><span class="lineNum"> 703 </span> :<span class="lineCov"> 1 : cur.dir = DIR_UP_LEFT;</span></a>
<a name="704"><span class="lineNum"> 704 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="705"><span class="lineNum"> 705 </span> : : }</a>
<a name="706"><span class="lineNum"> 706 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (cur.pos.x &gt; 1) {</span></a>
<a name="707"><span class="lineNum"> 707 </span> :<span class="lineCov"> 1 : (cur.pos.x) -= 2;</span></a>
<a name="708"><span class="lineNum"> 708 </span> : : }</a>
<a name="709"><span class="lineNum"> 709 </span> : : else {</a>
<a name="710"><span class="lineNum"> 710 </span> :<span class="lineCov"> 1 : cur.dir = DIR_DOWN_RIGHT;</span></a>
<a name="711"><span class="lineNum"> 711 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="712"><span class="lineNum"> 712 </span> : : }</a>
<a name="713"><span class="lineNum"> 713 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="714"><span class="lineNum"> 714 </span> : : }</a>
<a name="715"><span class="lineNum"> 715 </span> :<span class="lineCov"> 3 : case DIR_DOWN_RIGHT: {</span></a>
<a name="716"><span class="lineNum"> 716 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (cur.pos.y &lt; BATTLE_H - 2) {</span></a>
<a name="717"><span class="lineNum"> 717 </span> :<span class="lineCov"> 2 : (cur.pos.y)++;</span></a>
<a name="718"><span class="lineNum"> 718 </span> : : }</a>
<a name="719"><span class="lineNum"> 719 </span> : : else {</a>
<a name="720"><span class="lineNum"> 720 </span> :<span class="lineCov"> 1 : cur.dir = DIR_UP_RIGHT;</span></a>
<a name="721"><span class="lineNum"> 721 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="722"><span class="lineNum"> 722 </span> : : }</a>
<a name="723"><span class="lineNum"> 723 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (cur.pos.x &lt; BATTLE_W - 2) {</span></a>
<a name="724"><span class="lineNum"> 724 </span> :<span class="lineCov"> 1 : (cur.pos.x) += 2;</span></a>
<a name="725"><span class="lineNum"> 725 </span> : : }</a>
<a name="726"><span class="lineNum"> 726 </span> : : else {</a>
<a name="727"><span class="lineNum"> 727 </span> :<span class="lineCov"> 1 : cur.dir = DIR_DOWN_LEFT;</span></a>
<a name="728"><span class="lineNum"> 728 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="729"><span class="lineNum"> 729 </span> : : }</a>
<a name="730"><span class="lineNum"> 730 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="731"><span class="lineNum"> 731 </span> : : }</a>
<a name="732"><span class="lineNum"> 732 </span> : : }</a>
<a name="733"><span class="lineNum"> 733 </span> : : }</a>
<a name="734"><span class="lineNum"> 734 </span> :<span class="lineCov"> 3525 : }</span></a>
<a name="735"><span class="lineNum"> 735 </span> : : </a>
<a name="736"><span class="lineNum"> 736 </span> :<span class="lineCov"> 9599 : void check_user_status(int uid) {</span></a>
<a name="737"><span class="lineNum"> 737 </span> : : //log(&quot;checking...&quot;);</a>
<a name="738"><span class="lineNum"> 738 </span> : : //auto start_time = myclock();</a>
<a name="739"><span class="lineNum"> 739 </span> :<span class="lineCov"> 9599 : int bid = sessions[uid].bid;</span></a>
<a name="740"><span class="lineNum"> 740 </span> :<span class="lineCov"> 9599 : int ux = battles[bid].users[uid].pos.x;</span></a>
<a name="741"><span class="lineNum"> 741 </span> :<span class="lineCov"> 9599 : int uy = battles[bid].users[uid].pos.y;</span></a>
<a name="742"><span class="lineNum"> 742 </span> : : //for (int i = 0; i &lt; MAX_ITEM; i++) {</a>
<a name="743"><span class="lineNum"> 743 </span> :<span class="lineCov"> 9599 : auto&amp; items = battles[bid].items;</span></a>
<a name="744"><span class="lineNum"> 744 </span> [<span class="branchCov" title="Branch 0 was taken 3179 times"> + </span><span class="branchCov" title="Branch 1 was taken 6420 times"> + </span>]:<span class="lineCov"> 9599 : if (battles[bid].users[uid].battle_state != BATTLE_STATE_LIVE) {</span></a>
<a name="745"><span class="lineNum"> 745 </span> :<span class="lineCov"> 3179 : return;</span></a>
<a name="746"><span class="lineNum"> 746 </span> : : }</a>
<a name="747"><span class="lineNum"> 747 </span> [<span class="branchCov" title="Branch 0 was taken 20 times"> + </span><span class="branchCov" title="Branch 1 was taken 6420 times"> + </span>]:<span class="lineCov"> 6440 : for (auto it = items.begin(); it != items.end(); it++) {</span></a>
<a name="748"><span class="lineNum"> 748 </span> : : </a>
<a name="749"><span class="lineNum"> 749 </span> : : //next = std::next(it);, next = std::next(it) =&gt; it++</a>
<a name="750"><span class="lineNum"> 750 </span> : : </a>
<a name="751"><span class="lineNum"> 751 </span> :<span class="lineCov"> 20 : int ix = it-&gt;pos.x;</span></a>
<a name="752"><span class="lineNum"> 752 </span> :<span class="lineCov"> 20 : int iy = it-&gt;pos.y;</span></a>
<a name="753"><span class="lineNum"> 753 </span> : : </a>
<a name="754"><span class="lineNum"> 754 </span> [<span class="branchCov" title="Branch 0 was taken 15 times"> + </span><span class="branchCov" title="Branch 1 was taken 5 times"> + </span><span class="branchCov" title="Branch 2 was taken 14 times"> + </span><span class="branchCov" title="Branch 3 was taken 1 time"> + </span>]:<span class="lineCov"> 20 : if (ix == ux &amp;&amp; iy == uy) {</span></a>
<a name="755"><span class="lineNum"> 755 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span><span class="branchCov" title="Branch 2 was taken 2 times"> + </span><span class="branchCov" title="Branch 3 was taken 2 times"> + </span> :<span class="lineCov"> 14 : switch (it-&gt;kind) {</span></a>
<span class="lineNum"> </span> <span class="branchCov" title="Branch 4 was taken 4 times"> + </span><span class="branchCov" title="Branch 5 was taken 1 time"> + </span>]
<a name="756"><span class="lineNum"> 756 </span> :<span class="lineCov"> 2 : case ITEM_MAGAZINE: {</span></a>
<a name="757"><span class="lineNum"> 757 </span> :<span class="lineCov"> 2 : battles[bid].users[uid].energy += BULLETS_PER_MAGAZINE;</span></a>
<a name="758"><span class="lineNum"> 758 </span> : : //log(&quot;user #%d %s\033[2m(%s)\033[0m is got magazine&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</a>
<a name="759"><span class="lineNum"> 759 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (battles[bid].users[uid].energy &gt; MAX_BULLETS) {</span></a>
<a name="760"><span class="lineNum"> 760 </span> : : //log(&quot;user #%d %s\033[2m(%s)\033[0m 's bullets exceeds max value&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</a>
<a name="761"><span class="lineNum"> 761 </span> :<span class="lineCov"> 1 : battles[bid].users[uid].energy = MAX_BULLETS;</span></a>
<a name="762"><span class="lineNum"> 762 </span> : : }</a>
<a name="763"><span class="lineNum"> 763 </span> : : //send_to_client(uid, SERVER_MESSAGE_YOU_GOT_MAGAZINE);</a>
<a name="764"><span class="lineNum"> 764 </span> :<span class="lineCov"> 2 : it = items.erase(it);</span></a>
<a name="765"><span class="lineNum"> 765 </span> : : //log(&quot;current item size: %ld&quot;, items.size());</a>
<a name="766"><span class="lineNum"> 766 </span> :<span class="lineCov"> 2 : break;</span></a>
<a name="767"><span class="lineNum"> 767 </span> : : }</a>
<a name="768"><span class="lineNum"> 768 </span> :<span class="lineCov"> 3 : case ITEM_MAGMA: {</span></a>
<a name="769"><span class="lineNum"> 769 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (it-&gt;owner != uid) {</span></a>
<a name="770"><span class="lineNum"> 770 </span> :<span class="lineCov"> 2 : battles[bid].users[uid].life = max(battles[bid].users[uid].life - 1, 0);</span></a>
<a name="771"><span class="lineNum"> 771 </span> :<span class="lineCov"> 2 : battles[bid].users[uid].killby = it-&gt;owner;</span></a>
<a name="772"><span class="lineNum"> 772 </span> :<span class="lineCov"> 2 : it-&gt;count--;</span></a>
<a name="773"><span class="lineNum"> 773 </span> : : //log(&quot;user #%d %s\033[2m(%s)\033[0m is trapped in magma&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</a>
<a name="774"><span class="lineNum"> 774 </span> : : //send_to_client(uid, SERVER_MESSAGE_YOU_ARE_TRAPPED_IN_MAGMA);</a>
<a name="775"><span class="lineNum"> 775 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (it-&gt;count &lt;= 0) {</span></a>
<a name="776"><span class="lineNum"> 776 </span> : : //log(&quot;magma #%d is exhausted&quot;, it-&gt;id);</a>
<a name="777"><span class="lineNum"> 777 </span> :<span class="lineCov"> 1 : battles[bid].num_of_other--;</span></a>
<a name="778"><span class="lineNum"> 778 </span> :<span class="lineCov"> 1 : it = items.erase(it);</span></a>
<a name="779"><span class="lineNum"> 779 </span> : : //log(&quot;current item size: %ld&quot;, items.size());</a>
<a name="780"><span class="lineNum"> 780 </span> : : }</a>
<a name="781"><span class="lineNum"> 781 </span> : : }</a>
<a name="782"><span class="lineNum"> 782 </span> :<span class="lineCov"> 3 : break;</span></a>
<a name="783"><span class="lineNum"> 783 </span> : : }</a>
<a name="784"><span class="lineNum"> 784 </span> :<span class="lineCov"> 2 : case ITEM_BLOOD_VIAL: {</span></a>
<a name="785"><span class="lineNum"> 785 </span> :<span class="lineCov"> 2 : battles[bid].users[uid].life += LIFE_PER_VIAL;</span></a>
<a name="786"><span class="lineNum"> 786 </span> : : //log(&quot;user #%d %s\033[2m(%s)\033[0m got blood vial&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</a>
<a name="787"><span class="lineNum"> 787 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (battles[bid].users[uid].life &gt; MAX_LIFE) {</span></a>
<a name="788"><span class="lineNum"> 788 </span> : : //log(&quot;user #%d %s\033[2m(%s)\033[0m life exceeds max value&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</a>
<a name="789"><span class="lineNum"> 789 </span> :<span class="lineCov"> 1 : battles[bid].users[uid].life = MAX_LIFE;</span></a>
<a name="790"><span class="lineNum"> 790 </span> : : }</a>
<a name="791"><span class="lineNum"> 791 </span> : : //log(&quot;current item size: %ld&quot;, items.size());</a>
<a name="792"><span class="lineNum"> 792 </span> :<span class="lineCov"> 2 : battles[bid].num_of_other--;</span></a>
<a name="793"><span class="lineNum"> 793 </span> : : //send_to_client(uid, SERVER_MESSAGE_YOU_GOT_BLOOD_VIAL);</a>
<a name="794"><span class="lineNum"> 794 </span> :<span class="lineCov"> 2 : it = items.erase(it);</span></a>
<a name="795"><span class="lineNum"> 795 </span> :<span class="lineCov"> 2 : break;</span></a>
<a name="796"><span class="lineNum"> 796 </span> : : }</a>
<a name="797"><span class="lineNum"> 797 </span> :<span class="lineCov"> 2 : case ITEM_BULLET: {</span></a>
<a name="798"><span class="lineNum"> 798 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (it-&gt;owner != uid) {</span></a>
<a name="799"><span class="lineNum"> 799 </span> :<span class="lineCov"> 1 : battles[bid].users[uid].life = max(battles[bid].users[uid].life - 1, 0);</span></a>
<a name="800"><span class="lineNum"> 800 </span> :<span class="lineCov"> 1 : battles[bid].users[uid].killby = it-&gt;owner;</span></a>
<a name="801"><span class="lineNum"> 801 </span> : : //log(&quot;user #%d %s\033[2m(%s)\033[0m is shooted&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</a>
<a name="802"><span class="lineNum"> 802 </span> : : //log(&quot;current item size: %ld&quot;, items.size());</a>
<a name="803"><span class="lineNum"> 803 </span> : : //send_to_client(uid, SERVER_MESSAGE_YOU_ARE_SHOOTED);</a>
<a name="804"><span class="lineNum"> 804 </span> :<span class="lineCov"> 1 : it = items.erase(it);</span></a>
<a name="805"><span class="lineNum"> 805 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="806"><span class="lineNum"> 806 </span> : : }</a>
<a name="807"><span class="lineNum"> 807 </span> :<span class="lineCov"> 1 : break;</span></a>
<a name="808"><span class="lineNum"> 808 </span> : : }</a>
<a name="809"><span class="lineNum"> 809 </span> :<span class="lineCov"> 4 : case ITEM_LANDMINE: {</span></a>
<a name="810"><span class="lineNum"> 810 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 4 : if (it-&gt;owner != uid) {</span></a>
<a name="811"><span class="lineNum"> 811 </span> :<span class="lineCov"> 2 : it-&gt;time = battles[bid].global_time;</span></a>
<a name="812"><span class="lineNum"> 812 </span> :<span class="lineCov"> 2 : forced_generate_items(bid, ix, iy, ITEM_MAGMA, 7, it-&gt;owner);</span></a>
<a name="813"><span class="lineNum"> 813 </span> :<span class="lineCov"> 2 : forced_generate_items(bid, ix - 1, iy, ITEM_MAGMA, 7, it-&gt;owner);</span></a>
<a name="814"><span class="lineNum"> 814 </span> :<span class="lineCov"> 2 : forced_generate_items(bid, ix + 1, iy, ITEM_MAGMA, 7, it-&gt;owner);</span></a>
<a name="815"><span class="lineNum"> 815 </span> :<span class="lineCov"> 2 : forced_generate_items(bid, ix, iy - 1, ITEM_MAGMA, 7, it-&gt;owner);</span></a>
<a name="816"><span class="lineNum"> 816 </span> :<span class="lineCov"> 2 : forced_generate_items(bid, ix, iy + 1, ITEM_MAGMA, 7, it-&gt;owner);</span></a>
<a name="817"><span class="lineNum"> 817 </span> : : }</a>
<a name="818"><span class="lineNum"> 818 </span> :<span class="lineCov"> 4 : break;</span></a>
<a name="819"><span class="lineNum"> 819 </span> : : }</a>
<a name="820"><span class="lineNum"> 820 </span> : : }</a>
<a name="821"><span class="lineNum"> 821 </span> : : }</a>
<a name="822"><span class="lineNum"> 822 </span> : : }</a>
<a name="823"><span class="lineNum"> 823 </span> : : //auto end_time = myclock();</a>
<a name="824"><span class="lineNum"> 824 </span> : : //log(&quot;completed.&quot;);</a>
<a name="825"><span class="lineNum"> 825 </span> : : }</a>
<a name="826"><span class="lineNum"> 826 </span> : : </a>
<a name="827"><span class="lineNum"> 827 </span> :<span class="lineCov"> 3503 : void check_all_user_status(int bid) {</span></a>
<a name="828"><span class="lineNum"> 828 </span> : : //for (int i = 0; i &lt; MAX_ITEM; i++) {</a>
<a name="829"><span class="lineNum"> 829 </span> : : //log(&quot;checking...&quot;);</a>
<a name="830"><span class="lineNum"> 830 </span> : : //log(&quot;completed.&quot;);</a>
<a name="831"><span class="lineNum"> 831 </span> [<span class="branchCov" title="Branch 0 was taken 49042 times"> + </span><span class="branchCov" title="Branch 1 was taken 3503 times"> + </span>]:<span class="lineCov"> 52545 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="832"><span class="lineNum"> 832 </span> [<span class="branchCov" title="Branch 0 was taken 39463 times"> + </span><span class="branchCov" title="Branch 1 was taken 9579 times"> + </span>]:<span class="lineCov"> 49042 : if (battles[bid].users[i].battle_state != BATTLE_STATE_LIVE) continue;</span></a>
<a name="833"><span class="lineNum"> 833 </span> :<span class="lineCov"> 9579 : check_user_status(i);</span></a>
<a name="834"><span class="lineNum"> 834 </span> : : }</a>
<a name="835"><span class="lineNum"> 835 </span> :<span class="lineCov"> 3503 : }</span></a>
<a name="836"><span class="lineNum"> 836 </span> : : </a>
<a name="837"><span class="lineNum"> 837 </span> :<span class="lineCov"> 5 : void check_who_is_dead(int bid) {</span></a>
<a name="838"><span class="lineNum"> 838 </span> [<span class="branchCov" title="Branch 0 was taken 70 times"> + </span><span class="branchCov" title="Branch 1 was taken 5 times"> + </span>]:<span class="lineCov"> 75 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="839"><span class="lineNum"> 839 </span> [<span class="branchCov" title="Branch 0 was taken 8 times"> + </span><span class="branchCov" title="Branch 1 was taken 62 times"> + </span>]:<span class="lineCov"> 70 : if (battles[bid].users[i].battle_state == BATTLE_STATE_LIVE</span></a>
<a name="840"><span class="lineNum"> 840 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 5 times"> + </span>]:<span class="lineCov"> 8 : &amp;&amp; battles[bid].users[i].life &lt;= 0) {</span></a>
<a name="841"><span class="lineNum"> 841 </span> :<span class="lineCov"> 3 : log(&quot;user #%d %s\033[2m(%s)\033[0m is dead&quot;, i, sessions[i].user_name, sessions[i].ip_addr);</span></a>
<a name="842"><span class="lineNum"> 842 </span> :<span class="lineCov"> 3 : battles[bid].users[i].battle_state = BATTLE_STATE_DEAD;</span></a>
<a name="843"><span class="lineNum"> 843 </span> :<span class="lineCov"> 3 : battles[bid].alive_users--;</span></a>
<a name="844"><span class="lineNum"> 844 </span> :<span class="lineCov"> 3 : log(&quot;send dead info to user #%d %s\033[2m(%s)\033[0m&quot;, i, sessions[i].user_name, sessions[i].ip_addr);</span></a>
<a name="845"><span class="lineNum"> 845 </span> :<span class="lineCov"> 3 : send_to_client(i, SERVER_MESSAGE_YOU_ARE_DEAD);</span></a>
<a name="846"><span class="lineNum"> 846 </span> :<span class="lineCov"> 3 : sessions[i].death++;</span></a>
<a name="847"><span class="lineNum"> 847 </span> :<span class="lineCov"> 3 : log(&quot;death of user #%d %s\033[2m(%s)\033[0m: %d&quot;, i, sessions[i].user_name, sessions[i].ip_addr, sessions[i].death);</span></a>
<a name="848"><span class="lineNum"> 848 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (battles[bid].users[i].killby != -1) {</span></a>
<a name="849"><span class="lineNum"> 849 </span> :<span class="lineCov"> 2 : int by = battles[bid].users[i].killby;</span></a>
<a name="850"><span class="lineNum"> 850 </span> :<span class="lineCov"> 2 : sessions[by].kill++;</span></a>
<a name="851"><span class="lineNum"> 851 </span> :<span class="lineCov"> 2 : log(&quot;kill of user #%d %s\033[2m(%s)\033[0m: %d&quot;, i, sessions[by].user_name, sessions[by].ip_addr, sessions[by].kill);</span></a>
<a name="852"><span class="lineNum"> 852 </span> :<span class="lineCov"> 2 : double delta = (double)sessions[i].score / sessions[by].score;</span></a>
<a name="853"><span class="lineNum"> 853 </span> :<span class="lineCov"> 2 : delta = delta * delta;</span></a>
<a name="854"><span class="lineNum"> 854 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (delta &gt; 4) delta = 4;</span></a>
<a name="855"><span class="lineNum"> 855 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (delta &lt; 0.2) delta = 0.2;</span></a>
<a name="856"><span class="lineNum"> 856 </span> :<span class="lineCov"> 2 : int d = min(round(5. * delta), sessions[i].score);</span></a>
<a name="857"><span class="lineNum"> 857 </span> :<span class="lineCov"> 2 : sessions[i].score -= d;</span></a>
<a name="858"><span class="lineNum"> 858 </span> :<span class="lineCov"> 2 : sessions[by].score += d;</span></a>
<a name="859"><span class="lineNum"> 859 </span> :<span class="lineCov"> 2 : battles[bid].users[by].energy += battles[bid].users[i].energy;</span></a>
<a name="860"><span class="lineNum"> 860 </span> : : } else {</a>
<a name="861"><span class="lineNum"> 861 </span> :<span class="lineCov"> 1 : sessions[i].score = max(sessions[i].score - 5, 0);</span></a>
<a name="862"><span class="lineNum"> 862 </span> :<span class="lineCov"> 3 : }</span></a>
<a name="863"><span class="lineNum"> 863 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 66 times"> + </span>]:<span class="lineCov"> 67 : } else if (battles[bid].users[i].battle_state == BATTLE_STATE_DEAD) {</span></a>
<a name="864"><span class="lineNum"> 864 </span> :<span class="lineCov"> 1 : battles[bid].users[i].battle_state = BATTLE_STATE_WITNESS;</span></a>
<a name="865"><span class="lineNum"> 865 </span> :<span class="lineCov"> 1 : battles[bid].users[i].energy = 0;</span></a>
<a name="866"><span class="lineNum"> 866 </span> :<span class="lineCov"> 1 : battles[bid].users[i].life = 0;</span></a>
<a name="867"><span class="lineNum"> 867 </span> : : }</a>
<a name="868"><span class="lineNum"> 868 </span> : : }</a>
<a name="869"><span class="lineNum"> 869 </span> :<span class="lineCov"> 5 : }</span></a>
<a name="870"><span class="lineNum"> 870 </span> : : </a>
<a name="871"><span class="lineNum"> 871 </span> :<span class="lineCov"> 3502 : void clear_items(int bid) {</span></a>
<a name="872"><span class="lineNum"> 872 </span> : : //log(&quot;call func %s&quot;, __func__);</a>
<a name="873"><span class="lineNum"> 873 </span> : : //for (int i = 0; i &lt; MAX_ITEM; i++) {</a>
<a name="874"><span class="lineNum"> 874 </span> : : // if (battles[bid].items[i].times) {</a>
<a name="875"><span class="lineNum"> 875 </span> : : // battles[bid].items[i].times--;</a>
<a name="876"><span class="lineNum"> 876 </span> : : // if (!battles[bid].items[i].times) {</a>
<a name="877"><span class="lineNum"> 877 </span> : : // log(&quot;free item #%d&quot;, i);</a>
<a name="878"><span class="lineNum"> 878 </span> : : // battles[bid].items[i].is_used = false;</a>
<a name="879"><span class="lineNum"> 879 </span> : : // if (battles[bid].items[i].kind &lt; ITEM_END) {</a>
<a name="880"><span class="lineNum"> 880 </span> : : // battles[bid].num_of_other--;</a>
<a name="881"><span class="lineNum"> 881 </span> : : // }</a>
<a name="882"><span class="lineNum"> 882 </span> : : // //battles[bid].items[i].kind = ITEM_BLANK;</a>
<a name="883"><span class="lineNum"> 883 </span> : : // }</a>
<a name="884"><span class="lineNum"> 884 </span> : : // }</a>
<a name="885"><span class="lineNum"> 885 </span> : : //}</a>
<a name="886"><span class="lineNum"> 886 </span> : : //log(&quot;check completed...&quot;);</a>
<a name="887"><span class="lineNum"> 887 </span> :<span class="lineCov"> 3502 : auto&amp; items = battles[bid].items;</span></a>
<a name="888"><span class="lineNum"> 888 </span> :<span class="lineCov"> 3502 : size_t cnt[ITEM_SIZE] = {0};</span></a>
<a name="889"><span class="lineNum"> 889 </span> : : // 有修改 可能会有bug</a>
<a name="890"><span class="lineNum"> 890 </span> [<span class="branchCov" title="Branch 0 was taken 4 times"> + </span><span class="branchCov" title="Branch 1 was taken 3502 times"> + </span>]:<span class="lineCov"> 3506 : for (auto cur = items.begin(); cur != items.end(); cur++) {</span></a>
<a name="891"><span class="lineNum"> 891 </span> : : //next = std::next(cur); , next = std::next(cur)</a>
<a name="892"><span class="lineNum"> 892 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 4 : if (cur-&gt;time &lt;= battles[bid].global_time) {</span></a>
<a name="893"><span class="lineNum"> 893 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : if (cur-&gt;kind &lt; ITEM_END) {</span></a>
<a name="894"><span class="lineNum"> 894 </span> :<span class="lineCov"> 1 : battles[bid].num_of_other--;</span></a>
<a name="895"><span class="lineNum"> 895 </span> : : }</a>
<a name="896"><span class="lineNum"> 896 </span> :<span class="lineCov"> 3 : cnt[cur-&gt;kind]++;</span></a>
<a name="897"><span class="lineNum"> 897 </span> : : //next = battles[bid].items.erase(cur);</a>
<a name="898"><span class="lineNum"> 898 </span> :<span class="lineCov"> 3 : cur = battles[bid].items.erase(cur);</span></a>
<a name="899"><span class="lineNum"> 899 </span> : : }</a>
<a name="900"><span class="lineNum"> 900 </span> : : }</a>
<a name="901"><span class="lineNum"> 901 </span> : : //int cleared = 0;</a>
<a name="902"><span class="lineNum"> 902 </span> [<span class="branchCov" title="Branch 0 was taken 28016 times"> + </span><span class="branchCov" title="Branch 1 was taken 3502 times"> + </span>]:<span class="lineCov"> 31518 : for (int i = 0; i &lt; ITEM_SIZE; i++) {</span></a>
<a name="903"><span class="lineNum"> 903 </span> : : if (cnt[i]) {</a>
<a name="904"><span class="lineNum"> 904 </span> : : //log(&quot;clear %ld %s(s)&quot;, cnt[i], item_s[i]);</a>
<a name="905"><span class="lineNum"> 905 </span> : : //cleared = 1;</a>
<a name="906"><span class="lineNum"> 906 </span> : : }</a>
<a name="907"><span class="lineNum"> 907 </span> : : }</a>
<a name="908"><span class="lineNum"> 908 </span> : : //if (cleared) log(&quot;current item size: %ld&quot;, items.size());</a>
<a name="909"><span class="lineNum"> 909 </span> :<span class="lineCov"> 3502 : }</span></a>
<a name="910"><span class="lineNum"> 910 </span> : : </a>
<a name="911"><span class="lineNum"> 911 </span> :<span class="lineCov"> 9584 : void render_map_for_user(int uid, server_message_t* psm) {</span></a>
<a name="912"><span class="lineNum"> 912 </span> :<span class="lineCov"> 9584 : int bid = sessions[uid].bid;</span></a>
<a name="913"><span class="lineNum"> 913 </span> :<span class="lineCov"> 9584 : int map[BATTLE_H][BATTLE_W] = {0};</span></a>
<a name="914"><span class="lineNum"> 914 </span> : : int cur, x, y;</a>
<a name="915"><span class="lineNum"> 915 </span> : : //for (int i = 0, x, y; i &lt; MAX_ITEM; i++) {</a>
<a name="916"><span class="lineNum"> 916 </span> [<span class="branchCov" title="Branch 0 was taken 11 times"> + </span><span class="branchCov" title="Branch 1 was taken 9584 times"> + </span>]:<span class="lineCov"> 9595 : for (auto it : battles[bid].items) {</span></a>
<a name="917"><span class="lineNum"> 917 </span> :<span class="lineCov"> 11 : x = it.pos.x;</span></a>
<a name="918"><span class="lineNum"> 918 </span> :<span class="lineCov"> 11 : y = it.pos.y;</span></a>
<a name="919"><span class="lineNum"> 919 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 8 times"> + </span><span class="branchCov" title="Branch 2 was taken 1 time"> + </span>]:<span class="lineCov"> 11 : switch (it.kind) {</span></a>
<a name="920"><span class="lineNum"> 920 </span> :<span class="lineCov"> 2 : case ITEM_BULLET: {</span></a>
<a name="921"><span class="lineNum"> 921 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (it.owner == uid) {</span></a>
<a name="922"><span class="lineNum"> 922 </span> :<span class="lineCov"> 1 : map[y][x] = max(map[y][x], MAP_ITEM_MY_BULLET);</span></a>
<a name="923"><span class="lineNum"> 923 </span> : : } else {</a>
<a name="924"><span class="lineNum"> 924 </span> :<span class="lineCov"> 1 : map[y][x] = max(map[y][x], MAP_ITEM_OTHER_BULLET);</span></a>
<a name="925"><span class="lineNum"> 925 </span> : : }</a>
<a name="926"><span class="lineNum"> 926 </span> :<span class="lineCov"> 2 : break;</span></a>
<a name="927"><span class="lineNum"> 927 </span> : : }</a>
<a name="928"><span class="lineNum"> 928 </span> :<span class="lineCov"> 8 : case ITEM_LANDMINE: {</span></a>
<a name="929"><span class="lineNum"> 929 </span> [<span class="branchCov" title="Branch 0 was taken 5 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 8 : if (it.owner != uid) break;</span></a>
<a name="930"><span class="lineNum"> 930 </span> :<span class="lineCov"> 3 : map[y][x] = max(map[y][x], item_to_map[ITEM_LANDMINE]);</span></a>
<a name="931"><span class="lineNum"> 931 </span> : : }</a>
<a name="932"><span class="lineNum"> 932 </span> :<span class="lineCov"> 4 : default: {</span></a>
<a name="933"><span class="lineNum"> 933 </span> :<span class="lineCov"> 4 : cur = item_to_map[it.kind];</span></a>
<a name="934"><span class="lineNum"> 934 </span> :<span class="lineCov"> 4 : map[y][x] = max(map[y][x], cur);</span></a>
<a name="935"><span class="lineNum"> 935 </span> : : }</a>
<a name="936"><span class="lineNum"> 936 </span> : : }</a>
<a name="937"><span class="lineNum"> 937 </span> : : //sm.item_kind[i] = it.kind;</a>
<a name="938"><span class="lineNum"> 938 </span> : : //sm.item_pos[i].x = it.pos.x;</a>
<a name="939"><span class="lineNum"> 939 </span> : : //sm.item_pos[i].y = it.pos.y;</a>
<a name="940"><span class="lineNum"> 940 </span> : : }</a>
<a name="941"><span class="lineNum"> 941 </span> [<span class="branchCov" title="Branch 0 was taken 201227 times"> + </span><span class="branchCov" title="Branch 1 was taken 9584 times"> + </span>]:<span class="lineCov"> 210811 : for (int i = 0; i &lt; BATTLE_H; i++) {</span></a>
<a name="942"><span class="lineNum"> 942 </span> [<span class="branchCov" title="Branch 0 was taken 6036750 times"> + </span><span class="branchCov" title="Branch 1 was taken 201227 times"> + </span>]:<span class="lineCov"> 6237980 : for (int j = 0; j &lt; BATTLE_W; j += 2) {</span></a>
<a name="943"><span class="lineNum"> 943 </span> : : //psm-&gt;map[i][j] = map[i][j];</a>
<a name="944"><span class="lineNum"> 944 </span> : : //if (psm-&gt;map[i][j] != 0) log(&quot;set item #%d&quot;, psm-&gt;map[i][j]);</a>
<a name="945"><span class="lineNum"> 945 </span> :<span class="lineCov"> 6036750 : psm-&gt;map[i][j &gt;&gt; 1] = (map[i][j]) | (map[i][j + 1] &lt;&lt; 4);</span></a>
<a name="946"><span class="lineNum"> 946 </span> : : }</a>
<a name="947"><span class="lineNum"> 947 </span> : : }</a>
<a name="948"><span class="lineNum"> 948 </span> :<span class="lineCov"> 9584 : }</span></a>
<a name="949"><span class="lineNum"> 949 </span> : : </a>
<a name="950"><span class="lineNum"> 950 </span> :<span class="lineCov"> 366 : void inform_all_user_battle_player(int bid) {</span></a>
<a name="951"><span class="lineNum"> 951 </span> : : server_message_t sm;</a>
<a name="952"><span class="lineNum"> 952 </span> :<span class="lineCov"> 366 : sm.message = SERVER_MESSAGE_BATTLE_PLAYER;</span></a>
<a name="953"><span class="lineNum"> 953 </span> [<span class="branchCov" title="Branch 0 was taken 5124 times"> + </span><span class="branchCov" title="Branch 1 was taken 366 times"> + </span>]:<span class="lineCov"> 5490 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="954"><span class="lineNum"> 954 </span> [<span class="branchCov" title="Branch 0 was taken 1005 times"> + </span><span class="branchCov" title="Branch 1 was taken 4119 times"> + </span>]:<span class="lineCov"> 5124 : if (battles[bid].users[i].battle_state == BATTLE_STATE_LIVE &amp;&amp;</span></a>
<a name="955"><span class="lineNum"> 955 </span> [<span class="branchCov" title="Branch 0 was taken 671 times"> + </span><span class="branchCov" title="Branch 1 was taken 334 times"> + </span>]:<span class="lineCov"> 1005 : battles[bid].users[i].life &gt; 0) {</span></a>
<a name="956"><span class="lineNum"> 956 </span> :<span class="lineCov"> 671 : strncpy(sm.users[i].name, sessions[i].user_name, USERNAME_SIZE - 1);</span></a>
<a name="957"><span class="lineNum"> 957 </span> :<span class="lineCov"> 671 : sm.users[i].namecolor = i % color_s_size + 1;</span></a>
<a name="958"><span class="lineNum"> 958 </span> :<span class="lineCov"> 671 : sm.users[i].life = battles[bid].users[i].life;</span></a>
<a name="959"><span class="lineNum"> 959 </span> :<span class="lineCov"> 671 : sm.users[i].score = sessions[i].score;</span></a>
<a name="960"><span class="lineNum"> 960 </span> :<span class="lineCov"> 671 : sm.users[i].death = sessions[i].death;</span></a>
<a name="961"><span class="lineNum"> 961 </span> :<span class="lineCov"> 671 : sm.users[i].kill = sessions[i].kill;</span></a>
<a name="962"><span class="lineNum"> 962 </span> : : } else {</a>
<a name="963"><span class="lineNum"> 963 </span> :<span class="lineCov"> 4453 : strcpy(sm.users[i].name, (char*)&quot;&quot;);</span></a>
<a name="964"><span class="lineNum"> 964 </span> :<span class="lineCov"> 4453 : sm.users[i].namecolor = 0;</span></a>
<a name="965"><span class="lineNum"> 965 </span> :<span class="lineCov"> 4453 : sm.users[i].life = 0;</span></a>
<a name="966"><span class="lineNum"> 966 </span> :<span class="lineCov"> 4453 : sm.users[i].score = 0;</span></a>
<a name="967"><span class="lineNum"> 967 </span> :<span class="lineCov"> 4453 : sm.users[i].death = 0;</span></a>
<a name="968"><span class="lineNum"> 968 </span> :<span class="lineCov"> 4453 : sm.users[i].kill = 0;</span></a>
<a name="969"><span class="lineNum"> 969 </span> : : }</a>
<a name="970"><span class="lineNum"> 970 </span> : : }</a>
<a name="971"><span class="lineNum"> 971 </span> [<span class="branchCov" title="Branch 0 was taken 5124 times"> + </span><span class="branchCov" title="Branch 1 was taken 366 times"> + </span>]:<span class="lineCov"> 5490 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="972"><span class="lineNum"> 972 </span> [<span class="branchCov" title="Branch 0 was taken 33306 times"> + </span><span class="branchCov" title="Branch 1 was taken 5124 times"> + </span>]:<span class="lineCov"> 38430 : for (int j = i + 1; j &lt; USER_CNT; j++) {</span></a>
<a name="973"><span class="lineNum"> 973 </span> [<span class="branchCov" title="Branch 0 was taken 41 times"> + </span><span class="branchCov" title="Branch 1 was taken 33265 times"> + </span>]:<span class="lineCov"> 33306 : if (sm.users[i].score &lt; sm.users[j].score) {</span></a>
<a name="974"><span class="lineNum"> 974 </span> :<span class="lineCov"> 41 : std::swap(sm.users[i], sm.users[j]);</span></a>
<a name="975"><span class="lineNum"> 975 </span> : : }</a>
<a name="976"><span class="lineNum"> 976 </span> : : }</a>
<a name="977"><span class="lineNum"> 977 </span> : : }</a>
<a name="978"><span class="lineNum"> 978 </span> [<span class="branchCov" title="Branch 0 was taken 5124 times"> + </span><span class="branchCov" title="Branch 1 was taken 366 times"> + </span>]:<span class="lineCov"> 5490 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="979"><span class="lineNum"> 979 </span> : : if (battles[bid].users[i].battle_state != BATTLE_STATE_UNJOINED) {</a>
<a name="980"><span class="lineNum"> 980 </span> : : //wrap_send(sessions[i].conn, &amp;sm);</a>
<a name="981"><span class="lineNum"> 981 </span> : : //log(&quot;inform user #%d %s\033[2m(%s)\033[0m&quot;, i, sessions[i].user_name, sessions[i].ip_addr);</a>
<a name="982"><span class="lineNum"> 982 </span> : : }</a>
<a name="983"><span class="lineNum"> 983 </span> : : }</a>
<a name="984"><span class="lineNum"> 984 </span> :<span class="lineCov"> 366 : }</span></a>
<a name="985"><span class="lineNum"> 985 </span> : : </a>
<a name="986"><span class="lineNum"> 986 </span> :<span class="lineCov"> 3503 : void inform_all_user_battle_state(int bid) {</span></a>
<a name="987"><span class="lineNum"> 987 </span> : : server_message_t sm;</a>
<a name="988"><span class="lineNum"> 988 </span> :<span class="lineCov"> 3503 : sm.message = SERVER_MESSAGE_BATTLE_INFORMATION;</span></a>
<a name="989"><span class="lineNum"> 989 </span> [<span class="branchCov" title="Branch 0 was taken 49042 times"> + </span><span class="branchCov" title="Branch 1 was taken 3503 times"> + </span>]:<span class="lineCov"> 52545 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="990"><span class="lineNum"> 990 </span> [<span class="branchCov" title="Branch 0 was taken 9581 times"> + </span><span class="branchCov" title="Branch 1 was taken 39461 times"> + </span>]:<span class="lineCov"> 49042 : if (battles[bid].users[i].battle_state == BATTLE_STATE_LIVE) {</span></a>
<a name="991"><span class="lineNum"> 991 </span> :<span class="lineCov"> 9581 : sm.user_pos[i].x = battles[bid].users[i].pos.x;</span></a>
<a name="992"><span class="lineNum"> 992 </span> :<span class="lineCov"> 9581 : sm.user_pos[i].y = battles[bid].users[i].pos.y;</span></a>
<a name="993"><span class="lineNum"> 993 </span> :<span class="lineCov"> 9581 : sm.user_color[i] = i % color_s_size + 1;</span></a>
<a name="994"><span class="lineNum"> 994 </span> : : } else {</a>
<a name="995"><span class="lineNum"> 995 </span> :<span class="lineCov"> 39461 : sm.user_pos[i].x = -1;</span></a>
<a name="996"><span class="lineNum"> 996 </span> :<span class="lineCov"> 39461 : sm.user_pos[i].y = -1;</span></a>
<a name="997"><span class="lineNum"> 997 </span> :<span class="lineCov"> 39461 : sm.user_color[i] = 0;</span></a>
<a name="998"><span class="lineNum"> 998 </span> : : }</a>
<a name="999"><span class="lineNum"> 999 </span> : : }</a>
<a name="1000"><span class="lineNum"> 1000 </span> : : </a>
<a name="1001"><span class="lineNum"> 1001 </span> [<span class="branchCov" title="Branch 0 was taken 49007 times"> + </span><span class="branchCov" title="Branch 1 was taken 3500 times"> + </span>]:<span class="lineCov"> 52507 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1002"><span class="lineNum"> 1002 </span> [<span class="branchCov" title="Branch 0 was taken 9579 times"> + </span><span class="branchCov" title="Branch 1 was taken 39428 times"> + </span>]:<span class="lineCov"> 49007 : if (battles[bid].users[i].battle_state != BATTLE_STATE_UNJOINED) {</span></a>
<a name="1003"><span class="lineNum"> 1003 </span> :<span class="lineCov"> 9579 : render_map_for_user(i, &amp;sm);</span></a>
<a name="1004"><span class="lineNum"> 1004 </span> :<span class="lineCov"> 9576 : sm.index = i;</span></a>
<a name="1005"><span class="lineNum"> 1005 </span> :<span class="lineCov"> 9576 : sm.life = battles[bid].users[i].life;</span></a>
<a name="1006"><span class="lineNum"> 1006 </span> :<span class="lineCov"> 9576 : sm.bullets_num = battles[bid].users[i].energy;</span></a>
<a name="1007"><span class="lineNum"> 1007 </span> :<span class="lineCov"> 9576 : sm.color = i % color_s_size + 1;</span></a>
<a name="1008"><span class="lineNum"> 1008 </span> : : //wrap_send(sessions[i].conn, &amp;sm);</a>
<a name="1009"><span class="lineNum"> 1009 </span> : : }</a>
<a name="1010"><span class="lineNum"> 1010 </span> : : }</a>
<a name="1011"><span class="lineNum"> 1011 </span> :<span class="lineCov"> 3500 : }</span></a>
<a name="1012"><span class="lineNum"> 1012 </span> : : </a>
<a name="1013"><span class="lineNum"> 1013 </span> :<span class="lineCov"> 6 : void* battle_ruler(void* args) {</span></a>
<a name="1014"><span class="lineNum"> 1014 </span> :<span class="lineCov"> 6 : int bid = (int)(uintptr_t)args;</span></a>
<a name="1015"><span class="lineNum"> 1015 </span> : : //log(&quot;battle ruler for battle #%d&quot;, bid);</a>
<a name="1016"><span class="lineNum"> 1016 </span> : : // FIXME: battle re-alloced before exiting loop </a>
<a name="1017"><span class="lineNum"> 1017 </span> [<span class="branchCov" title="Branch 0 was taken 30 times"> + </span><span class="branchCov" title="Branch 1 was taken 6 times"> + </span>]:<span class="lineCov"> 36 : for (int i = 0; i &lt; INIT_GRASS; i++) {</span></a>
<a name="1018"><span class="lineNum"> 1018 </span> :<span class="lineCov"> 60 : forced_generate_items(bid,</span></a>
<a name="1019"><span class="lineNum"> 1019 </span> :<span class="lineCov"> 30 : (rand() &amp; 0x7FFF) % BATTLE_W,</span></a>
<a name="1020"><span class="lineNum"> 1020 </span> :<span class="lineCov"> 30 : (rand() &amp; 0x7FFF) % BATTLE_H,</span></a>
<a name="1021"><span class="lineNum"> 1021 </span> : : ITEM_GRASS,</a>
<a name="1022"><span class="lineNum"> 1022 </span> : : 10000);</a>
<a name="1023"><span class="lineNum"> 1023 </span> : : }</a>
<a name="1024"><span class="lineNum"> 1024 </span> : : uint64_t t[2];</a>
<a name="1025"><span class="lineNum"> 1025 </span> [<span class="branchCov" title="Branch 0 was taken 3502 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 3505 : while (battles[bid].is_alloced) {</span></a>
<a name="1026"><span class="lineNum"> 1026 </span> :<span class="lineCov"> 3502 : battles[bid].global_time++;</span></a>
<a name="1027"><span class="lineNum"> 1027 </span> :<span class="lineCov"> 3502 : t[0] = myclock();</span></a>
<a name="1028"><span class="lineNum"> 1028 </span> :<span class="lineCov"> 3502 : move_bullets(bid);</span></a>
<a name="1029"><span class="lineNum"> 1029 </span> :<span class="lineCov"> 3502 : check_all_user_status(bid);</span></a>
<a name="1030"><span class="lineNum"> 1030 </span> : : //check_who_is_dead(bid);</a>
<a name="1031"><span class="lineNum"> 1031 </span> :<span class="lineCov"> 3502 : inform_all_user_battle_state(bid);</span></a>
<a name="1032"><span class="lineNum"> 1032 </span> : : </a>
<a name="1033"><span class="lineNum"> 1033 </span> [<span class="branchCov" title="Branch 0 was taken 364 times"> + </span><span class="branchCov" title="Branch 1 was taken 3135 times"> + </span>]:<span class="lineCov"> 3499 : if (battles[bid].global_time % 10 == 0) {</span></a>
<a name="1034"><span class="lineNum"> 1034 </span> :<span class="lineCov"> 364 : inform_all_user_battle_player(bid);</span></a>
<a name="1035"><span class="lineNum"> 1035 </span> : : }</a>
<a name="1036"><span class="lineNum"> 1036 </span> :<span class="lineCov"> 3499 : clear_items(bid);</span></a>
<a name="1037"><span class="lineNum"> 1037 </span> :<span class="lineCov"> 3499 : random_generate_items(bid);</span></a>
<a name="1038"><span class="lineNum"> 1038 </span> :<span class="lineCov"> 3499 : t[1] = myclock();</span></a>
<a name="1039"><span class="lineNum"> 1039 </span> : : /* 时间种子 不测</a>
<a name="1040"><span class="lineNum"> 1040 </span> : : if (t[1] - t[0] &gt;= 5)</a>
<a name="1041"><span class="lineNum"> 1041 </span> : : //logw(&quot;current delay %lums&quot;, t[1] - t[0]);</a>
<a name="1042"><span class="lineNum"> 1042 </span> : : //sum_delay_time += t[1] - t[0];</a>
<a name="1043"><span class="lineNum"> 1043 </span> : : while (myclock() &lt; t[0] + GLOBAL_SPEED)</a>
<a name="1044"><span class="lineNum"> 1044 </span> : : usleep(1000);</a>
<a name="1045"><span class="lineNum"> 1045 </span> : : */</a>
<a name="1046"><span class="lineNum"> 1046 </span> : : }</a>
<a name="1047"><span class="lineNum"> 1047 </span> :<span class="lineCov"> 3 : return NULL;</span></a>
<a name="1048"><span class="lineNum"> 1048 </span> : : }</a>
<a name="1049"><span class="lineNum"> 1049 </span> : : </a>
<a name="1050"><span class="lineNum"> 1050 </span> :<span class="lineCov"> 11 : int check_user_registered(char* user_name, char* password) {</span></a>
<a name="1051"><span class="lineNum"> 1051 </span> [<span class="branchCov" title="Branch 0 was taken 52 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 55 : for (int i = 0; i &lt; REGISTERED_USER_LIST_SIZE; i++) {</span></a>
<a name="1052"><span class="lineNum"> 1052 </span> [<span class="branchCov" title="Branch 0 was taken 44 times"> + </span><span class="branchCov" title="Branch 1 was taken 8 times"> + </span>]:<span class="lineCov"> 52 : if (strncmp(user_name, registered_user_list[i].user_name, USERNAME_SIZE - 1) != 0)</span></a>
<a name="1053"><span class="lineNum"> 1053 </span> :<span class="lineCov"> 44 : continue;</span></a>
<a name="1054"><span class="lineNum"> 1054 </span> : : </a>
<a name="1055"><span class="lineNum"> 1055 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 7 times"> + </span>]:<span class="lineCov"> 8 : if (strncmp(password, registered_user_list[i].password, PASSWORD_SIZE - 1) != 0) {</span></a>
<a name="1056"><span class="lineNum"> 1056 </span> :<span class="lineCov"> 1 : logi(&quot;user name %s sent error password&quot;, user_name);</span></a>
<a name="1057"><span class="lineNum"> 1057 </span> :<span class="lineCov"> 1 : return SERVER_RESPONSE_LOGIN_FAIL_ERROR_PASSWORD;</span></a>
<a name="1058"><span class="lineNum"> 1058 </span> : : } else {</a>
<a name="1059"><span class="lineNum"> 1059 </span> :<span class="lineCov"> 7 : return SERVER_RESPONSE_LOGIN_SUCCESS;</span></a>
<a name="1060"><span class="lineNum"> 1060 </span> : : }</a>
<a name="1061"><span class="lineNum"> 1061 </span> : : }</a>
<a name="1062"><span class="lineNum"> 1062 </span> : : </a>
<a name="1063"><span class="lineNum"> 1063 </span> :<span class="lineCov"> 3 : logi(&quot;user name %s hasn't been registered&quot;, user_name);</span></a>
<a name="1064"><span class="lineNum"> 1064 </span> :<span class="lineCov"> 3 : return SERVER_RESPONSE_LOGIN_FAIL_UNREGISTERED_USERID;</span></a>
<a name="1065"><span class="lineNum"> 1065 </span> : : }</a>
<a name="1066"><span class="lineNum"> 1066 </span> : : </a>
<a name="1067"><span class="lineNum"> 1067 </span> :<span class="lineCov"> 6 : void launch_battle(int bid) {</span></a>
<a name="1068"><span class="lineNum"> 1068 </span> : : pthread_t thread;</a>
<a name="1069"><span class="lineNum"> 1069 </span> :<span class="lineCov"> 6 : pthread_create(&amp;thread, NULL, battle_ruler, (void*)(uintptr_t)bid);</span></a>
<a name="1070"><span class="lineNum"> 1070 </span> : : /*</a>
<a name="1071"><span class="lineNum"> 1071 </span> : : log(&quot;try to create battle_ruler thread&quot;);</a>
<a name="1072"><span class="lineNum"> 1072 </span> : : if (pthread_create(&amp;thread, NULL, battle_ruler, (void*)(uintptr_t)bid) == -1) {</a>
<a name="1073"><span class="lineNum"> 1073 </span> : : eprintf(&quot;fail to launch battle&quot;);</a>
<a name="1074"><span class="lineNum"> 1074 </span> : : }</a>
<a name="1075"><span class="lineNum"> 1075 </span> : : */</a>
<a name="1076"><span class="lineNum"> 1076 </span> :<span class="lineCov"> 6 : }</span></a>
<a name="1077"><span class="lineNum"> 1077 </span> : : </a>
<a name="1078"><span class="lineNum"> 1078 </span> : : </a>
<a name="1079"><span class="lineNum"> 1079 </span> : : </a>
<a name="1080"><span class="lineNum"> 1080 </span> :<span class="lineCov"> 2 : void list_all_users(server_message_t* psm) {</span></a>
<a name="1081"><span class="lineNum"> 1081 </span> [<span class="branchCov" title="Branch 0 was taken 28 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 30 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1082"><span class="lineNum"> 1082 </span> [<span class="branchCov" title="Branch 0 was taken 27 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 28 : if (query_session_built(i)) {</span></a>
<a name="1083"><span class="lineNum"> 1083 </span> : : </a>
<a name="1084"><span class="lineNum"> 1084 </span> : : //log(&quot;%s: found %s %s&quot;, __func__, sessions[i].user_name,</a>
<a name="1085"><span class="lineNum"> 1085 </span> : : //sessions[i].state == USER_STATE_BATTLE ? &quot;in battle&quot; : &quot;&quot;);</a>
<a name="1086"><span class="lineNum"> 1086 </span> :<span class="lineCov"> 27 : psm-&gt;all_users[i].user_state = sessions[i].state;</span></a>
<a name="1087"><span class="lineNum"> 1087 </span> :<span class="lineCov"> 27 : strncpy(psm-&gt;all_users[i].user_name, sessions[i].user_name, USERNAME_SIZE - 1);</span></a>
<a name="1088"><span class="lineNum"> 1088 </span> : : }</a>
<a name="1089"><span class="lineNum"> 1089 </span> : : }</a>
<a name="1090"><span class="lineNum"> 1090 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="1091"><span class="lineNum"> 1091 </span> : : </a>
<a name="1092"><span class="lineNum"> 1092 </span> :<span class="lineCov"> 2 : int client_command_fetch_all_users(int uid) {</span></a>
<a name="1093"><span class="lineNum"> 1093 </span> :<span class="lineCov"> 2 : char* user_name = sessions[uid].user_name;</span></a>
<a name="1094"><span class="lineNum"> 1094 </span> : : //log(&quot;user #%d %s\033[2m(%s)\033[0m tries to fetch all users's info&quot;, uid, user_name, sessions[uid].user_name);</a>
<a name="1095"><span class="lineNum"> 1095 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (!query_session_built(uid)) {</span></a>
<a name="1096"><span class="lineNum"> 1096 </span> : : //logi(&quot;user #%d %s\033[2m(%s)\033[0m who tries to list users hasn't login&quot;, uid, user_name, sessions[uid].user_name);</a>
<a name="1097"><span class="lineNum"> 1097 </span> : : //send_to_client(uid, SERVER_RESPONSE_YOU_HAVE_NOT_LOGIN);</a>
<a name="1098"><span class="lineNum"> 1098 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1099"><span class="lineNum"> 1099 </span> : : }</a>
<a name="1100"><span class="lineNum"> 1100 </span> : : </a>
<a name="1101"><span class="lineNum"> 1101 </span> : : server_message_t sm;</a>
<a name="1102"><span class="lineNum"> 1102 </span> :<span class="lineCov"> 1 : memset(&amp;sm, 0, sizeof(server_message_t));</span></a>
<a name="1103"><span class="lineNum"> 1103 </span> : : //list_all_users(&amp;sm);</a>
<a name="1104"><span class="lineNum"> 1104 </span> :<span class="lineCov"> 1 : sm.response = SERVER_RESPONSE_ALL_USERS_INFO;</span></a>
<a name="1105"><span class="lineNum"> 1105 </span> : : </a>
<a name="1106"><span class="lineNum"> 1106 </span> : : //wrap_send(sessions[uid].conn, &amp;sm);</a>
<a name="1107"><span class="lineNum"> 1107 </span> : : </a>
<a name="1108"><span class="lineNum"> 1108 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1109"><span class="lineNum"> 1109 </span> : : }</a>
<a name="1110"><span class="lineNum"> 1110 </span> : : </a>
<a name="1111"><span class="lineNum"> 1111 </span> :<span class="lineCov"> 2 : int client_command_fetch_all_friends(int uid) {</span></a>
<a name="1112"><span class="lineNum"> 1112 </span> :<span class="lineCov"> 2 : char *user_name = sessions[uid].user_name;</span></a>
<a name="1113"><span class="lineNum"> 1113 </span> : : //log(&quot;user %s tries to fetch info&quot;, user_name);</a>
<a name="1114"><span class="lineNum"> 1114 </span> : : </a>
<a name="1115"><span class="lineNum"> 1115 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (!query_session_built(uid)) {</span></a>
<a name="1116"><span class="lineNum"> 1116 </span> : : //logi(&quot;user %s who tries to list users hasn't login&quot;, user_name);</a>
<a name="1117"><span class="lineNum"> 1117 </span> : : //send_to_client(uid, SERVER_RESPONSE_YOU_HAVE_NOT_LOGIN);</a>
<a name="1118"><span class="lineNum"> 1118 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1119"><span class="lineNum"> 1119 </span> : : }</a>
<a name="1120"><span class="lineNum"> 1120 </span> : : </a>
<a name="1121"><span class="lineNum"> 1121 </span> : : server_message_t sm;</a>
<a name="1122"><span class="lineNum"> 1122 </span> :<span class="lineCov"> 1 : memset(&amp;sm, 0, sizeof(server_message_t));</span></a>
<a name="1123"><span class="lineNum"> 1123 </span> :<span class="lineCov"> 1 : list_all_users(&amp;sm);</span></a>
<a name="1124"><span class="lineNum"> 1124 </span> :<span class="lineCov"> 1 : sm.all_users[uid].user_state = USER_STATE_UNUSED;</span></a>
<a name="1125"><span class="lineNum"> 1125 </span> :<span class="lineCov"> 1 : sm.response = SERVER_RESPONSE_ALL_FRIENDS_INFO;</span></a>
<a name="1126"><span class="lineNum"> 1126 </span> : : </a>
<a name="1127"><span class="lineNum"> 1127 </span> : : //wrap_send(sessions[uid].conn, &amp;sm);</a>
<a name="1128"><span class="lineNum"> 1128 </span> : : </a>
<a name="1129"><span class="lineNum"> 1129 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1130"><span class="lineNum"> 1130 </span> : : }</a>
<a name="1131"><span class="lineNum"> 1131 </span> : : </a>
<a name="1132"><span class="lineNum"> 1132 </span> :<span class="lineCov"> 6 : int invite_friend_to_battle(int bid, int uid, char* friend_name) {</span></a>
<a name="1133"><span class="lineNum"> 1133 </span> :<span class="lineCov"> 6 : int friend_id = find_uid_by_user_name(friend_name);</span></a>
<a name="1134"><span class="lineNum"> 1134 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 6 : if (friend_id == -1) {</span></a>
<a name="1135"><span class="lineNum"> 1135 </span> : : // fail to find friend</a>
<a name="1136"><span class="lineNum"> 1136 </span> :<span class="lineCov"> 3 : logi(&quot;friend %s hasn't login&quot;, friend_name);</span></a>
<a name="1137"><span class="lineNum"> 1137 </span> :<span class="lineCov"> 3 : send_to_client(uid, SERVER_MESSAGE_FRIEND_NOT_LOGIN);</span></a>
<a name="1138"><span class="lineNum"> 1138 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : } else if (friend_id == uid) {</span></a>
<a name="1139"><span class="lineNum"> 1139 </span> :<span class="lineCov"> 1 : logi(&quot;launch battle %d for %s&quot;, bid, sessions[uid].user_name);</span></a>
<a name="1140"><span class="lineNum"> 1140 </span> :<span class="lineCov"> 1 : sessions[uid].inviter_id = uid;</span></a>
<a name="1141"><span class="lineNum"> 1141 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_INVITATION_SENT);</span></a>
<a name="1142"><span class="lineNum"> 1142 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : } else if (sessions[friend_id].state == USER_STATE_BATTLE) {</span></a>
<a name="1143"><span class="lineNum"> 1143 </span> : : // friend already in battle</a>
<a name="1144"><span class="lineNum"> 1144 </span> :<span class="lineCov"> 1 : logi(&quot;friend %s already in battle&quot;, friend_name);</span></a>
<a name="1145"><span class="lineNum"> 1145 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_MESSAGE_FRIEND_ALREADY_IN_BATTLE);</span></a>
<a name="1146"><span class="lineNum"> 1146 </span> : : } else {</a>
<a name="1147"><span class="lineNum"> 1147 </span> : : // invite friend</a>
<a name="1148"><span class="lineNum"> 1148 </span> :<span class="lineCov"> 1 : logi(&quot;friend #%d %s found&quot;, friend_id, friend_name);</span></a>
<a name="1149"><span class="lineNum"> 1149 </span> : : </a>
<a name="1150"><span class="lineNum"> 1150 </span> :<span class="lineCov"> 1 : user_invited_to_join_battle(bid, friend_id);</span></a>
<a name="1151"><span class="lineNum"> 1151 </span> : : // WARNING: can't move this statement</a>
<a name="1152"><span class="lineNum"> 1152 </span> :<span class="lineCov"> 1 : sessions[friend_id].inviter_id = uid;</span></a>
<a name="1153"><span class="lineNum"> 1153 </span> : : </a>
<a name="1154"><span class="lineNum"> 1154 </span> :<span class="lineCov"> 1 : send_to_client_with_username(friend_id, SERVER_MESSAGE_INVITE_TO_BATTLE, sessions[uid].user_name);</span></a>
<a name="1155"><span class="lineNum"> 1155 </span> : : }</a>
<a name="1156"><span class="lineNum"> 1156 </span> : : </a>
<a name="1157"><span class="lineNum"> 1157 </span> :<span class="lineCov"> 6 : return 0;</span></a>
<a name="1158"><span class="lineNum"> 1158 </span> : : }</a>
<a name="1159"><span class="lineNum"> 1159 </span> : : </a>
<a name="1160"><span class="lineNum"> 1160 </span> :<span class="lineCov"> 4 : int client_command_launch_battle(int uid) {</span></a>
<a name="1161"><span class="lineNum"> 1161 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 4 : if (sessions[uid].state == USER_STATE_BATTLE) {</span></a>
<a name="1162"><span class="lineNum"> 1162 </span> :<span class="lineCov"> 1 : log(&quot;user %s who tries to launch battle has been in battle&quot;, sessions[uid].user_name);</span></a>
<a name="1163"><span class="lineNum"> 1163 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_YOURE_ALREADY_IN_BATTLE);</span></a>
<a name="1164"><span class="lineNum"> 1164 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1165"><span class="lineNum"> 1165 </span> : : } else {</a>
<a name="1166"><span class="lineNum"> 1166 </span> :<span class="lineCov"> 3 : log(&quot;user %s tries to launch battle&quot;, sessions[uid].user_name);</span></a>
<a name="1167"><span class="lineNum"> 1167 </span> : : }</a>
<a name="1168"><span class="lineNum"> 1168 </span> : : </a>
<a name="1169"><span class="lineNum"> 1169 </span> :<span class="lineCov"> 3 : int bid = get_unalloced_battle();</span></a>
<a name="1170"><span class="lineNum"> 1170 </span> :<span class="lineCov"> 3 : client_message_t* pcm = &amp;sessions[uid].cm;</span></a>
<a name="1171"><span class="lineNum"> 1171 </span> : : </a>
<a name="1172"><span class="lineNum"> 1172 </span> :<span class="lineCov"> 3 : log(&quot;%s launch battle with %s&quot;, sessions[uid].user_name, pcm-&gt;user_name);</span></a>
<a name="1173"><span class="lineNum"> 1173 </span> : : </a>
<a name="1174"><span class="lineNum"> 1174 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : if (bid == -1) {</span></a>
<a name="1175"><span class="lineNum"> 1175 </span> :<span class="lineCov"> 1 : loge(&quot;fail to create battle for %s and %s&quot;, sessions[uid].user_name, pcm-&gt;user_name);</span></a>
<a name="1176"><span class="lineNum"> 1176 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_LAUNCH_BATTLE_FAIL);</span></a>
<a name="1177"><span class="lineNum"> 1177 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1178"><span class="lineNum"> 1178 </span> : : } else {</a>
<a name="1179"><span class="lineNum"> 1179 </span> :<span class="lineCov"> 2 : logi(&quot;launch battle %d for %s, invite %s&quot;, bid, sessions[uid].user_name, pcm-&gt;user_name);</span></a>
<a name="1180"><span class="lineNum"> 1180 </span> :<span class="lineCov"> 2 : user_join_battle(bid, uid);</span></a>
<a name="1181"><span class="lineNum"> 1181 </span> :<span class="lineCov"> 2 : cout&lt;&lt;&quot;test:&quot;&lt;&lt;pcm-&gt;user_name&lt;&lt;endl;</span></a>
<a name="1182"><span class="lineNum"> 1182 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (strcmp(pcm-&gt;user_name, &quot;&quot;))</span></a>
<a name="1183"><span class="lineNum"> 1183 </span> :<span class="lineCov"> 1 : invite_friend_to_battle(bid, uid, pcm-&gt;user_name);</span></a>
<a name="1184"><span class="lineNum"> 1184 </span> :<span class="lineCov"> 2 : launch_battle(bid);</span></a>
<a name="1185"><span class="lineNum"> 1185 </span> :<span class="lineCov"> 2 : send_to_client(uid, SERVER_RESPONSE_LAUNCH_BATTLE_SUCCESS);</span></a>
<a name="1186"><span class="lineNum"> 1186 </span> : : }</a>
<a name="1187"><span class="lineNum"> 1187 </span> : : </a>
<a name="1188"><span class="lineNum"> 1188 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1189"><span class="lineNum"> 1189 </span> : : }</a>
<a name="1190"><span class="lineNum"> 1190 </span> : : </a>
<a name="1191"><span class="lineNum"> 1191 </span> :<span class="lineCov"> 2 : int client_command_quit_battle(int uid) {</span></a>
<a name="1192"><span class="lineNum"> 1192 </span> :<span class="lineCov"> 2 : log(&quot;user %s tries to quit battle&quot;, sessions[uid].user_name);</span></a>
<a name="1193"><span class="lineNum"> 1193 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (sessions[uid].state != USER_STATE_BATTLE) {</span></a>
<a name="1194"><span class="lineNum"> 1194 </span> :<span class="lineCov"> 1 : logi(&quot;but he hasn't join battle&quot;);</span></a>
<a name="1195"><span class="lineNum"> 1195 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_YOURE_NOT_IN_BATTLE);</span></a>
<a name="1196"><span class="lineNum"> 1196 </span> : : } else {</a>
<a name="1197"><span class="lineNum"> 1197 </span> :<span class="lineCov"> 1 : logi(&quot;call user_quit_battle to quit&quot;);</span></a>
<a name="1198"><span class="lineNum"> 1198 </span> :<span class="lineCov"> 1 : user_quit_battle(sessions[uid].bid, uid);</span></a>
<a name="1199"><span class="lineNum"> 1199 </span> : : }</a>
<a name="1200"><span class="lineNum"> 1200 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1201"><span class="lineNum"> 1201 </span> : : }</a>
<a name="1202"><span class="lineNum"> 1202 </span> : : </a>
<a name="1203"><span class="lineNum"> 1203 </span> :<span class="lineCov"> 2 : int client_command_invite_user(int uid) {</span></a>
<a name="1204"><span class="lineNum"> 1204 </span> :<span class="lineCov"> 2 : client_message_t* pcm = &amp;sessions[uid].cm;</span></a>
<a name="1205"><span class="lineNum"> 1205 </span> :<span class="lineCov"> 2 : int bid = sessions[uid].bid;</span></a>
<a name="1206"><span class="lineNum"> 1206 </span> :<span class="lineCov"> 2 : int friend_id = find_uid_by_user_name(pcm-&gt;user_name);</span></a>
<a name="1207"><span class="lineNum"> 1207 </span> :<span class="lineCov"> 2 : log(&quot;user #%d %s\033[2m(%s)\033[0m tries to invite friend&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="1208"><span class="lineNum"> 1208 </span> : : </a>
<a name="1209"><span class="lineNum"> 1209 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (sessions[uid].state != USER_STATE_BATTLE) {</span></a>
<a name="1210"><span class="lineNum"> 1210 </span> :<span class="lineCov"> 1 : log(&quot;user %s\033[2m(%s)\033[0m who invites friend %s wasn't in battle&quot;, sessions[uid].user_name, sessions[uid].ip_addr, pcm-&gt;user_name);</span></a>
<a name="1211"><span class="lineNum"> 1211 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_YOURE_NOT_IN_BATTLE);</span></a>
<a name="1212"><span class="lineNum"> 1212 </span> : : } else {</a>
<a name="1213"><span class="lineNum"> 1213 </span> :<span class="lineCov"> 1 : logi(&quot;invite user %s\033[2m(%s)\033[0m to battle #%d&quot;, sessions[friend_id].user_name, sessions[uid].ip_addr, bid);</span></a>
<a name="1214"><span class="lineNum"> 1214 </span> :<span class="lineCov"> 1 : invite_friend_to_battle(bid, uid, pcm-&gt;user_name);</span></a>
<a name="1215"><span class="lineNum"> 1215 </span> : : }</a>
<a name="1216"><span class="lineNum"> 1216 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1217"><span class="lineNum"> 1217 </span> : : }</a>
<a name="1218"><span class="lineNum"> 1218 </span> : : </a>
<a name="1219"><span class="lineNum"> 1219 </span> :<span class="lineCov"> 2 : int client_command_send_message(int uid) {</span></a>
<a name="1220"><span class="lineNum"> 1220 </span> :<span class="lineCov"> 2 : client_message_t* pcm = &amp;sessions[uid].cm;</span></a>
<a name="1221"><span class="lineNum"> 1221 </span> : : server_message_t sm;</a>
<a name="1222"><span class="lineNum"> 1222 </span> :<span class="lineCov"> 2 : memset(&amp;sm, 0, sizeof(server_message_t));</span></a>
<a name="1223"><span class="lineNum"> 1223 </span> :<span class="lineCov"> 2 : sm.message = SERVER_MESSAGE_FRIEND_MESSAGE;</span></a>
<a name="1224"><span class="lineNum"> 1224 </span> :<span class="lineCov"> 2 : strncpy(sm.from_user, sessions[uid].user_name, USERNAME_SIZE);</span></a>
<a name="1225"><span class="lineNum"> 1225 </span> :<span class="lineCov"> 2 : strncpy(sm.msg, pcm-&gt;message, MSG_SIZE);</span></a>
<a name="1226"><span class="lineNum"> 1226 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (pcm-&gt;user_name[0] == '\0') {</span></a>
<a name="1227"><span class="lineNum"> 1227 </span> : : //logi(&quot;user %d:%s\033[2m(%s)\033[0m yells at all users: %s&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr, pcm-&gt;message);</a>
<a name="1228"><span class="lineNum"> 1228 </span> : : int i;</a>
<a name="1229"><span class="lineNum"> 1229 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 15 : for (i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1230"><span class="lineNum"> 1230 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 13 times"> + </span>]:<span class="lineCov"> 14 : if (uid == i)</span></a>
<a name="1231"><span class="lineNum"> 1231 </span> :<span class="lineCov"> 1 : continue;</span></a>
<a name="1232"><span class="lineNum"> 1232 </span> : : //wrap_send(sessions[i].conn, &amp;sm);</a>
<a name="1233"><span class="lineNum"> 1233 </span> :<span class="lineCov"> 13 : int w = -1; // test</span></a>
<a name="1234"><span class="lineNum"> 1234 </span> : : }</a>
<a name="1235"><span class="lineNum"> 1235 </span> : : }</a>
<a name="1236"><span class="lineNum"> 1236 </span> : : else {</a>
<a name="1237"><span class="lineNum"> 1237 </span> :<span class="lineCov"> 1 : return 0; // test</span></a>
<a name="1238"><span class="lineNum"> 1238 </span> : : /*</a>
<a name="1239"><span class="lineNum"> 1239 </span> : : int friend_id = find_uid_by_user_name(pcm-&gt;user_name);</a>
<a name="1240"><span class="lineNum"> 1240 </span> : : if (friend_id == -1 || friend_id == uid) {</a>
<a name="1241"><span class="lineNum"> 1241 </span> : : logi(&quot;user %d:%s\033[2m(%s)\033[0m fails to speak to %s:`%s`&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr, pcm-&gt;user_name, pcm-&gt;message);</a>
<a name="1242"><span class="lineNum"> 1242 </span> : : } else {</a>
<a name="1243"><span class="lineNum"> 1243 </span> : : logi(&quot;user %d:%s\033[2m(%s)\033[0m speaks to %d:%s : `%s`&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr, friend_id, pcm-&gt;user_name, pcm-&gt;message);</a>
<a name="1244"><span class="lineNum"> 1244 </span> : : wrap_send(sessions[friend_id].conn, &amp;sm);</a>
<a name="1245"><span class="lineNum"> 1245 </span> : : }</a>
<a name="1246"><span class="lineNum"> 1246 </span> : : */</a>
<a name="1247"><span class="lineNum"> 1247 </span> : : }</a>
<a name="1248"><span class="lineNum"> 1248 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1249"><span class="lineNum"> 1249 </span> : : }</a>
<a name="1250"><span class="lineNum"> 1250 </span> : : </a>
<a name="1251"><span class="lineNum"> 1251 </span> :<span class="lineCov"> 5 : int client_command_create_ffa(int uid) {</span></a>
<a name="1252"><span class="lineNum"> 1252 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 5 : if (sessions[uid].state == USER_STATE_BATTLE) {</span></a>
<a name="1253"><span class="lineNum"> 1253 </span> :<span class="lineCov"> 2 : log(&quot;user %s who tries to launch battle has been in battle&quot;, sessions[uid].user_name);</span></a>
<a name="1254"><span class="lineNum"> 1254 </span> :<span class="lineCov"> 2 : send_to_client(uid, SERVER_RESPONSE_YOURE_ALREADY_IN_BATTLE);</span></a>
<a name="1255"><span class="lineNum"> 1255 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1256"><span class="lineNum"> 1256 </span> : : } else {</a>
<a name="1257"><span class="lineNum"> 1257 </span> :<span class="lineCov"> 3 : log(&quot;user %s tries to create ffa sessions #0&quot;, sessions[uid].user_name);</span></a>
<a name="1258"><span class="lineNum"> 1258 </span> : : }</a>
<a name="1259"><span class="lineNum"> 1259 </span> : : </a>
<a name="1260"><span class="lineNum"> 1260 </span> :<span class="lineCov"> 3 : int bid = 0;</span></a>
<a name="1261"><span class="lineNum"> 1261 </span> :<span class="lineCov"> 3 : client_message_t* pcm = &amp;sessions[uid].cm;</span></a>
<a name="1262"><span class="lineNum"> 1262 </span> : : </a>
<a name="1263"><span class="lineNum"> 1263 </span> :<span class="lineCov"> 3 : log(&quot;%s launch battle with %s&quot;, sessions[uid].user_name, pcm-&gt;user_name);</span></a>
<a name="1264"><span class="lineNum"> 1264 </span> :<span class="lineCov"> 3 : cout&lt;&lt;&quot;state: &quot;&lt;&lt;battles[bid].is_alloced&lt;&lt;endl;</span></a>
<a name="1265"><span class="lineNum"> 1265 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : if (battles[bid].is_alloced) {</span></a>
<a name="1266"><span class="lineNum"> 1266 </span> :<span class="lineCov"> 1 : loge(&quot;fail to create battle for %s and %s&quot;, sessions[uid].user_name, pcm-&gt;user_name);</span></a>
<a name="1267"><span class="lineNum"> 1267 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_LAUNCH_BATTLE_FAIL);</span></a>
<a name="1268"><span class="lineNum"> 1268 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1269"><span class="lineNum"> 1269 </span> : : } else {</a>
<a name="1270"><span class="lineNum"> 1270 </span> :<span class="lineCov"> 2 : logi(&quot;launch battle #0 for ffa&quot;);</span></a>
<a name="1271"><span class="lineNum"> 1271 </span> :<span class="lineCov"> 2 : battles[bid].is_alloced = true;</span></a>
<a name="1272"><span class="lineNum"> 1272 </span> :<span class="lineCov"> 2 : user_join_battle(bid, uid);</span></a>
<a name="1273"><span class="lineNum"> 1273 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (strcmp(pcm-&gt;user_name, &quot;&quot;))</span></a>
<a name="1274"><span class="lineNum"> 1274 </span> :<span class="lineCov"> 1 : invite_friend_to_battle(bid, uid, pcm-&gt;user_name);</span></a>
<a name="1275"><span class="lineNum"> 1275 </span> :<span class="lineCov"> 2 : launch_battle(bid);</span></a>
<a name="1276"><span class="lineNum"> 1276 </span> :<span class="lineCov"> 2 : send_to_client(uid, SERVER_RESPONSE_LAUNCH_BATTLE_SUCCESS);</span></a>
<a name="1277"><span class="lineNum"> 1277 </span> : : }</a>
<a name="1278"><span class="lineNum"> 1278 </span> : : </a>
<a name="1279"><span class="lineNum"> 1279 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1280"><span class="lineNum"> 1280 </span> : : }</a>
<a name="1281"><span class="lineNum"> 1281 </span> : : </a>
<a name="1282"><span class="lineNum"> 1282 </span> :<span class="lineCov"> 3 : int client_command_launch_ffa(int uid) {</span></a>
<a name="1283"><span class="lineNum"> 1283 </span> :<span class="lineCov"> 3 : log(&quot;user %s\033[2m(%s)\033[0m try ffa&quot;, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="1284"><span class="lineNum"> 1284 </span> : : </a>
<a name="1285"><span class="lineNum"> 1285 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : if (sessions[uid].state == USER_STATE_BATTLE) {</span></a>
<a name="1286"><span class="lineNum"> 1286 </span> :<span class="lineCov"> 1 : logi(&quot;already in battle&quot;);</span></a>
<a name="1287"><span class="lineNum"> 1287 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_YOURE_ALREADY_IN_BATTLE);</span></a>
<a name="1288"><span class="lineNum"> 1288 </span> : : } else {</a>
<a name="1289"><span class="lineNum"> 1289 </span> :<span class="lineCov"> 2 : int bid = 0;</span></a>
<a name="1290"><span class="lineNum"> 1290 </span> : : </a>
<a name="1291"><span class="lineNum"> 1291 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (battles[bid].is_alloced) {</span></a>
<a name="1292"><span class="lineNum"> 1292 </span> :<span class="lineCov"> 1 : user_join_battle(bid, uid);</span></a>
<a name="1293"><span class="lineNum"> 1293 </span> :<span class="lineCov"> 1 : logi(&quot;accept success&quot;);</span></a>
<a name="1294"><span class="lineNum"> 1294 </span> : : } else {</a>
<a name="1295"><span class="lineNum"> 1295 </span> :<span class="lineCov"> 1 : logi(&quot;user %s created ffa session #0&quot;, sessions[uid].user_name);</span></a>
<a name="1296"><span class="lineNum"> 1296 </span> :<span class="lineCov"> 1 : client_command_create_ffa(uid);</span></a>
<a name="1297"><span class="lineNum"> 1297 </span> : : }</a>
<a name="1298"><span class="lineNum"> 1298 </span> : : }</a>
<a name="1299"><span class="lineNum"> 1299 </span> :<span class="lineCov"> 3 : return 0;</span></a>
<a name="1300"><span class="lineNum"> 1300 </span> : : }</a>
<a name="1301"><span class="lineNum"> 1301 </span> : : </a>
<a name="1302"><span class="lineNum"> 1302 </span> :<span class="lineCov"> 4 : int client_command_accept_battle(int uid) {</span></a>
<a name="1303"><span class="lineNum"> 1303 </span> :<span class="lineCov"> 4 : log(&quot;user %s\033[2m(%s)\033[0m accept battle #%d&quot;, sessions[uid].user_name, sessions[uid].ip_addr, sessions[uid].bid);</span></a>
<a name="1304"><span class="lineNum"> 1304 </span> : : </a>
<a name="1305"><span class="lineNum"> 1305 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 4 : if (sessions[uid].state == USER_STATE_BATTLE) {</span></a>
<a name="1306"><span class="lineNum"> 1306 </span> :<span class="lineCov"> 1 : logi(&quot;already in battle&quot;);</span></a>
<a name="1307"><span class="lineNum"> 1307 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_YOURE_ALREADY_IN_BATTLE);</span></a>
<a name="1308"><span class="lineNum"> 1308 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : } else if (sessions[uid].state == USER_STATE_WAIT_TO_BATTLE) {</span></a>
<a name="1309"><span class="lineNum"> 1309 </span> :<span class="lineCov"> 2 : int inviter_id = sessions[uid].inviter_id;</span></a>
<a name="1310"><span class="lineNum"> 1310 </span> :<span class="lineCov"> 2 : int bid = sessions[uid].bid;</span></a>
<a name="1311"><span class="lineNum"> 1311 </span> : : </a>
<a name="1312"><span class="lineNum"> 1312 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (battles[bid].is_alloced) {</span></a>
<a name="1313"><span class="lineNum"> 1313 </span> :<span class="lineCov"> 1 : send_to_client_with_username(inviter_id, SERVER_MESSAGE_FRIEND_ACCEPT_BATTLE, sessions[inviter_id].user_name);</span></a>
<a name="1314"><span class="lineNum"> 1314 </span> :<span class="lineCov"> 1 : user_join_battle(bid, uid);</span></a>
<a name="1315"><span class="lineNum"> 1315 </span> :<span class="lineCov"> 1 : logi(&quot;accept success&quot;);</span></a>
<a name="1316"><span class="lineNum"> 1316 </span> : : } else {</a>
<a name="1317"><span class="lineNum"> 1317 </span> :<span class="lineCov"> 1 : logi(&quot;user %s\033[2m(%s)\033[0m accept battle which didn't exist&quot;, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="1318"><span class="lineNum"> 1318 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_YOURE_ALREADY_IN_BATTLE);</span></a>
<a name="1319"><span class="lineNum"> 1319 </span> : : }</a>
<a name="1320"><span class="lineNum"> 1320 </span> : : </a>
<a name="1321"><span class="lineNum"> 1321 </span> : : } else {</a>
<a name="1322"><span class="lineNum"> 1322 </span> :<span class="lineCov"> 1 : logi(&quot;hasn't been invited&quot;);</span></a>
<a name="1323"><span class="lineNum"> 1323 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_NOBODY_INVITE_YOU);</span></a>
<a name="1324"><span class="lineNum"> 1324 </span> : : }</a>
<a name="1325"><span class="lineNum"> 1325 </span> : : </a>
<a name="1326"><span class="lineNum"> 1326 </span> :<span class="lineCov"> 4 : return 0;</span></a>
<a name="1327"><span class="lineNum"> 1327 </span> : : }</a>
<a name="1328"><span class="lineNum"> 1328 </span> : : </a>
<a name="1329"><span class="lineNum"> 1329 </span> :<span class="lineCov"> 3 : int client_command_reject_battle(int uid) {</span></a>
<a name="1330"><span class="lineNum"> 1330 </span> :<span class="lineCov"> 3 : log(&quot;user %s\033[2m(%s)\033[0m reject battle #%d&quot;, sessions[uid].user_name, sessions[uid].ip_addr, sessions[uid].bid);</span></a>
<a name="1331"><span class="lineNum"> 1331 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : if (sessions[uid].state == USER_STATE_BATTLE) {</span></a>
<a name="1332"><span class="lineNum"> 1332 </span> :<span class="lineCov"> 1 : logi(&quot;user already in battle&quot;);</span></a>
<a name="1333"><span class="lineNum"> 1333 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_YOURE_ALREADY_IN_BATTLE);</span></a>
<a name="1334"><span class="lineNum"> 1334 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : } else if (sessions[uid].state == USER_STATE_WAIT_TO_BATTLE) {</span></a>
<a name="1335"><span class="lineNum"> 1335 </span> :<span class="lineCov"> 1 : logi(&quot;reject success&quot;);</span></a>
<a name="1336"><span class="lineNum"> 1336 </span> :<span class="lineCov"> 1 : int bid = sessions[uid].bid;</span></a>
<a name="1337"><span class="lineNum"> 1337 </span> :<span class="lineCov"> 1 : send_to_client(sessions[uid].inviter_id, SERVER_MESSAGE_FRIEND_REJECT_BATTLE);</span></a>
<a name="1338"><span class="lineNum"> 1338 </span> :<span class="lineCov"> 1 : sessions[uid].state = USER_STATE_LOGIN;</span></a>
<a name="1339"><span class="lineNum"> 1339 </span> :<span class="lineCov"> 1 : battles[bid].users[uid].battle_state = BATTLE_STATE_UNJOINED;</span></a>
<a name="1340"><span class="lineNum"> 1340 </span> : : } else {</a>
<a name="1341"><span class="lineNum"> 1341 </span> :<span class="lineCov"> 1 : logi(&quot;hasn't been invited&quot;);</span></a>
<a name="1342"><span class="lineNum"> 1342 </span> :<span class="lineCov"> 1 : send_to_client(uid, SERVER_RESPONSE_NOBODY_INVITE_YOU);</span></a>
<a name="1343"><span class="lineNum"> 1343 </span> : : }</a>
<a name="1344"><span class="lineNum"> 1344 </span> :<span class="lineCov"> 3 : return 0;</span></a>
<a name="1345"><span class="lineNum"> 1345 </span> : : }</a>
<a name="1346"><span class="lineNum"> 1346 </span> : : </a>
<a name="1347"><span class="lineNum"> 1347 </span> :<span class="lineCov"> 4 : int client_command_quit(int uid) {</span></a>
<a name="1348"><span class="lineNum"> 1348 </span> :<span class="lineCov"> 4 : int conn = sessions[uid].conn;</span></a>
<a name="1349"><span class="lineNum"> 1349 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 4 : if (sessions[uid].state == USER_STATE_BATTLE</span></a>
<a name="1350"><span class="lineNum"> 1350 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : || sessions[uid].state == USER_STATE_WAIT_TO_BATTLE) {</span></a>
<a name="1351"><span class="lineNum"> 1351 </span> :<span class="lineCov"> 2 : log(&quot;user #%d %s tries to quit client was in battle&quot;, uid, sessions[uid].user_name);</span></a>
<a name="1352"><span class="lineNum"> 1352 </span> :<span class="lineCov"> 2 : user_quit_battle(sessions[uid].bid, uid);</span></a>
<a name="1353"><span class="lineNum"> 1353 </span> : : }</a>
<a name="1354"><span class="lineNum"> 1354 </span> : : </a>
<a name="1355"><span class="lineNum"> 1355 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 4 : if (sessions[uid].conn &gt;= 0) {</span></a>
<a name="1356"><span class="lineNum"> 1356 </span> :<span class="lineCov"> 2 : sessions[uid].conn = -1;</span></a>
<a name="1357"><span class="lineNum"> 1357 </span> :<span class="lineCov"> 2 : log(&quot;user #%d %s quit&quot;, uid, sessions[uid].user_name);</span></a>
<a name="1358"><span class="lineNum"> 1358 </span> :<span class="lineCov"> 2 : sessions[uid].state = USER_STATE_UNUSED;</span></a>
<a name="1359"><span class="lineNum"> 1359 </span> :<span class="lineCov"> 2 : close(conn);</span></a>
<a name="1360"><span class="lineNum"> 1360 </span> : : }</a>
<a name="1361"><span class="lineNum"> 1361 </span> :<span class="lineCov"> 4 : return -1;</span></a>
<a name="1362"><span class="lineNum"> 1362 </span> : : }</a>
<a name="1363"><span class="lineNum"> 1363 </span> : : </a>
<a name="1364"><span class="lineNum"> 1364 </span> :<span class="lineCov"> 2 : int client_command_move_up(int uid) {</span></a>
<a name="1365"><span class="lineNum"> 1365 </span> :<span class="lineCov"> 2 : log(&quot;user #%d %s\033[2m(%s)\033[0m move up&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="1366"><span class="lineNum"> 1366 </span> :<span class="lineCov"> 2 : int bid = sessions[uid].bid;</span></a>
<a name="1367"><span class="lineNum"> 1367 </span> :<span class="lineCov"> 2 : battles[bid].users[uid].dir = DIR_UP;</span></a>
<a name="1368"><span class="lineNum"> 1368 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (battles[bid].users[uid].pos.y &gt; 0) {</span></a>
<a name="1369"><span class="lineNum"> 1369 </span> :<span class="lineCov"> 1 : battles[bid].users[uid].pos.y--;</span></a>
<a name="1370"><span class="lineNum"> 1370 </span> :<span class="lineCov"> 1 : check_user_status(uid);</span></a>
<a name="1371"><span class="lineNum"> 1371 </span> : : }</a>
<a name="1372"><span class="lineNum"> 1372 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1373"><span class="lineNum"> 1373 </span> : : }</a>
<a name="1374"><span class="lineNum"> 1374 </span> : : </a>
<a name="1375"><span class="lineNum"> 1375 </span> :<span class="lineCov"> 2 : int client_command_move_down(int uid) {</span></a>
<a name="1376"><span class="lineNum"> 1376 </span> :<span class="lineCov"> 2 : log(&quot;user #%d %s\033[2m(%s)\033[0m move down&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="1377"><span class="lineNum"> 1377 </span> :<span class="lineCov"> 2 : int bid = sessions[uid].bid;</span></a>
<a name="1378"><span class="lineNum"> 1378 </span> :<span class="lineCov"> 2 : battles[bid].users[uid].dir = DIR_DOWN;</span></a>
<a name="1379"><span class="lineNum"> 1379 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (battles[bid].users[uid].pos.y &lt; BATTLE_H - 1) {</span></a>
<a name="1380"><span class="lineNum"> 1380 </span> :<span class="lineCov"> 1 : battles[bid].users[uid].pos.y++;</span></a>
<a name="1381"><span class="lineNum"> 1381 </span> :<span class="lineCov"> 1 : check_user_status(uid);</span></a>
<a name="1382"><span class="lineNum"> 1382 </span> : : }</a>
<a name="1383"><span class="lineNum"> 1383 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1384"><span class="lineNum"> 1384 </span> : : }</a>
<a name="1385"><span class="lineNum"> 1385 </span> : : </a>
<a name="1386"><span class="lineNum"> 1386 </span> :<span class="lineCov"> 2 : int client_command_move_left(int uid) {</span></a>
<a name="1387"><span class="lineNum"> 1387 </span> :<span class="lineCov"> 2 : log(&quot;user #%d %s\033[2m(%s)\033[0m move left&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="1388"><span class="lineNum"> 1388 </span> :<span class="lineCov"> 2 : int bid = sessions[uid].bid;</span></a>
<a name="1389"><span class="lineNum"> 1389 </span> :<span class="lineCov"> 2 : battles[bid].users[uid].dir = DIR_LEFT;</span></a>
<a name="1390"><span class="lineNum"> 1390 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (battles[bid].users[uid].pos.x &gt; 0) {</span></a>
<a name="1391"><span class="lineNum"> 1391 </span> :<span class="lineCov"> 1 : battles[bid].users[uid].pos.x--;</span></a>
<a name="1392"><span class="lineNum"> 1392 </span> :<span class="lineCov"> 1 : check_user_status(uid);</span></a>
<a name="1393"><span class="lineNum"> 1393 </span> : : }</a>
<a name="1394"><span class="lineNum"> 1394 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1395"><span class="lineNum"> 1395 </span> : : }</a>
<a name="1396"><span class="lineNum"> 1396 </span> : : </a>
<a name="1397"><span class="lineNum"> 1397 </span> :<span class="lineCov"> 2 : int client_command_move_right(int uid) {</span></a>
<a name="1398"><span class="lineNum"> 1398 </span> :<span class="lineCov"> 2 : log(&quot;user #%d %s\033[2m(%s)\033[0m move right&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="1399"><span class="lineNum"> 1399 </span> :<span class="lineCov"> 2 : int bid = sessions[uid].bid;</span></a>
<a name="1400"><span class="lineNum"> 1400 </span> :<span class="lineCov"> 2 : battles[bid].users[uid].dir = DIR_RIGHT;</span></a>
<a name="1401"><span class="lineNum"> 1401 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (battles[bid].users[uid].pos.x &lt; BATTLE_W - 1) {</span></a>
<a name="1402"><span class="lineNum"> 1402 </span> :<span class="lineCov"> 1 : battles[bid].users[uid].pos.x++;</span></a>
<a name="1403"><span class="lineNum"> 1403 </span> :<span class="lineCov"> 1 : check_user_status(uid);</span></a>
<a name="1404"><span class="lineNum"> 1404 </span> : : }</a>
<a name="1405"><span class="lineNum"> 1405 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1406"><span class="lineNum"> 1406 </span> : : }</a>
<a name="1407"><span class="lineNum"> 1407 </span> : : </a>
<a name="1408"><span class="lineNum"> 1408 </span> :<span class="lineCov"> 5 : int client_command_put_landmine(int uid) {</span></a>
<a name="1409"><span class="lineNum"> 1409 </span> :<span class="lineCov"> 5 : int bid = sessions[uid].bid;</span></a>
<a name="1410"><span class="lineNum"> 1410 </span> : : </a>
<a name="1411"><span class="lineNum"> 1411 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 4 times"> + </span>]:<span class="lineCov"> 5 : if (battles[bid].users[uid].energy &lt; LANDMINE_COST) {</span></a>
<a name="1412"><span class="lineNum"> 1412 </span> : : //send_to_client(uid, SERVER_MESSAGE_YOUR_MAGAZINE_IS_EMPTY);</a>
<a name="1413"><span class="lineNum"> 1413 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1414"><span class="lineNum"> 1414 </span> : : }</a>
<a name="1415"><span class="lineNum"> 1415 </span> :<span class="lineCov"> 4 : int x = battles[bid].users[uid].pos.x;</span></a>
<a name="1416"><span class="lineNum"> 1416 </span> :<span class="lineCov"> 4 : int y = battles[bid].users[uid].pos.y;</span></a>
<a name="1417"><span class="lineNum"> 1417 </span> : : /*</a>
<a name="1418"><span class="lineNum"> 1418 </span> : : if (x &lt; 0 || x &gt;= BATTLE_W) return 1;</a>
<a name="1419"><span class="lineNum"> 1419 </span> : : if (y &lt; 0 || y &gt;= BATTLE_H) return 1;</a>
<a name="1420"><span class="lineNum"> 1420 </span> : : */</a>
<a name="1421"><span class="lineNum"> 1421 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 4 : if ( x &gt;= BATTLE_W) return 1;</span></a>
<a name="1422"><span class="lineNum"> 1422 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : if ( y &gt;= BATTLE_H) return 1;</span></a>
<a name="1423"><span class="lineNum"> 1423 </span> : : //log(&quot;user #%d %s\033[2m(%s)\033[0m put at (%d, %d)&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr, x, y);</a>
<a name="1424"><span class="lineNum"> 1424 </span> :<span class="lineCov"> 2 : item_t new_item;</span></a>
<a name="1425"><span class="lineNum"> 1425 </span> :<span class="lineCov"> 2 : new_item.id = ++battles[bid].item_count;</span></a>
<a name="1426"><span class="lineNum"> 1426 </span> :<span class="lineCov"> 2 : new_item.kind = ITEM_LANDMINE;</span></a>
<a name="1427"><span class="lineNum"> 1427 </span> :<span class="lineCov"> 2 : new_item.owner = uid;</span></a>
<a name="1428"><span class="lineNum"> 1428 </span> :<span class="lineCov"> 2 : new_item.pos.x = x;</span></a>
<a name="1429"><span class="lineNum"> 1429 </span> :<span class="lineCov"> 2 : new_item.pos.y = y;</span></a>
<a name="1430"><span class="lineNum"> 1430 </span> :<span class="lineCov"> 2 : new_item.time = battles[bid].global_time + INF;</span></a>
<a name="1431"><span class="lineNum"> 1431 </span> :<span class="lineCov"> 2 : battles[bid].users[uid].energy -= LANDMINE_COST;</span></a>
<a name="1432"><span class="lineNum"> 1432 </span> : : //battles[bid].items.push_back(new_item);</a>
<a name="1433"><span class="lineNum"> 1433 </span> : : //log(&quot;current item size: %ld&quot;, battles[bid].items.size());</a>
<a name="1434"><span class="lineNum"> 1434 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1435"><span class="lineNum"> 1435 </span> : : }</a>
<a name="1436"><span class="lineNum"> 1436 </span> : : </a>
<a name="1437"><span class="lineNum"> 1437 </span> :<span class="lineCov"> 27 : int client_command_fire(int uid, int delta_x, int delta_y, int dir) {</span></a>
<a name="1438"><span class="lineNum"> 1438 </span> :<span class="lineCov"> 27 : int bid = sessions[uid].bid;</span></a>
<a name="1439"><span class="lineNum"> 1439 </span> : : </a>
<a name="1440"><span class="lineNum"> 1440 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 26 times"> + </span>]:<span class="lineCov"> 27 : if (battles[bid].users[uid].energy &lt;= 0) {</span></a>
<a name="1441"><span class="lineNum"> 1441 </span> : : //send_to_client(uid, SERVER_MESSAGE_YOUR_MAGAZINE_IS_EMPTY);</a>
<a name="1442"><span class="lineNum"> 1442 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1443"><span class="lineNum"> 1443 </span> : : }</a>
<a name="1444"><span class="lineNum"> 1444 </span> :<span class="lineCov"> 26 : int x = battles[bid].users[uid].pos.x + delta_x;</span></a>
<a name="1445"><span class="lineNum"> 1445 </span> :<span class="lineCov"> 26 : int y = battles[bid].users[uid].pos.y + delta_y;</span></a>
<a name="1446"><span class="lineNum"> 1446 </span> [<span class="branchCov" title="Branch 0 was taken 24 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span><span class="branchCov" title="Branch 2 was taken 2 times"> + </span><span class="branchCov" title="Branch 3 was taken 22 times"> + </span>]:<span class="lineCov"> 26 : if (x &lt; 0 || x &gt;= BATTLE_W) return 1;</span></a>
<a name="1447"><span class="lineNum"> 1447 </span> [<span class="branchCov" title="Branch 0 was taken 19 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span><span class="branchCov" title="Branch 2 was taken 2 times"> + </span><span class="branchCov" title="Branch 3 was taken 17 times"> + </span>]:<span class="lineCov"> 22 : if (y &lt; 0 || y &gt;= BATTLE_H) return 1;</span></a>
<a name="1448"><span class="lineNum"> 1448 </span> : : //log(&quot;user #%d %s\033[2m(%s)\033[0m fire %s&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr, dir_s[dir]);</a>
<a name="1449"><span class="lineNum"> 1449 </span> :<span class="lineCov"> 17 : item_t new_item;</span></a>
<a name="1450"><span class="lineNum"> 1450 </span> :<span class="lineCov"> 17 : new_item.id = ++battles[bid].item_count;</span></a>
<a name="1451"><span class="lineNum"> 1451 </span> :<span class="lineCov"> 17 : new_item.kind = ITEM_BULLET;</span></a>
<a name="1452"><span class="lineNum"> 1452 </span> :<span class="lineCov"> 17 : new_item.dir = dir;</span></a>
<a name="1453"><span class="lineNum"> 1453 </span> :<span class="lineCov"> 17 : new_item.owner = uid;</span></a>
<a name="1454"><span class="lineNum"> 1454 </span> :<span class="lineCov"> 17 : new_item.pos.x = x;</span></a>
<a name="1455"><span class="lineNum"> 1455 </span> :<span class="lineCov"> 17 : new_item.pos.y = y;</span></a>
<a name="1456"><span class="lineNum"> 1456 </span> :<span class="lineCov"> 17 : new_item.time = battles[bid].global_time + BULLETS_LASTS_TIME;</span></a>
<a name="1457"><span class="lineNum"> 1457 </span> :<span class="lineCov"> 17 : battles[bid].users[uid].energy--;</span></a>
<a name="1458"><span class="lineNum"> 1458 </span> : : //battles[bid].items.push_back(new_item); // 奇怪的分支 先注释掉</a>
<a name="1459"><span class="lineNum"> 1459 </span> : : //log(&quot;current item size: %ld&quot;, battles[bid].items.size());</a>
<a name="1460"><span class="lineNum"> 1460 </span> :<span class="lineCov"> 17 : return 0;</span></a>
<a name="1461"><span class="lineNum"> 1461 </span> : : }</a>
<a name="1462"><span class="lineNum"> 1462 </span> : : </a>
<a name="1463"><span class="lineNum"> 1463 </span> :<span class="lineCov"> 1 : int client_command_fire_up(int uid) {</span></a>
<a name="1464"><span class="lineNum"> 1464 </span> :<span class="lineCov"> 1 : logi(&quot;client_command_fire&quot;);</span></a>
<a name="1465"><span class="lineNum"> 1465 </span> :<span class="lineCov"> 1 : client_command_fire(uid, 0, 0, DIR_UP);</span></a>
<a name="1466"><span class="lineNum"> 1466 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1467"><span class="lineNum"> 1467 </span> : : }</a>
<a name="1468"><span class="lineNum"> 1468 </span> :<span class="lineCov"> 1 : int client_command_fire_down(int uid) {</span></a>
<a name="1469"><span class="lineNum"> 1469 </span> :<span class="lineCov"> 1 : logi(&quot;client_command_fire&quot;);</span></a>
<a name="1470"><span class="lineNum"> 1470 </span> :<span class="lineCov"> 1 : client_command_fire(uid, 0, 0, DIR_DOWN);</span></a>
<a name="1471"><span class="lineNum"> 1471 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1472"><span class="lineNum"> 1472 </span> : : }</a>
<a name="1473"><span class="lineNum"> 1473 </span> :<span class="lineCov"> 1 : int client_command_fire_left(int uid) {</span></a>
<a name="1474"><span class="lineNum"> 1474 </span> :<span class="lineCov"> 1 : logi(&quot;client_command_fire&quot;);</span></a>
<a name="1475"><span class="lineNum"> 1475 </span> :<span class="lineCov"> 1 : client_command_fire(uid, 0, 0, DIR_LEFT);</span></a>
<a name="1476"><span class="lineNum"> 1476 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1477"><span class="lineNum"> 1477 </span> : : }</a>
<a name="1478"><span class="lineNum"> 1478 </span> :<span class="lineCov"> 1 : int client_command_fire_right(int uid) {</span></a>
<a name="1479"><span class="lineNum"> 1479 </span> :<span class="lineCov"> 1 : logi(&quot;client_command_fire&quot;);</span></a>
<a name="1480"><span class="lineNum"> 1480 </span> :<span class="lineCov"> 1 : client_command_fire(uid, 0, 0, DIR_RIGHT);</span></a>
<a name="1481"><span class="lineNum"> 1481 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1482"><span class="lineNum"> 1482 </span> : : }</a>
<a name="1483"><span class="lineNum"> 1483 </span> : : </a>
<a name="1484"><span class="lineNum"> 1484 </span> :<span class="lineCov"> 1 : int client_command_fire_up_left(int uid) {</span></a>
<a name="1485"><span class="lineNum"> 1485 </span> :<span class="lineCov"> 1 : logi(&quot;client_command_fire&quot;);</span></a>
<a name="1486"><span class="lineNum"> 1486 </span> :<span class="lineCov"> 1 : client_command_fire(uid, 0, 0, DIR_UP_LEFT);</span></a>
<a name="1487"><span class="lineNum"> 1487 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1488"><span class="lineNum"> 1488 </span> : : }</a>
<a name="1489"><span class="lineNum"> 1489 </span> :<span class="lineCov"> 1 : int client_command_fire_up_right(int uid) {</span></a>
<a name="1490"><span class="lineNum"> 1490 </span> :<span class="lineCov"> 1 : logi(&quot;client_command_fire&quot;);</span></a>
<a name="1491"><span class="lineNum"> 1491 </span> :<span class="lineCov"> 1 : client_command_fire(uid, 0, 0, DIR_UP_RIGHT);</span></a>
<a name="1492"><span class="lineNum"> 1492 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1493"><span class="lineNum"> 1493 </span> : : }</a>
<a name="1494"><span class="lineNum"> 1494 </span> :<span class="lineCov"> 1 : int client_command_fire_down_left(int uid) {</span></a>
<a name="1495"><span class="lineNum"> 1495 </span> :<span class="lineCov"> 1 : logi(&quot;client_command_fire&quot;);</span></a>
<a name="1496"><span class="lineNum"> 1496 </span> :<span class="lineCov"> 1 : client_command_fire(uid, 0, 0, DIR_DOWN_LEFT);</span></a>
<a name="1497"><span class="lineNum"> 1497 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1498"><span class="lineNum"> 1498 </span> : : }</a>
<a name="1499"><span class="lineNum"> 1499 </span> :<span class="lineCov"> 1 : int client_command_fire_down_right(int uid) {</span></a>
<a name="1500"><span class="lineNum"> 1500 </span> :<span class="lineCov"> 1 : logi(&quot;client_command_fire&quot;);</span></a>
<a name="1501"><span class="lineNum"> 1501 </span> :<span class="lineCov"> 1 : client_command_fire(uid, 0, 0, DIR_DOWN_RIGHT);</span></a>
<a name="1502"><span class="lineNum"> 1502 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1503"><span class="lineNum"> 1503 </span> : : }</a>
<a name="1504"><span class="lineNum"> 1504 </span> : : </a>
<a name="1505"><span class="lineNum"> 1505 </span> :<span class="lineCov"> 5 : int client_command_fire_aoe(int uid, int dir) {</span></a>
<a name="1506"><span class="lineNum"> 1506 </span> :<span class="lineCov"> 5 : log(&quot;user #%d %s\033[2m(%s)\033[0m fire(aoe) %s&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr, dir_s[dir]);</span></a>
<a name="1507"><span class="lineNum"> 1507 </span> :<span class="lineCov"> 5 : logi(&quot;call client_command_fire&quot;);</span></a>
<a name="1508"><span class="lineNum"> 1508 </span> :<span class="lineCov"> 5 : int limit = battles[sessions[uid].bid].users[uid].energy / 2, cnt = 0;</span></a>
<a name="1509"><span class="lineNum"> 1509 </span> [<span class="branchCov" title="Branch 0 was taken 9 times"> + </span><span class="branchCov" title="Branch 1 was taken 5 times"> + </span>]:<span class="lineCov"> 14 : for (int i = 0; limit; i++) {</span></a>
<a name="1510"><span class="lineNum"> 1510 </span> [<span class="branchCov" title="Branch 0 was taken 15 times"> + </span><span class="branchCov" title="Branch 1 was taken 6 times"> + </span><span class="branchCov" title="Branch 2 was taken 12 times"> + </span><span class="branchCov" title="Branch 3 was taken 3 times"> + </span>]:<span class="lineCov"> 21 : for (int j = -i; j &lt;= i &amp;&amp; limit; j++) {</span></a>
<a name="1511"><span class="lineNum"> 1511 </span> [<span class="branchCov" title="Branch 0 was taken 4 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span><span class="branchCov" title="Branch 2 was taken 2 times"> + </span><span class="branchCov" title="Branch 3 was taken 2 times"> + </span> :<span class="lineCov"> 12 : switch (dir) {</span></a>
<span class="lineNum"> </span> <span class="branchCov" title="Branch 4 was taken 1 time"> + </span>]
<a name="1512"><span class="lineNum"> 1512 </span> :<span class="lineCov"> 4 : case DIR_UP: {</span></a>
<a name="1513"><span class="lineNum"> 1513 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 4 : if (client_command_fire(uid, j, -i + abs(j), dir) == 0) cnt++;</span></a>
<a name="1514"><span class="lineNum"> 1514 </span> :<span class="lineCov"> 4 : break;</span></a>
<a name="1515"><span class="lineNum"> 1515 </span> : : }</a>
<a name="1516"><span class="lineNum"> 1516 </span> :<span class="lineCov"> 3 : case DIR_DOWN: {</span></a>
<a name="1517"><span class="lineNum"> 1517 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (client_command_fire(uid, j, i - abs(j), dir) == 0) cnt++;</span></a>
<a name="1518"><span class="lineNum"> 1518 </span> :<span class="lineCov"> 3 : break;</span></a>
<a name="1519"><span class="lineNum"> 1519 </span> : : }</a>
<a name="1520"><span class="lineNum"> 1520 </span> :<span class="lineCov"> 2 : case DIR_LEFT: {</span></a>
<a name="1521"><span class="lineNum"> 1521 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (client_command_fire(uid, -i + abs(j), j, dir) == 0) cnt++;</span></a>
<a name="1522"><span class="lineNum"> 1522 </span> :<span class="lineCov"> 2 : break;</span></a>
<a name="1523"><span class="lineNum"> 1523 </span> : : }</a>
<a name="1524"><span class="lineNum"> 1524 </span> :<span class="lineCov"> 2 : case DIR_RIGHT: {</span></a>
<a name="1525"><span class="lineNum"> 1525 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (client_command_fire(uid, i - abs(j), j, dir) == 0) cnt++;</span></a>
<a name="1526"><span class="lineNum"> 1526 </span> :<span class="lineCov"> 2 : break;</span></a>
<a name="1527"><span class="lineNum"> 1527 </span> : : }</a>
<a name="1528"><span class="lineNum"> 1528 </span> : : }</a>
<a name="1529"><span class="lineNum"> 1529 </span> :<span class="lineCov"> 12 : limit--;</span></a>
<a name="1530"><span class="lineNum"> 1530 </span> : : }</a>
<a name="1531"><span class="lineNum"> 1531 </span> : : }</a>
<a name="1532"><span class="lineNum"> 1532 </span> :<span class="lineCov"> 5 : log(&quot;created %d bullets&quot;, cnt);</span></a>
<a name="1533"><span class="lineNum"> 1533 </span> :<span class="lineCov"> 5 : return 0;</span></a>
<a name="1534"><span class="lineNum"> 1534 </span> : : }</a>
<a name="1535"><span class="lineNum"> 1535 </span> : : </a>
<a name="1536"><span class="lineNum"> 1536 </span> :<span class="lineCov"> 1 : int client_command_fire_aoe_up(int uid) {</span></a>
<a name="1537"><span class="lineNum"> 1537 </span> :<span class="lineCov"> 1 : logi(&quot;call client_command_fire_aoe&quot;);</span></a>
<a name="1538"><span class="lineNum"> 1538 </span> :<span class="lineCov"> 1 : return client_command_fire_aoe(uid, DIR_UP);</span></a>
<a name="1539"><span class="lineNum"> 1539 </span> : : }</a>
<a name="1540"><span class="lineNum"> 1540 </span> :<span class="lineCov"> 1 : int client_command_fire_aoe_down(int uid) {</span></a>
<a name="1541"><span class="lineNum"> 1541 </span> :<span class="lineCov"> 1 : logi(&quot;call client_command_fire_aoe&quot;);</span></a>
<a name="1542"><span class="lineNum"> 1542 </span> :<span class="lineCov"> 1 : return client_command_fire_aoe(uid, DIR_DOWN);</span></a>
<a name="1543"><span class="lineNum"> 1543 </span> : : }</a>
<a name="1544"><span class="lineNum"> 1544 </span> :<span class="lineCov"> 1 : int client_command_fire_aoe_left(int uid) {</span></a>
<a name="1545"><span class="lineNum"> 1545 </span> :<span class="lineCov"> 1 : logi(&quot;call client_command_fire_aoe&quot;);</span></a>
<a name="1546"><span class="lineNum"> 1546 </span> :<span class="lineCov"> 1 : return client_command_fire_aoe(uid, DIR_LEFT);</span></a>
<a name="1547"><span class="lineNum"> 1547 </span> : : }</a>
<a name="1548"><span class="lineNum"> 1548 </span> :<span class="lineCov"> 1 : int client_command_fire_aoe_right(int uid) {</span></a>
<a name="1549"><span class="lineNum"> 1549 </span> :<span class="lineCov"> 1 : logi(&quot;call client_command_fire_aoe&quot;);</span></a>
<a name="1550"><span class="lineNum"> 1550 </span> :<span class="lineCov"> 1 : return client_command_fire_aoe(uid, DIR_RIGHT);</span></a>
<a name="1551"><span class="lineNum"> 1551 </span> : : }</a>
<a name="1552"><span class="lineNum"> 1552 </span> : : </a>
<a name="1553"><span class="lineNum"> 1553 </span> :<span class="lineCov"> 2 : int client_command_melee(int uid) {</span></a>
<a name="1554"><span class="lineNum"> 1554 </span> :<span class="lineCov"> 2 : int bid = sessions[uid].bid;</span></a>
<a name="1555"><span class="lineNum"> 1555 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (battles[bid].users[uid].life &lt;= 0) return 0;</span></a>
<a name="1556"><span class="lineNum"> 1556 </span> :<span class="lineCov"> 1 : int dir = battles[bid].users[uid].dir;</span></a>
<a name="1557"><span class="lineNum"> 1557 </span> :<span class="lineCov"> 1 : int x = battles[bid].users[uid].pos.x;</span></a>
<a name="1558"><span class="lineNum"> 1558 </span> :<span class="lineCov"> 1 : int y = battles[bid].users[uid].pos.y;</span></a>
<a name="1559"><span class="lineNum"> 1559 </span> :<span class="lineCov"> 1 : log(&quot;user #%d %s\033[2m(%s)\033[0m melee %s&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr, dir_s[dir]);</span></a>
<a name="1560"><span class="lineNum"> 1560 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 4 : for (int i = 1; i &lt;= 3; i++) {</span></a>
<a name="1561"><span class="lineNum"> 1561 </span> :<span class="lineCov"> 3 : forced_generate_items(bid, </span></a>
<a name="1562"><span class="lineNum"> 1562 </span> :<span class="lineCov"> 3 : x + dir_offset[dir].x * i,</span></a>
<a name="1563"><span class="lineNum"> 1563 </span> :<span class="lineCov"> 3 : y + dir_offset[dir].y * i,</span></a>
<a name="1564"><span class="lineNum"> 1564 </span> : : ITEM_MAGMA,</a>
<a name="1565"><span class="lineNum"> 1565 </span> : : 3,</a>
<a name="1566"><span class="lineNum"> 1566 </span> : : uid);</a>
<a name="1567"><span class="lineNum"> 1567 </span> : : }</a>
<a name="1568"><span class="lineNum"> 1568 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1569"><span class="lineNum"> 1569 </span> : : }</a>
<a name="1570"><span class="lineNum"> 1570 </span> : : </a>
<a name="1571"><span class="lineNum"> 1571 </span> :<span class="lineCov"> 5 : int admin_set_admin(int argc, char** argv) {</span></a>
<a name="1572"><span class="lineNum"> 1572 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 4 times"> + </span>]:<span class="lineCov"> 5 : if (argc &lt; 3) return -1;</span></a>
<a name="1573"><span class="lineNum"> 1573 </span> :<span class="lineCov"> 4 : cout&lt;&lt;&quot;username: &quot;&lt;&lt;argv[1]&lt;&lt;&quot; status: &quot;&lt;&lt;atoi(argv[2])&lt;&lt;&quot; uid:&quot;;</span></a>
<a name="1574"><span class="lineNum"> 1574 </span> :<span class="lineCov"> 4 : cout&lt;&lt;find_uid_by_user_name(argv[1])&lt;&lt;endl;</span></a>
<a name="1575"><span class="lineNum"> 1575 </span> :<span class="lineCov"> 4 : int uid = find_uid_by_user_name(argv[1]),status = atoi(argv[2]);</span></a>
<a name="1576"><span class="lineNum"> 1576 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 4 : if (uid &lt; 0 ||</span></a>
<a name="1577"><span class="lineNum"> 1577 </span> : : // uid &gt;= USER_CNT ||</a>
<a name="1578"><span class="lineNum"> 1578 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : sessions[uid].conn &lt; 0) {</span></a>
<a name="1579"><span class="lineNum"> 1579 </span> :<span class="lineCov"> 2 : return -1;</span></a>
<a name="1580"><span class="lineNum"> 1580 </span> : : }</a>
<a name="1581"><span class="lineNum"> 1581 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (status)</span></a>
<a name="1582"><span class="lineNum"> 1582 </span> :<span class="lineCov"> 1 : log(&quot;admin set user #%d admin&quot;, uid);</span></a>
<a name="1583"><span class="lineNum"> 1583 </span> : : else</a>
<a name="1584"><span class="lineNum"> 1584 </span> :<span class="lineCov"> 1 : log(&quot;admin set user #%d non-admin&quot;, uid);</span></a>
<a name="1585"><span class="lineNum"> 1585 </span> :<span class="lineCov"> 2 : sessions[uid].is_admin = status;</span></a>
<a name="1586"><span class="lineNum"> 1586 </span> [<span class="branchCov" title="Branch 0 was taken 28 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 30 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1587"><span class="lineNum"> 1587 </span> [<span class="branchCov" title="Branch 0 was taken 26 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 28 : if (sessions[i].conn &gt;= 0) {</span></a>
<a name="1588"><span class="lineNum"> 1588 </span> [<span class="branchCov" title="Branch 0 was taken 13 times"> + </span><span class="branchCov" title="Branch 1 was taken 13 times"> + </span>]:<span class="lineCov"> 26 : if (status) {</span></a>
<a name="1589"><span class="lineNum"> 1589 </span> :<span class="lineCov"> 13 : say_to_client(i, sformat(&quot;admin set user #%d %s to admin&quot;, uid, sessions[uid].user_name));</span></a>
<a name="1590"><span class="lineNum"> 1590 </span> : : } else {</a>
<a name="1591"><span class="lineNum"> 1591 </span> :<span class="lineCov"> 13 : say_to_client(i, sformat(&quot;admin set user #%d %s to non-admin&quot;, uid, sessions[uid].user_name));</span></a>
<a name="1592"><span class="lineNum"> 1592 </span> : : }</a>
<a name="1593"><span class="lineNum"> 1593 </span> : : }</a>
<a name="1594"><span class="lineNum"> 1594 </span> : : }</a>
<a name="1595"><span class="lineNum"> 1595 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1596"><span class="lineNum"> 1596 </span> : : }</a>
<a name="1597"><span class="lineNum"> 1597 </span> : : </a>
<a name="1598"><span class="lineNum"> 1598 </span> :<span class="lineCov"> 5 : int admin_set_energy(int argc, char** argv) {</span></a>
<a name="1599"><span class="lineNum"> 1599 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 4 times"> + </span>]:<span class="lineCov"> 5 : if (argc &lt; 3) return -1;</span></a>
<a name="1600"><span class="lineNum"> 1600 </span> :<span class="lineCov"> 4 : int uid = find_uid_by_user_name(argv[1]), energy = atoi(argv[2]);</span></a>
<a name="1601"><span class="lineNum"> 1601 </span> :<span class="lineCov"> 4 : log(&quot;admin set user #%d's energy&quot;, uid);</span></a>
<a name="1602"><span class="lineNum"> 1602 </span> :<span class="lineCov"> 4 : cout&lt;&lt;&quot;uid:&quot;&lt;&lt;uid&lt;&lt;&quot; conn:&quot;&lt;&lt;sessions[uid].conn&lt;&lt;&quot; energy:&quot;&lt;&lt;energy&lt;&lt;endl;</span></a>
<a name="1603"><span class="lineNum"> 1603 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 4 : if (uid &lt; 0 || //uid &gt;= USER_CNT ||</span></a>
<a name="1604"><span class="lineNum"> 1604 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span><span class="branchCov" title="Branch 2 was taken 1 time"> + </span><span class="branchCov" title="Branch 3 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : sessions[uid].conn &lt; 0 ||</span></a>
<a name="1605"><span class="lineNum"> 1605 </span> : : energy &lt; 0) {</a>
<a name="1606"><span class="lineNum"> 1606 </span> :<span class="lineCov"> 3 : return -1;</span></a>
<a name="1607"><span class="lineNum"> 1607 </span> : : }</a>
<a name="1608"><span class="lineNum"> 1608 </span> :<span class="lineCov"> 1 : log(&quot;admin set user #%d %s's energy to %d&quot;, uid, sessions[uid].user_name, energy);</span></a>
<a name="1609"><span class="lineNum"> 1609 </span> :<span class="lineCov"> 1 : battles[sessions[uid].bid].users[uid].energy = energy;</span></a>
<a name="1610"><span class="lineNum"> 1610 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 15 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1611"><span class="lineNum"> 1611 </span> [<span class="branchCov" title="Branch 0 was taken 13 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 14 : if (sessions[i].conn &gt;= 0) {</span></a>
<a name="1612"><span class="lineNum"> 1612 </span> :<span class="lineCov"> 13 : say_to_client(i, sformat(&quot;admin set user #%d %s's energy to %d&quot;, uid, sessions[uid].user_name, energy));</span></a>
<a name="1613"><span class="lineNum"> 1613 </span> : : }</a>
<a name="1614"><span class="lineNum"> 1614 </span> : : }</a>
<a name="1615"><span class="lineNum"> 1615 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1616"><span class="lineNum"> 1616 </span> : : }</a>
<a name="1617"><span class="lineNum"> 1617 </span> : : </a>
<a name="1618"><span class="lineNum"> 1618 </span> :<span class="lineCov"> 5 : int admin_set_hp(int argc, char** argv) {</span></a>
<a name="1619"><span class="lineNum"> 1619 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 4 times"> + </span>]:<span class="lineCov"> 5 : if (argc &lt; 3) return -1;</span></a>
<a name="1620"><span class="lineNum"> 1620 </span> :<span class="lineCov"> 4 : int uid = find_uid_by_user_name(argv[1]), hp = atoi(argv[2]);</span></a>
<a name="1621"><span class="lineNum"> 1621 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 4 : if (uid &lt; 0 || //uid &gt;= USER_CNT||</span></a>
<a name="1622"><span class="lineNum"> 1622 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span><span class="branchCov" title="Branch 2 was taken 1 time"> + </span><span class="branchCov" title="Branch 3 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : sessions[uid].conn &lt; 0 ||</span></a>
<a name="1623"><span class="lineNum"> 1623 </span> : : hp &lt; 0) {</a>
<a name="1624"><span class="lineNum"> 1624 </span> :<span class="lineCov"> 3 : return -1;</span></a>
<a name="1625"><span class="lineNum"> 1625 </span> : : }</a>
<a name="1626"><span class="lineNum"> 1626 </span> :<span class="lineCov"> 1 : log(&quot;admin set user #%d %s's hp to %d&quot;, uid, sessions[uid].user_name, hp);</span></a>
<a name="1627"><span class="lineNum"> 1627 </span> :<span class="lineCov"> 1 : battles[sessions[uid].bid].users[uid].life = hp;</span></a>
<a name="1628"><span class="lineNum"> 1628 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 15 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1629"><span class="lineNum"> 1629 </span> [<span class="branchCov" title="Branch 0 was taken 13 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 14 : if (sessions[i].conn &gt;= 0) {</span></a>
<a name="1630"><span class="lineNum"> 1630 </span> :<span class="lineCov"> 13 : say_to_client(i, sformat(&quot;admin set user #%d %s's hp to %d&quot;, uid, sessions[uid].user_name, hp));</span></a>
<a name="1631"><span class="lineNum"> 1631 </span> : : }</a>
<a name="1632"><span class="lineNum"> 1632 </span> : : }</a>
<a name="1633"><span class="lineNum"> 1633 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1634"><span class="lineNum"> 1634 </span> : : }</a>
<a name="1635"><span class="lineNum"> 1635 </span> : : </a>
<a name="1636"><span class="lineNum"> 1636 </span> :<span class="lineCov"> 9 : int admin_set_pos(int argc, char** argv) {</span></a>
<a name="1637"><span class="lineNum"> 1637 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 8 times"> + </span>]:<span class="lineCov"> 9 : if (argc &lt; 4) return -1;</span></a>
<a name="1638"><span class="lineNum"> 1638 </span> :<span class="lineCov"> 8 : int uid = find_uid_by_user_name(argv[1]);</span></a>
<a name="1639"><span class="lineNum"> 1639 </span> :<span class="lineCov"> 8 : int x = atoi(argv[2]), y = atoi(argv[3]);</span></a>
<a name="1640"><span class="lineNum"> 1640 </span> :<span class="lineCov"> 8 : cout&lt;&lt;&quot;x:&quot;&lt;&lt;atoi(argv[2])&lt;&lt;&quot;y:&quot;&lt;&lt;atoi(argv[3])&lt;&lt;endl;</span></a>
<a name="1641"><span class="lineNum"> 1641 </span> :<span class="lineCov"> 8 : cout&lt;&lt;&quot;uid: &quot;&lt;&lt;uid&lt;&lt;&quot;conn: &quot;&lt;&lt;sessions[uid].conn&lt;&lt;endl;</span></a>
<a name="1642"><span class="lineNum"> 1642 </span> [<span class="branchCov" title="Branch 0 was taken 7 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 8 : if (uid &lt; 0 || //uid &gt;= USER_CNT ||</span></a>
<a name="1643"><span class="lineNum"> 1643 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 6 times"> + </span>]:<span class="lineCov"> 7 : sessions[uid].conn &lt; 0) {</span></a>
<a name="1644"><span class="lineNum"> 1644 </span> :<span class="lineCov"> 2 : return -1;</span></a>
<a name="1645"><span class="lineNum"> 1645 </span> : : }</a>
<a name="1646"><span class="lineNum"> 1646 </span> :<span class="lineCov"> 6 : cout&lt;&lt;&quot;x:&quot;&lt;&lt;x&lt;&lt;&quot;y:&quot;&lt;&lt;y&lt;&lt;endl;</span></a>
<a name="1647"><span class="lineNum"> 1647 </span> [<span class="branchCov" title="Branch 0 was taken 4 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span><span class="branchCov" title="Branch 2 was taken 1 time"> + </span><span class="branchCov" title="Branch 3 was taken 3 times"> + </span>]:<span class="lineCov"> 6 : if (x &lt; 0 || x &gt;= BATTLE_W) return -1;</span></a>
<a name="1648"><span class="lineNum"> 1648 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span><span class="branchCov" title="Branch 2 was taken 1 time"> + </span><span class="branchCov" title="Branch 3 was taken 1 time"> + </span>]:<span class="lineCov"> 3 : if (y &lt; 0 || y &gt;= BATTLE_H) return -1;</span></a>
<a name="1649"><span class="lineNum"> 1649 </span> :<span class="lineCov"> 1 : log(&quot;admin set user #%d %s's pos to (%d, %d)&quot;, uid, sessions[uid].user_name, x, y);</span></a>
<a name="1650"><span class="lineNum"> 1650 </span> :<span class="lineCov"> 1 : battles[sessions[uid].bid].users[uid].pos.x = x;</span></a>
<a name="1651"><span class="lineNum"> 1651 </span> :<span class="lineCov"> 1 : battles[sessions[uid].bid].users[uid].pos.y = y;</span></a>
<a name="1652"><span class="lineNum"> 1652 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1653"><span class="lineNum"> 1653 </span> : : }</a>
<a name="1654"><span class="lineNum"> 1654 </span> : : </a>
<a name="1655"><span class="lineNum"> 1655 </span> :<span class="lineCov"> 4 : int admin_ban_user(int argc, char** argv) {</span></a>
<a name="1656"><span class="lineNum"> 1656 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 4 : if (argc &lt; 2) return -1;</span></a>
<a name="1657"><span class="lineNum"> 1657 </span> :<span class="lineCov"> 3 : int uid = find_uid_by_user_name(argv[1]);</span></a>
<a name="1658"><span class="lineNum"> 1658 </span> :<span class="lineCov"> 3 : log(&quot;admin ban user #%d&quot;, uid);</span></a>
<a name="1659"><span class="lineNum"> 1659 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 3 : if (uid &lt; 0 // || uid &gt;= USER_CNT</span></a>
<a name="1660"><span class="lineNum"> 1660 </span> : : ) {</a>
<a name="1661"><span class="lineNum"> 1661 </span> :<span class="lineCov"> 1 : logi(&quot;fail&quot;);</span></a>
<a name="1662"><span class="lineNum"> 1662 </span> :<span class="lineCov"> 1 : return -1;</span></a>
<a name="1663"><span class="lineNum"> 1663 </span> : : }</a>
<a name="1664"><span class="lineNum"> 1664 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (sessions[uid].conn &gt;= 0) {</span></a>
<a name="1665"><span class="lineNum"> 1665 </span> :<span class="lineCov"> 1 : log(&quot;admin banned user #%d %s\033[2m(%s)\033[0m&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="1666"><span class="lineNum"> 1666 </span> :<span class="lineCov"> 1 : send_to_client(</span></a>
<a name="1667"><span class="lineNum"> 1667 </span> : : uid, SERVER_STATUS_QUIT,</a>
<a name="1668"><span class="lineNum"> 1668 </span> : : (char*)&quot; (you were banned by admin)&quot;);</a>
<a name="1669"><span class="lineNum"> 1669 </span> :<span class="lineCov"> 1 : client_command_quit(uid);</span></a>
<a name="1670"><span class="lineNum"> 1670 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 15 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1671"><span class="lineNum"> 1671 </span> [<span class="branchCov" title="Branch 0 was taken 12 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 14 : if (sessions[i].conn &gt;= 0) {</span></a>
<a name="1672"><span class="lineNum"> 1672 </span> :<span class="lineCov"> 12 : say_to_client(i, sformat(&quot;admin banned user #%d %s\033[2m(%s)\033[0m&quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr));</span></a>
<a name="1673"><span class="lineNum"> 1673 </span> : : }</a>
<a name="1674"><span class="lineNum"> 1674 </span> : : }</a>
<a name="1675"><span class="lineNum"> 1675 </span> : : }</a>
<a name="1676"><span class="lineNum"> 1676 </span> :<span class="lineCov"> 2 : return 0;</span></a>
<a name="1677"><span class="lineNum"> 1677 </span> : : }</a>
<a name="1678"><span class="lineNum"> 1678 </span> : : </a>
<a name="1679"><span class="lineNum"> 1679 </span> : : static struct {</a>
<a name="1680"><span class="lineNum"> 1680 </span> : : const char* cmd;</a>
<a name="1681"><span class="lineNum"> 1681 </span> : : int (*func)(int argc, char** argv);</a>
<a name="1682"><span class="lineNum"> 1682 </span> : : } admin_handler[] = {</a>
<a name="1683"><span class="lineNum"> 1683 </span> : : {&quot;ban&quot;, admin_ban_user},</a>
<a name="1684"><span class="lineNum"> 1684 </span> : : {&quot;eng&quot;, admin_set_energy},</a>
<a name="1685"><span class="lineNum"> 1685 </span> : : {&quot;energy&quot;, admin_set_energy},</a>
<a name="1686"><span class="lineNum"> 1686 </span> : : {&quot;hp&quot;, admin_set_hp},</a>
<a name="1687"><span class="lineNum"> 1687 </span> : : {&quot;setadmin&quot;, admin_set_admin},</a>
<a name="1688"><span class="lineNum"> 1688 </span> : : {&quot;pos&quot;, admin_set_pos},</a>
<a name="1689"><span class="lineNum"> 1689 </span> : : };</a>
<a name="1690"><span class="lineNum"> 1690 </span> : : </a>
<a name="1691"><span class="lineNum"> 1691 </span> : : #define NR_HANDLER ((int)sizeof(admin_handler) / (int)sizeof(admin_handler[0]))</a>
<a name="1692"><span class="lineNum"> 1692 </span> : : </a>
<a name="1693"><span class="lineNum"> 1693 </span> :<span class="lineCov"> 2 : int client_command_admin_control(int uid) {</span></a>
<a name="1694"><span class="lineNum"> 1694 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (!sessions[uid].is_admin) {</span></a>
<a name="1695"><span class="lineNum"> 1695 </span> : : //say_to_client(uid, (char*)&quot;you are not admin&quot;);</a>
<a name="1696"><span class="lineNum"> 1696 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1697"><span class="lineNum"> 1697 </span> : : }</a>
<a name="1698"><span class="lineNum"> 1698 </span> :<span class="lineCov"> 1 : client_message_t* pcm = &amp;sessions[uid].cm;</span></a>
<a name="1699"><span class="lineNum"> 1699 </span> :<span class="lineCov"> 1 : char *buff = (char*)pcm-&gt;message;</span></a>
<a name="1700"><span class="lineNum"> 1700 </span> : : //log(&quot;analysis command `%s`&quot;, buff);</a>
<a name="1701"><span class="lineNum"> 1701 </span> : : /*</a>
<a name="1702"><span class="lineNum"> 1702 </span> : : char *go = buff, *argv[ADMIN_COMMAND_LEN];</a>
<a name="1703"><span class="lineNum"> 1703 </span> : : int argc = 0;</a>
<a name="1704"><span class="lineNum"> 1704 </span> : : while (*go != 0) {</a>
<a name="1705"><span class="lineNum"> 1705 </span> : : if (!isspace(*go)) {</a>
<a name="1706"><span class="lineNum"> 1706 </span> : : argv[argc] = go;</a>
<a name="1707"><span class="lineNum"> 1707 </span> : : argc++;</a>
<a name="1708"><span class="lineNum"> 1708 </span> : : char c = (*go == '&quot;') ? '&quot;' : ' ';</a>
<a name="1709"><span class="lineNum"> 1709 </span> : : while ((*go != 0) &amp;&amp; (*go != c)) go++;</a>
<a name="1710"><span class="lineNum"> 1710 </span> : : if (*go == 0) break;</a>
<a name="1711"><span class="lineNum"> 1711 </span> : : *go = 0;</a>
<a name="1712"><span class="lineNum"> 1712 </span> : : }</a>
<a name="1713"><span class="lineNum"> 1713 </span> : : go++;</a>
<a name="1714"><span class="lineNum"> 1714 </span> : : }</a>
<a name="1715"><span class="lineNum"> 1715 </span> : : if (argc) {</a>
<a name="1716"><span class="lineNum"> 1716 </span> : : argv[argc] = NULL;</a>
<a name="1717"><span class="lineNum"> 1717 </span> : : for (int i = 0; i &lt; NR_HANDLER; i++) {</a>
<a name="1718"><span class="lineNum"> 1718 </span> : : if (strcmp(argv[0], admin_handler[i].cmd) == 0) {</a>
<a name="1719"><span class="lineNum"> 1719 </span> : : if (admin_handler[i].func(argc, argv)) {</a>
<a name="1720"><span class="lineNum"> 1720 </span> : : int s = 0;</a>
<a name="1721"><span class="lineNum"> 1721 </span> : : //say_to_client(uid, (char*)&quot;invalid command!&quot;);</a>
<a name="1722"><span class="lineNum"> 1722 </span> : : }</a>
<a name="1723"><span class="lineNum"> 1723 </span> : : return 0;</a>
<a name="1724"><span class="lineNum"> 1724 </span> : : }</a>
<a name="1725"><span class="lineNum"> 1725 </span> : : }</a>
<a name="1726"><span class="lineNum"> 1726 </span> : : }</a>
<a name="1727"><span class="lineNum"> 1727 </span> : : */</a>
<a name="1728"><span class="lineNum"> 1728 </span> : : //say_to_client(uid, (char*)&quot;invalid command!&quot;);</a>
<a name="1729"><span class="lineNum"> 1729 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1730"><span class="lineNum"> 1730 </span> : : }</a>
<a name="1731"><span class="lineNum"> 1731 </span> : : </a>
<a name="1732"><span class="lineNum"> 1732 </span> :<span class="lineCov"> 1 : int client_message_fatal(int uid) {</span></a>
<a name="1733"><span class="lineNum"> 1733 </span> :<span class="lineCov"> 1 : loge(&quot;received FATAL from user #%d %s\033[2m(%s)\033[0m &quot;, uid, sessions[uid].user_name, sessions[uid].ip_addr);</span></a>
<a name="1734"><span class="lineNum"> 1734 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 15 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1735"><span class="lineNum"> 1735 </span> [<span class="branchCov" title="Branch 0 was taken 12 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 14 : if (sessions[i].conn &gt;= 0) {</span></a>
<a name="1736"><span class="lineNum"> 1736 </span> :<span class="lineCov"> 12 : send_to_client(i, SERVER_STATUS_FATAL);</span></a>
<a name="1737"><span class="lineNum"> 1737 </span> :<span class="lineCov"> 12 : log(&quot;send FATAL to user #%d %s\033[2m(%s)\033[0m&quot;, i, sessions[i].user_name, sessions[i].ip_addr);</span></a>
<a name="1738"><span class="lineNum"> 1738 </span> : : }</a>
<a name="1739"><span class="lineNum"> 1739 </span> : : }</a>
<a name="1740"><span class="lineNum"> 1740 </span> : : //terminate_process(0);</a>
<a name="1741"><span class="lineNum"> 1741 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="1742"><span class="lineNum"> 1742 </span> : : }</a>
<a name="1743"><span class="lineNum"> 1743 </span> : : </a>
<a name="1744"><span class="lineNum"> 1744 </span> : : static int (*handler[256])(int);</a>
<a name="1745"><span class="lineNum"> 1745 </span> : : </a>
<a name="1746"><span class="lineNum"> 1746 </span> :<span class="lineCov"> 1 : void init_handler() {</span></a>
<a name="1747"><span class="lineNum"> 1747 </span> :<span class="lineCov"> 1 : handler[CLIENT_MESSAGE_FATAL] = client_message_fatal,</span></a>
<a name="1748"><span class="lineNum"> 1748 </span> : : </a>
<a name="1749"><span class="lineNum"> 1749 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_USER_QUIT] = client_command_quit,</span></a>
<a name="1750"><span class="lineNum"> 1750 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_USER_REGISTER] = client_command_user_register,</span></a>
<a name="1751"><span class="lineNum"> 1751 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_USER_LOGIN] = client_command_user_login,</span></a>
<a name="1752"><span class="lineNum"> 1752 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_USER_LOGOUT] = client_command_user_logout,</span></a>
<a name="1753"><span class="lineNum"> 1753 </span> : : </a>
<a name="1754"><span class="lineNum"> 1754 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FETCH_ALL_USERS] = client_command_fetch_all_users,</span></a>
<a name="1755"><span class="lineNum"> 1755 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FETCH_ALL_FRIENDS] = client_command_fetch_all_friends,</span></a>
<a name="1756"><span class="lineNum"> 1756 </span> : : </a>
<a name="1757"><span class="lineNum"> 1757 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_LAUNCH_BATTLE] = client_command_launch_battle,</span></a>
<a name="1758"><span class="lineNum"> 1758 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_QUIT_BATTLE] = client_command_quit_battle,</span></a>
<a name="1759"><span class="lineNum"> 1759 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_ACCEPT_BATTLE] = client_command_accept_battle,</span></a>
<a name="1760"><span class="lineNum"> 1760 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_LAUNCH_FFA] = client_command_launch_ffa,</span></a>
<a name="1761"><span class="lineNum"> 1761 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_REJECT_BATTLE] = client_command_reject_battle,</span></a>
<a name="1762"><span class="lineNum"> 1762 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_INVITE_USER] = client_command_invite_user,</span></a>
<a name="1763"><span class="lineNum"> 1763 </span> : : </a>
<a name="1764"><span class="lineNum"> 1764 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_SEND_MESSAGE] = client_command_send_message,</span></a>
<a name="1765"><span class="lineNum"> 1765 </span> : : </a>
<a name="1766"><span class="lineNum"> 1766 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MOVE_UP] = client_command_move_up,</span></a>
<a name="1767"><span class="lineNum"> 1767 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MOVE_DOWN] = client_command_move_down,</span></a>
<a name="1768"><span class="lineNum"> 1768 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MOVE_LEFT] = client_command_move_left,</span></a>
<a name="1769"><span class="lineNum"> 1769 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MOVE_RIGHT] = client_command_move_right,</span></a>
<a name="1770"><span class="lineNum"> 1770 </span> : : </a>
<a name="1771"><span class="lineNum"> 1771 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_PUT_LANDMINE] = client_command_put_landmine,</span></a>
<a name="1772"><span class="lineNum"> 1772 </span> : : </a>
<a name="1773"><span class="lineNum"> 1773 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MELEE] = client_command_melee,</span></a>
<a name="1774"><span class="lineNum"> 1774 </span> : : </a>
<a name="1775"><span class="lineNum"> 1775 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_UP] = client_command_fire_up,</span></a>
<a name="1776"><span class="lineNum"> 1776 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_DOWN] = client_command_fire_down,</span></a>
<a name="1777"><span class="lineNum"> 1777 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_LEFT] = client_command_fire_left,</span></a>
<a name="1778"><span class="lineNum"> 1778 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_RIGHT] = client_command_fire_right,</span></a>
<a name="1779"><span class="lineNum"> 1779 </span> : : </a>
<a name="1780"><span class="lineNum"> 1780 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_UP_LEFT] = client_command_fire_up_left,</span></a>
<a name="1781"><span class="lineNum"> 1781 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_UP_RIGHT] = client_command_fire_up_right,</span></a>
<a name="1782"><span class="lineNum"> 1782 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_DOWN_LEFT] = client_command_fire_down_left,</span></a>
<a name="1783"><span class="lineNum"> 1783 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_DOWN_RIGHT] = client_command_fire_down_right,</span></a>
<a name="1784"><span class="lineNum"> 1784 </span> : : </a>
<a name="1785"><span class="lineNum"> 1785 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_AOE_UP] = client_command_fire_aoe_up,</span></a>
<a name="1786"><span class="lineNum"> 1786 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_AOE_DOWN] = client_command_fire_aoe_down,</span></a>
<a name="1787"><span class="lineNum"> 1787 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_AOE_LEFT] = client_command_fire_aoe_left,</span></a>
<a name="1788"><span class="lineNum"> 1788 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_AOE_RIGHT] = client_command_fire_aoe_right;</span></a>
<a name="1789"><span class="lineNum"> 1789 </span> : : </a>
<a name="1790"><span class="lineNum"> 1790 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_ADMIN_CONTROL] = client_command_admin_control;</span></a>
<a name="1791"><span class="lineNum"> 1791 </span> : : </a>
<a name="1792"><span class="lineNum"> 1792 </span> :<span class="lineCov"> 1 : }</span></a>
<a name="1793"><span class="lineNum"> 1793 </span> : : </a>
<a name="1794"><span class="lineNum"> 1794 </span> : : /*</a>
<a name="1795"><span class="lineNum"> 1795 </span> : : void wrap_recv(int conn, client_message_t* pcm) {</a>
<a name="1796"><span class="lineNum"> 1796 </span> : : size_t total_len = 0;</a>
<a name="1797"><span class="lineNum"> 1797 </span> : : while (total_len &lt; sizeof(client_message_t)) {</a>
<a name="1798"><span class="lineNum"> 1798 </span> : : size_t len = recv(conn, pcm + total_len, sizeof(client_message_t) - total_len, 0);</a>
<a name="1799"><span class="lineNum"> 1799 </span> : : if (len &lt; 0) {</a>
<a name="1800"><span class="lineNum"> 1800 </span> : : loge(&quot;broken pipe&quot;);</a>
<a name="1801"><span class="lineNum"> 1801 </span> : : }</a>
<a name="1802"><span class="lineNum"> 1802 </span> : : </a>
<a name="1803"><span class="lineNum"> 1803 </span> : : total_len += len;</a>
<a name="1804"><span class="lineNum"> 1804 </span> : : }</a>
<a name="1805"><span class="lineNum"> 1805 </span> : : }</a>
<a name="1806"><span class="lineNum"> 1806 </span> : : </a>
<a name="1807"><span class="lineNum"> 1807 </span> : : void wrap_send(int conn, server_message_t* psm) {</a>
<a name="1808"><span class="lineNum"> 1808 </span> : : size_t total_len = 0;</a>
<a name="1809"><span class="lineNum"> 1809 </span> : : while (total_len &lt; sizeof(server_message_t)) {</a>
<a name="1810"><span class="lineNum"> 1810 </span> : : size_t len = send(conn, psm + total_len, sizeof(server_message_t) - total_len, 0);</a>
<a name="1811"><span class="lineNum"> 1811 </span> : : </a>
<a name="1812"><span class="lineNum"> 1812 </span> : : if (len &lt; 0) {</a>
<a name="1813"><span class="lineNum"> 1813 </span> : : loge(&quot;broken pipe&quot;);</a>
<a name="1814"><span class="lineNum"> 1814 </span> : : }</a>
<a name="1815"><span class="lineNum"> 1815 </span> : : </a>
<a name="1816"><span class="lineNum"> 1816 </span> : : total_len += len;</a>
<a name="1817"><span class="lineNum"> 1817 </span> : : }</a>
<a name="1818"><span class="lineNum"> 1818 </span> : : }</a>
<a name="1819"><span class="lineNum"> 1819 </span> : : */</a>
<a name="1820"><span class="lineNum"> 1820 </span> : : </a>
<a name="1821"><span class="lineNum"> 1821 </span> :<span class="lineCov"> 67 : void send_to_client(int uid, int message) {</span></a>
<a name="1822"><span class="lineNum"> 1822 </span> :<span class="lineCov"> 67 : int conn = sessions[uid].conn;</span></a>
<a name="1823"><span class="lineNum"> 1823 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 65 times"> + </span>]:<span class="lineCov"> 67 : if (conn &lt; 0) return;</span></a>
<a name="1824"><span class="lineNum"> 1824 </span> : : server_message_t sm;</a>
<a name="1825"><span class="lineNum"> 1825 </span> :<span class="lineCov"> 65 : memset(&amp;sm, 0, sizeof(server_message_t));</span></a>
<a name="1826"><span class="lineNum"> 1826 </span> :<span class="lineCov"> 65 : sm.response = message;</span></a>
<a name="1827"><span class="lineNum"> 1827 </span> : : //wrap_send(conn, &amp;sm);</a>
<a name="1828"><span class="lineNum"> 1828 </span> : : }</a>
<a name="1829"><span class="lineNum"> 1829 </span> : : </a>
<a name="1830"><span class="lineNum"> 1830 </span> :<span class="lineCov"> 5 : void send_to_client(int uid, int message, char* str) {</span></a>
<a name="1831"><span class="lineNum"> 1831 </span> :<span class="lineCov"> 5 : int conn = sessions[uid].conn;</span></a>
<a name="1832"><span class="lineNum"> 1832 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 4 times"> + </span>]:<span class="lineCov"> 5 : if (conn &lt; 0) return;</span></a>
<a name="1833"><span class="lineNum"> 1833 </span> : : server_message_t sm;</a>
<a name="1834"><span class="lineNum"> 1834 </span> :<span class="lineCov"> 4 : memset(&amp;sm, 0, sizeof(server_message_t));</span></a>
<a name="1835"><span class="lineNum"> 1835 </span> :<span class="lineCov"> 4 : sm.response = message;</span></a>
<a name="1836"><span class="lineNum"> 1836 </span> :<span class="lineCov"> 4 : strncpy(sm.msg, str, MSG_SIZE - 1);</span></a>
<a name="1837"><span class="lineNum"> 1837 </span> : : //wrap_send(conn, &amp;sm);</a>
<a name="1838"><span class="lineNum"> 1838 </span> : : }</a>
<a name="1839"><span class="lineNum"> 1839 </span> : : </a>
<a name="1840"><span class="lineNum"> 1840 </span> :<span class="lineCov"> 66 : void say_to_client(int uid, char *message) {</span></a>
<a name="1841"><span class="lineNum"> 1841 </span> : : //log(&quot;say `%s` to user #%d %s&quot;, message, uid, sessions[uid].user_name);</a>
<a name="1842"><span class="lineNum"> 1842 </span> :<span class="lineCov"> 66 : int conn = sessions[uid].conn;</span></a>
<a name="1843"><span class="lineNum"> 1843 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 65 times"> + </span>]:<span class="lineCov"> 66 : if (conn &lt; 0) {</span></a>
<a name="1844"><span class="lineNum"> 1844 </span> : : //logi(&quot;fail&quot;);</a>
<a name="1845"><span class="lineNum"> 1845 </span> :<span class="lineCov"> 1 : return; }</span></a>
<a name="1846"><span class="lineNum"> 1846 </span> : : server_message_t sm;</a>
<a name="1847"><span class="lineNum"> 1847 </span> :<span class="lineCov"> 65 : memset(&amp;sm, 0, sizeof(server_message_t));</span></a>
<a name="1848"><span class="lineNum"> 1848 </span> :<span class="lineCov"> 65 : sm.message = SERVER_MESSAGE;</span></a>
<a name="1849"><span class="lineNum"> 1849 </span> :<span class="lineCov"> 65 : strncpy(sm.msg, message, MSG_SIZE - 1);</span></a>
<a name="1850"><span class="lineNum"> 1850 </span> : : //wrap_send(conn, &amp;sm);</a>
<a name="1851"><span class="lineNum"> 1851 </span> : : }</a>
<a name="1852"><span class="lineNum"> 1852 </span> : : </a>
<a name="1853"><span class="lineNum"> 1853 </span> :<span class="lineCov"> 5 : void send_to_client_with_username(int uid, int message, char* user_name) {</span></a>
<a name="1854"><span class="lineNum"> 1854 </span> :<span class="lineCov"> 5 : int conn = sessions[uid].conn;</span></a>
<a name="1855"><span class="lineNum"> 1855 </span> [<span class="branchCov" title="Branch 0 was taken 2 times"> + </span><span class="branchCov" title="Branch 1 was taken 3 times"> + </span>]:<span class="lineCov"> 5 : if (conn &lt; 0) return;</span></a>
<a name="1856"><span class="lineNum"> 1856 </span> : : server_message_t sm;</a>
<a name="1857"><span class="lineNum"> 1857 </span> :<span class="lineCov"> 3 : memset(&amp;sm, 0, sizeof(server_message_t));</span></a>
<a name="1858"><span class="lineNum"> 1858 </span> :<span class="lineCov"> 3 : sm.response = message;</span></a>
<a name="1859"><span class="lineNum"> 1859 </span> :<span class="lineCov"> 3 : strncpy(sm.friend_name, user_name, USERNAME_SIZE - 1);</span></a>
<a name="1860"><span class="lineNum"> 1860 </span> : : //wrap_send(conn, &amp;sm);</a>
<a name="1861"><span class="lineNum"> 1861 </span> : : }</a>
<a name="1862"><span class="lineNum"> 1862 </span> : : </a>
<a name="1863"><span class="lineNum"> 1863 </span> :<span class="lineCov"> 1 : void close_session(int conn, int message) {</span></a>
<a name="1864"><span class="lineNum"> 1864 </span> :<span class="lineCov"> 1 : send_to_client(conn, message);</span></a>
<a name="1865"><span class="lineNum"> 1865 </span> :<span class="lineCov"> 1 : close(conn);</span></a>
<a name="1866"><span class="lineNum"> 1866 </span> :<span class="lineCov"> 1 : }</span></a>
<a name="1867"><span class="lineNum"> 1867 </span> : : </a>
<a name="1868"><span class="lineNum"> 1868 </span> :<span class="lineCov"> 2 : void* session_start(void* args) {</span></a>
<a name="1869"><span class="lineNum"> 1869 </span> :<span class="lineCov"> 2 : int uid = -1;</span></a>
<a name="1870"><span class="lineNum"> 1870 </span> :<span class="lineCov"> 2 : session_args_t info = *(session_args_t*)(uintptr_t)args;</span></a>
<a name="1871"><span class="lineNum"> 1871 </span> :<span class="lineCov"> 2 : client_message_t* pcm = NULL;</span></a>
<a name="1872"><span class="lineNum"> 1872 </span> : : /*</a>
<a name="1873"><span class="lineNum"> 1873 </span> : : if ((uid = get_unused_session()) &lt; 0) {</a>
<a name="1874"><span class="lineNum"> 1874 </span> : : close_session(info.conn, SERVER_RESPONSE_LOGIN_FAIL_SERVER_LIMITS);</a>
<a name="1875"><span class="lineNum"> 1875 </span> : : return NULL;</a>
<a name="1876"><span class="lineNum"> 1876 </span> : : } else {</a>
<a name="1877"><span class="lineNum"> 1877 </span> : : */</a>
<a name="1878"><span class="lineNum"> 1878 </span> :<span class="lineCov"> 2 : uid = 0;</span></a>
<a name="1879"><span class="lineNum"> 1879 </span> :<span class="lineCov"> 2 : sessions[uid].conn = info.conn;</span></a>
<a name="1880"><span class="lineNum"> 1880 </span> :<span class="lineCov"> 2 : strncpy(sessions[uid].user_name, &quot;&lt;unknown&gt;&quot;, USERNAME_SIZE - 1);</span></a>
<a name="1881"><span class="lineNum"> 1881 </span> :<span class="lineCov"> 2 : strncpy(sessions[uid].ip_addr, info.ip_addr, IPADDR_SIZE - 1);</span></a>
<a name="1882"><span class="lineNum"> 1882 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (strncmp(sessions[uid].ip_addr, &quot;&quot;, IPADDR_SIZE) == 0) {</span></a>
<a name="1883"><span class="lineNum"> 1883 </span> :<span class="lineCov"> 1 : strncpy(sessions[uid].ip_addr, &quot;unknown&quot;, IPADDR_SIZE - 1);</span></a>
<a name="1884"><span class="lineNum"> 1884 </span> : : }</a>
<a name="1885"><span class="lineNum"> 1885 </span> :<span class="lineCov"> 2 : pcm = &amp;sessions[uid].cm;</span></a>
<a name="1886"><span class="lineNum"> 1886 </span> :<span class="lineCov"> 2 : memset(pcm, 0, sizeof(client_message_t));</span></a>
<a name="1887"><span class="lineNum"> 1887 </span> : : //log(&quot;build session #%d&quot;, uid);</a>
<a name="1888"><span class="lineNum"> 1888 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : if (strncmp(info.ip_addr, &quot;127.0.0.1&quot;, IPADDR_SIZE) == 0) {</span></a>
<a name="1889"><span class="lineNum"> 1889 </span> : : //log(&quot;admin login!&quot;);</a>
<a name="1890"><span class="lineNum"> 1890 </span> :<span class="lineCov"> 1 : sessions[uid].is_admin = 1;</span></a>
<a name="1891"><span class="lineNum"> 1891 </span> : : }</a>
<a name="1892"><span class="lineNum"> 1892 </span> :<span class="lineCov"> 2 : sessions[uid].death = sessions[uid].kill = 0;</span></a>
<a name="1893"><span class="lineNum"> 1893 </span> :<span class="lineCov"> 2 : sessions[uid].score = 50;</span></a>
<a name="1894"><span class="lineNum"> 1894 </span> : : //}</a>
<a name="1895"><span class="lineNum"> 1895 </span> : : /*</a>
<a name="1896"><span class="lineNum"> 1896 </span> : : while (1) {</a>
<a name="1897"><span class="lineNum"> 1897 </span> : : //wrap_recv(info.conn, pcm);</a>
<a name="1898"><span class="lineNum"> 1898 </span> : : </a>
<a name="1899"><span class="lineNum"> 1899 </span> : : if (pcm-&gt;command &gt;= CLIENT_COMMAND_END)</a>
<a name="1900"><span class="lineNum"> 1900 </span> : : continue;</a>
<a name="1901"><span class="lineNum"> 1901 </span> : : </a>
<a name="1902"><span class="lineNum"> 1902 </span> : : int ret_code = handler[pcm-&gt;command](uid);</a>
<a name="1903"><span class="lineNum"> 1903 </span> : : if (ret_code &lt; 0) {</a>
<a name="1904"><span class="lineNum"> 1904 </span> : : //log(&quot;close session #%d&quot;, uid);</a>
<a name="1905"><span class="lineNum"> 1905 </span> : : break;</a>
<a name="1906"><span class="lineNum"> 1906 </span> : : }}</a>
<a name="1907"><span class="lineNum"> 1907 </span> : : */</a>
<a name="1908"><span class="lineNum"> 1908 </span> :<span class="lineCov"> 2 : return NULL;</span></a>
<a name="1909"><span class="lineNum"> 1909 </span> : : }</a>
<a name="1910"><span class="lineNum"> 1910 </span> : : </a>
<a name="1911"><span class="lineNum"> 1911 </span> :<span class="lineCov"> 1 : void* run_battle(void* args) {</span></a>
<a name="1912"><span class="lineNum"> 1912 </span> : : // TODO:</a>
<a name="1913"><span class="lineNum"> 1913 </span> :<span class="lineCov"> 1 : return NULL;</span></a>
<a name="1914"><span class="lineNum"> 1914 </span> : : }</a>
<a name="1915"><span class="lineNum"> 1915 </span> : : </a>
<a name="1916"><span class="lineNum"> 1916 </span> :<span class="lineCov"> 1 : int server_start() {</span></a>
<a name="1917"><span class="lineNum"> 1917 </span> :<span class="lineCov"> 1 : int sockfd = socket(AF_INET, SOCK_STREAM, 0);</span></a>
<a name="1918"><span class="lineNum"> 1918 </span> : : /*</a>
<a name="1919"><span class="lineNum"> 1919 </span> : : if (sockfd &lt; 0) {</a>
<a name="1920"><span class="lineNum"> 1920 </span> : : eprintf(&quot;create Socket Failed!&quot;);</a>
<a name="1921"><span class="lineNum"> 1921 </span> : : }</a>
<a name="1922"><span class="lineNum"> 1922 </span> : : */</a>
<a name="1923"><span class="lineNum"> 1923 </span> : : </a>
<a name="1924"><span class="lineNum"> 1924 </span> : : struct sockaddr_in servaddr;</a>
<a name="1925"><span class="lineNum"> 1925 </span> :<span class="lineCov"> 1 : bool binded = false;</span></a>
<a name="1926"><span class="lineNum"> 1926 </span> [<span class="branchCov" title="Branch 0 was taken 101 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 102 : for (int cur_port = port; cur_port &lt;= port + port_range; cur_port++) {</span></a>
<a name="1927"><span class="lineNum"> 1927 </span> :<span class="lineCov"> 101 : memset(&amp;servaddr, 0, sizeof(servaddr));</span></a>
<a name="1928"><span class="lineNum"> 1928 </span> :<span class="lineCov"> 101 : servaddr.sin_family = AF_INET;</span></a>
<a name="1929"><span class="lineNum"> 1929 </span> :<span class="lineCov"> 101 : servaddr.sin_port = htons(cur_port);</span></a>
<a name="1930"><span class="lineNum"> 1930 </span> :<span class="lineCov"> 101 : servaddr.sin_addr.s_addr = htonl(INADDR_ANY);</span></a>
<a name="1931"><span class="lineNum"> 1931 </span> : : </a>
<a name="1932"><span class="lineNum"> 1932 </span> : : /*</a>
<a name="1933"><span class="lineNum"> 1933 </span> : : if (bind(sockfd, (struct sockaddr*)&amp;servaddr, sizeof(servaddr)) == -1) {</a>
<a name="1934"><span class="lineNum"> 1934 </span> : : logw(&quot;can not bind to port %d!&quot;, cur_port);</a>
<a name="1935"><span class="lineNum"> 1935 </span> : : } else {</a>
<a name="1936"><span class="lineNum"> 1936 </span> : : binded = true;</a>
<a name="1937"><span class="lineNum"> 1937 </span> : : port = cur_port;</a>
<a name="1938"><span class="lineNum"> 1938 </span> : : break;</a>
<a name="1939"><span class="lineNum"> 1939 </span> : : }</a>
<a name="1940"><span class="lineNum"> 1940 </span> : : </a>
<a name="1941"><span class="lineNum"> 1941 </span> : : }</a>
<a name="1942"><span class="lineNum"> 1942 </span> : : </a>
<a name="1943"><span class="lineNum"> 1943 </span> : : if (!binded) {</a>
<a name="1944"><span class="lineNum"> 1944 </span> : : eprintf(&quot;can not start server.&quot;);</a>
<a name="1945"><span class="lineNum"> 1945 </span> : : }</a>
<a name="1946"><span class="lineNum"> 1946 </span> : : </a>
<a name="1947"><span class="lineNum"> 1947 </span> : : if (listen(sockfd, USER_CNT) == -1) {</a>
<a name="1948"><span class="lineNum"> 1948 </span> : : eprintf(&quot;fail to listen on socket.&quot;);</a>
<a name="1949"><span class="lineNum"> 1949 </span> : : } else {</a>
<a name="1950"><span class="lineNum"> 1950 </span> : : log(&quot;listen on port %d.&quot;, port);</a>
<a name="1951"><span class="lineNum"> 1951 </span> : : }</a>
<a name="1952"><span class="lineNum"> 1952 </span> : : */</a>
<a name="1953"><span class="lineNum"> 1953 </span> : : </a>
<a name="1954"><span class="lineNum"> 1954 </span> :<span class="lineCov"> 101 : bind(sockfd, (struct sockaddr *) &amp;servaddr, sizeof(servaddr));</span></a>
<a name="1955"><span class="lineNum"> 1955 </span> : : }</a>
<a name="1956"><span class="lineNum"> 1956 </span> :<span class="lineCov"> 1 : return sockfd;</span></a>
<a name="1957"><span class="lineNum"> 1957 </span> : : }</a>
<a name="1958"><span class="lineNum"> 1958 </span> : : </a>
<a name="1959"><span class="lineNum"> 1959 </span> :<span class="lineCov"> 5 : void terminate_process(int signum) {</span></a>
<a name="1960"><span class="lineNum"> 1960 </span> [<span class="branchCov" title="Branch 0 was taken 70 times"> + </span><span class="branchCov" title="Branch 1 was taken 5 times"> + </span>]:<span class="lineCov"> 75 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1961"><span class="lineNum"> 1961 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 56 times"> + </span>]:<span class="lineCov"> 70 : if (sessions[i].conn &gt;= 0) {</span></a>
<a name="1962"><span class="lineNum"> 1962 </span> :<span class="lineCov"> 14 : log(&quot;send quit to user #%d %s\033[2m(%s)\033[0m&quot;, i, sessions[i].user_name, sessions[i].ip_addr);</span></a>
<a name="1963"><span class="lineNum"> 1963 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 13 times"> + </span>]:<span class="lineCov"> 14 : if (signum) {</span></a>
<a name="1964"><span class="lineNum"> 1964 </span> :<span class="lineCov"> 1 : send_to_client(</span></a>
<a name="1965"><span class="lineNum"> 1965 </span> : : i, SERVER_STATUS_QUIT,</a>
<a name="1966"><span class="lineNum"> 1966 </span> : : sformat(&quot; (runtime error: %s)&quot;, signal_name_s[signum]));</a>
<a name="1967"><span class="lineNum"> 1967 </span> : : } else {</a>
<a name="1968"><span class="lineNum"> 1968 </span> :<span class="lineCov"> 13 : send_to_client(i, SERVER_STATUS_QUIT);</span></a>
<a name="1969"><span class="lineNum"> 1969 </span> : : }</a>
<a name="1970"><span class="lineNum"> 1970 </span> :<span class="lineCov"> 14 : log(&quot;close conn:%d&quot;, sessions[i].conn);</span></a>
<a name="1971"><span class="lineNum"> 1971 </span> : : //close(sessions[i].conn);</a>
<a name="1972"><span class="lineNum"> 1972 </span> :<span class="lineCov"> 14 : sessions[i].conn = -1;</span></a>
<a name="1973"><span class="lineNum"> 1973 </span> : : }</a>
<a name="1974"><span class="lineNum"> 1974 </span> : : }</a>
<a name="1975"><span class="lineNum"> 1975 </span> : : </a>
<a name="1976"><span class="lineNum"> 1976 </span> [<span class="branchCov" title="Branch 0 was taken 3 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 5 : if (server_fd) {</span></a>
<a name="1977"><span class="lineNum"> 1977 </span> : : //close(server_fd);</a>
<a name="1978"><span class="lineNum"> 1978 </span> :<span class="lineCov"> 3 : log(&quot;close server fd:%d&quot;, server_fd);</span></a>
<a name="1979"><span class="lineNum"> 1979 </span> : : }</a>
<a name="1980"><span class="lineNum"> 1980 </span> : : </a>
<a name="1981"><span class="lineNum"> 1981 </span> :<span class="lineCov"> 5 : pthread_mutex_destroy(&amp;sessions_lock);</span></a>
<a name="1982"><span class="lineNum"> 1982 </span> :<span class="lineCov"> 5 : pthread_mutex_destroy(&amp;battles_lock);</span></a>
<a name="1983"><span class="lineNum"> 1983 </span> [<span class="branchCov" title="Branch 0 was taken 70 times"> + </span><span class="branchCov" title="Branch 1 was taken 5 times"> + </span>]:<span class="lineCov"> 75 : for (int i = 0; i &lt; USER_CNT; i++) {</span></a>
<a name="1984"><span class="lineNum"> 1984 </span> :<span class="lineCov"> 70 : pthread_mutex_destroy(&amp;items_lock[i]);</span></a>
<a name="1985"><span class="lineNum"> 1985 </span> : : }</a>
<a name="1986"><span class="lineNum"> 1986 </span> : : </a>
<a name="1987"><span class="lineNum"> 1987 </span> :<span class="lineCov"> 5 : log(&quot;exit(%d)&quot;, signum);</span></a>
<a name="1988"><span class="lineNum"> 1988 </span> : : //exit(signum);</a>
<a name="1989"><span class="lineNum"> 1989 </span> :<span class="lineCov"> 5 : }</span></a>
<a name="1990"><span class="lineNum"> 1990 </span> : : </a>
<a name="1991"><span class="lineNum"> 1991 </span> :<span class="lineCov"> 2 : void terminate_entrance(int signum) {</span></a>
<a name="1992"><span class="lineNum"> 1992 </span> :<span class="lineCov"> 2 : loge(&quot;received signal %s, terminate.&quot;, signal_name_s[signum]);</span></a>
<a name="1993"><span class="lineNum"> 1993 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : terminate_process(signum == SIGINT ? 0 : signum);</span></a>
<a name="1994"><span class="lineNum"> 1994 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="1995"><span class="lineNum"> 1995 </span> : : </a>
<a name="1996"><span class="lineNum"> 1996 </span> :<span class="lineCov"> 1 : void init_handlers(char* url) {</span></a>
<a name="1997"><span class="lineNum"> 1997 </span> :<span class="lineCov"> 1 : handler[CLIENT_MESSAGE_FATAL] = client_message_fatal,</span></a>
<a name="1998"><span class="lineNum"> 1998 </span> : : </a>
<a name="1999"><span class="lineNum"> 1999 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_USER_QUIT] = client_command_quit,</span></a>
<a name="2000"><span class="lineNum"> 2000 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_USER_REGISTER] = client_command_user_register,</span></a>
<a name="2001"><span class="lineNum"> 2001 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_USER_LOGIN] = client_command_user_login,</span></a>
<a name="2002"><span class="lineNum"> 2002 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_USER_LOGOUT] = client_command_user_logout,</span></a>
<a name="2003"><span class="lineNum"> 2003 </span> : : </a>
<a name="2004"><span class="lineNum"> 2004 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FETCH_ALL_USERS] = client_command_fetch_all_users,</span></a>
<a name="2005"><span class="lineNum"> 2005 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FETCH_ALL_FRIENDS] = client_command_fetch_all_friends,</span></a>
<a name="2006"><span class="lineNum"> 2006 </span> : : </a>
<a name="2007"><span class="lineNum"> 2007 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_LAUNCH_BATTLE] = client_command_launch_battle,</span></a>
<a name="2008"><span class="lineNum"> 2008 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_QUIT_BATTLE] = client_command_quit_battle,</span></a>
<a name="2009"><span class="lineNum"> 2009 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_ACCEPT_BATTLE] = client_command_accept_battle,</span></a>
<a name="2010"><span class="lineNum"> 2010 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_LAUNCH_FFA] = client_command_launch_ffa,</span></a>
<a name="2011"><span class="lineNum"> 2011 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_REJECT_BATTLE] = client_command_reject_battle,</span></a>
<a name="2012"><span class="lineNum"> 2012 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_INVITE_USER] = client_command_invite_user,</span></a>
<a name="2013"><span class="lineNum"> 2013 </span> : : </a>
<a name="2014"><span class="lineNum"> 2014 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_SEND_MESSAGE] = client_command_send_message,</span></a>
<a name="2015"><span class="lineNum"> 2015 </span> : : </a>
<a name="2016"><span class="lineNum"> 2016 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MOVE_UP] = client_command_move_up,</span></a>
<a name="2017"><span class="lineNum"> 2017 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MOVE_DOWN] = client_command_move_down,</span></a>
<a name="2018"><span class="lineNum"> 2018 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MOVE_LEFT] = client_command_move_left,</span></a>
<a name="2019"><span class="lineNum"> 2019 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MOVE_RIGHT] = client_command_move_right,</span></a>
<a name="2020"><span class="lineNum"> 2020 </span> : : </a>
<a name="2021"><span class="lineNum"> 2021 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_PUT_LANDMINE] = client_command_put_landmine,</span></a>
<a name="2022"><span class="lineNum"> 2022 </span> : : </a>
<a name="2023"><span class="lineNum"> 2023 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_MELEE] = client_command_melee,</span></a>
<a name="2024"><span class="lineNum"> 2024 </span> : : </a>
<a name="2025"><span class="lineNum"> 2025 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_UP] = client_command_fire_up,</span></a>
<a name="2026"><span class="lineNum"> 2026 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_DOWN] = client_command_fire_down,</span></a>
<a name="2027"><span class="lineNum"> 2027 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_LEFT] = client_command_fire_left,</span></a>
<a name="2028"><span class="lineNum"> 2028 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_RIGHT] = client_command_fire_right,</span></a>
<a name="2029"><span class="lineNum"> 2029 </span> : : </a>
<a name="2030"><span class="lineNum"> 2030 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_UP_LEFT] = client_command_fire_up_left,</span></a>
<a name="2031"><span class="lineNum"> 2031 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_UP_RIGHT] = client_command_fire_up_right,</span></a>
<a name="2032"><span class="lineNum"> 2032 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_DOWN_LEFT] = client_command_fire_down_left,</span></a>
<a name="2033"><span class="lineNum"> 2033 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_DOWN_RIGHT] = client_command_fire_down_right,</span></a>
<a name="2034"><span class="lineNum"> 2034 </span> : : </a>
<a name="2035"><span class="lineNum"> 2035 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_AOE_UP] = client_command_fire_aoe_up,</span></a>
<a name="2036"><span class="lineNum"> 2036 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_AOE_DOWN] = client_command_fire_aoe_down,</span></a>
<a name="2037"><span class="lineNum"> 2037 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_AOE_LEFT] = client_command_fire_aoe_left,</span></a>
<a name="2038"><span class="lineNum"> 2038 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_FIRE_AOE_RIGHT] = client_command_fire_aoe_right;</span></a>
<a name="2039"><span class="lineNum"> 2039 </span> : : </a>
<a name="2040"><span class="lineNum"> 2040 </span> :<span class="lineCov"> 1 : handler[CLIENT_COMMAND_ADMIN_CONTROL] = client_command_admin_control;</span></a>
<a name="2041"><span class="lineNum"> 2041 </span> : : </a>
<a name="2042"><span class="lineNum"> 2042 </span> :<span class="lineCov"> 1 : }</span></a>
<a name="2043"><span class="lineNum"> 2043 </span> : : </a>
<a name="2044"><span class="lineNum"> 2044 </span> :<span class="lineCov"> 1 : void init_constant() {</span></a>
<a name="2045"><span class="lineNum"> 2045 </span> :<span class="lineCov"> 1 : item_s[ITEM_NONE] = (char*)&quot;none&quot;;</span></a>
<a name="2046"><span class="lineNum"> 2046 </span> :<span class="lineCov"> 1 : item_s[ITEM_MAGAZINE] = (char*)&quot;magazine&quot;;</span></a>
<a name="2047"><span class="lineNum"> 2047 </span> :<span class="lineCov"> 1 : item_s[ITEM_MAGMA] = (char*)&quot;magma&quot;;</span></a>
<a name="2048"><span class="lineNum"> 2048 </span> :<span class="lineCov"> 1 : item_s[ITEM_GRASS] = (char*)&quot;grass&quot;;</span></a>
<a name="2049"><span class="lineNum"> 2049 </span> :<span class="lineCov"> 1 : item_s[ITEM_BLOOD_VIAL] = (char*)&quot;blood_vial&quot;;</span></a>
<a name="2050"><span class="lineNum"> 2050 </span> :<span class="lineCov"> 1 : item_s[ITEM_END] = (char*)&quot;end&quot;;</span></a>
<a name="2051"><span class="lineNum"> 2051 </span> :<span class="lineCov"> 1 : item_s[ITEM_BULLET] = (char*)&quot;bullet&quot;;</span></a>
<a name="2052"><span class="lineNum"> 2052 </span> :<span class="lineCov"> 1 : item_s[ITEM_LANDMINE] = (char*)&quot;landmine&quot;;</span></a>
<a name="2053"><span class="lineNum"> 2053 </span> : : </a>
<a name="2054"><span class="lineNum"> 2054 </span> :<span class="lineCov"> 1 : dir_s[DIR_UP] = (char*)&quot;up&quot;;</span></a>
<a name="2055"><span class="lineNum"> 2055 </span> :<span class="lineCov"> 1 : dir_s[DIR_DOWN] = (char*)&quot;down&quot;;</span></a>
<a name="2056"><span class="lineNum"> 2056 </span> :<span class="lineCov"> 1 : dir_s[DIR_LEFT] = (char*)&quot;left&quot;;</span></a>
<a name="2057"><span class="lineNum"> 2057 </span> :<span class="lineCov"> 1 : dir_s[DIR_RIGHT] = (char*)&quot;right&quot;;</span></a>
<a name="2058"><span class="lineNum"> 2058 </span> :<span class="lineCov"> 1 : dir_s[DIR_UP_LEFT] = (char*)&quot;up&amp;left&quot;;</span></a>
<a name="2059"><span class="lineNum"> 2059 </span> :<span class="lineCov"> 1 : dir_s[DIR_UP_RIGHT] = (char*)&quot;up&amp;right&quot;;</span></a>
<a name="2060"><span class="lineNum"> 2060 </span> :<span class="lineCov"> 1 : dir_s[DIR_DOWN_LEFT] = (char*)&quot;down&amp;left&quot;;</span></a>
<a name="2061"><span class="lineNum"> 2061 </span> :<span class="lineCov"> 1 : dir_s[DIR_DOWN_RIGHT] = (char*)&quot;down&amp;right&quot;;</span></a>
<a name="2062"><span class="lineNum"> 2062 </span> : : </a>
<a name="2063"><span class="lineNum"> 2063 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_NONE] = (char*)&quot; &quot;;</span></a>
<a name="2064"><span class="lineNum"> 2064 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_MAGAZINE] = (char*)&quot;+&quot;;</span></a>
<a name="2065"><span class="lineNum"> 2065 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_MAGMA] = (char*)&quot;X&quot;;</span></a>
<a name="2066"><span class="lineNum"> 2066 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_GRASS] = (char*)&quot;\033[2;37m█\033[0m&quot;;</span></a>
<a name="2067"><span class="lineNum"> 2067 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_BLOOD_VIAL] = (char*)&quot;*&quot;;</span></a>
<a name="2068"><span class="lineNum"> 2068 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_MY_BULLET] = (char*)&quot;.&quot;;</span></a>
<a name="2069"><span class="lineNum"> 2069 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_OTHER_BULLET] = (char*)&quot;.&quot;;</span></a>
<a name="2070"><span class="lineNum"> 2070 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_USER] = (char*)&quot;A&quot;;</span></a>
<a name="2071"><span class="lineNum"> 2071 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_LANDMINE] = (char*)&quot;o&quot;;</span></a>
<a name="2072"><span class="lineNum"> 2072 </span> :<span class="lineCov"> 1 : map_s[MAP_ITEM_END] = (char*)&quot; &quot;;</span></a>
<a name="2073"><span class="lineNum"> 2073 </span> : : </a>
<a name="2074"><span class="lineNum"> 2074 </span> :<span class="lineCov"> 1 : item_to_map[ITEM_NONE] = MAP_ITEM_NONE;</span></a>
<a name="2075"><span class="lineNum"> 2075 </span> :<span class="lineCov"> 1 : item_to_map[ITEM_MAGAZINE] = MAP_ITEM_MAGAZINE;</span></a>
<a name="2076"><span class="lineNum"> 2076 </span> :<span class="lineCov"> 1 : item_to_map[ITEM_MAGMA] = MAP_ITEM_MAGMA;</span></a>
<a name="2077"><span class="lineNum"> 2077 </span> :<span class="lineCov"> 1 : item_to_map[ITEM_GRASS] = MAP_ITEM_GRASS;</span></a>
<a name="2078"><span class="lineNum"> 2078 </span> :<span class="lineCov"> 1 : item_to_map[ITEM_BLOOD_VIAL] = MAP_ITEM_BLOOD_VIAL;</span></a>
<a name="2079"><span class="lineNum"> 2079 </span> :<span class="lineCov"> 1 : item_to_map[ITEM_LANDMINE] = MAP_ITEM_LANDMINE;</span></a>
<a name="2080"><span class="lineNum"> 2080 </span> :<span class="lineCov"> 1 : item_to_map[ITEM_END] = MAP_ITEM_END;</span></a>
<a name="2081"><span class="lineNum"> 2081 </span> : : </a>
<a name="2082"><span class="lineNum"> 2082 </span> :<span class="lineCov"> 1 : signal_name_s[SIGHUP ] = (char*)&quot;SIGHUP&quot;;</span></a>
<a name="2083"><span class="lineNum"> 2083 </span> :<span class="lineCov"> 1 : signal_name_s[SIGINT ] = (char*)&quot;SIGINT&quot;;</span></a>
<a name="2084"><span class="lineNum"> 2084 </span> :<span class="lineCov"> 1 : signal_name_s[SIGQUIT ] = (char*)&quot;SIGQUIT&quot;;</span></a>
<a name="2085"><span class="lineNum"> 2085 </span> :<span class="lineCov"> 1 : signal_name_s[SIGILL ] = (char*)&quot;SIGILL&quot; ;</span></a>
<a name="2086"><span class="lineNum"> 2086 </span> :<span class="lineCov"> 1 : signal_name_s[SIGABRT ] = (char*)&quot;SIGABRT&quot;;</span></a>
<a name="2087"><span class="lineNum"> 2087 </span> :<span class="lineCov"> 1 : signal_name_s[SIGFPE ] = (char*)&quot;SIGFPE&quot; ;</span></a>
<a name="2088"><span class="lineNum"> 2088 </span> :<span class="lineCov"> 1 : signal_name_s[SIGKILL ] = (char*)&quot;SIGKILL&quot;;</span></a>
<a name="2089"><span class="lineNum"> 2089 </span> :<span class="lineCov"> 1 : signal_name_s[SIGSEGV ] = (char*)&quot;SIGSEGV&quot;;</span></a>
<a name="2090"><span class="lineNum"> 2090 </span> :<span class="lineCov"> 1 : signal_name_s[SIGPIPE ] = (char*)&quot;SIGPIPE&quot;;</span></a>
<a name="2091"><span class="lineNum"> 2091 </span> :<span class="lineCov"> 1 : signal_name_s[SIGALRM ] = (char*)&quot;SIGALRM&quot;;</span></a>
<a name="2092"><span class="lineNum"> 2092 </span> :<span class="lineCov"> 1 : signal_name_s[SIGTERM ] = (char*)&quot;SIGTERM&quot;;</span></a>
<a name="2093"><span class="lineNum"> 2093 </span> :<span class="lineCov"> 1 : signal_name_s[SIGUSR1 ] = (char*)&quot;SIGUSR1&quot;;</span></a>
<a name="2094"><span class="lineNum"> 2094 </span> :<span class="lineCov"> 1 : signal_name_s[SIGUSR2 ] = (char*)&quot;SIGUSR2&quot;;</span></a>
<a name="2095"><span class="lineNum"> 2095 </span> :<span class="lineCov"> 1 : signal_name_s[SIGCHLD ] = (char*)&quot;SIGCHLD&quot;;</span></a>
<a name="2096"><span class="lineNum"> 2096 </span> :<span class="lineCov"> 1 : signal_name_s[SIGCONT ] = (char*)&quot;SIGCONT&quot;;</span></a>
<a name="2097"><span class="lineNum"> 2097 </span> :<span class="lineCov"> 1 : signal_name_s[SIGSTOP ] = (char*)&quot;SIGSTOP&quot;;</span></a>
<a name="2098"><span class="lineNum"> 2098 </span> :<span class="lineCov"> 1 : signal_name_s[SIGTSTP ] = (char*)&quot;SIGTSTP&quot;;</span></a>
<a name="2099"><span class="lineNum"> 2099 </span> :<span class="lineCov"> 1 : signal_name_s[SIGTTIN ] = (char*)&quot;SIGTTIN&quot;;</span></a>
<a name="2100"><span class="lineNum"> 2100 </span> :<span class="lineCov"> 1 : signal_name_s[SIGTTOU ] = (char*)&quot;SIGTTOU&quot;;</span></a>
<a name="2101"><span class="lineNum"> 2101 </span> :<span class="lineCov"> 1 : signal_name_s[SIGBUS ] = (char*)&quot;SIGBUS&quot; ;</span></a>
<a name="2102"><span class="lineNum"> 2102 </span> :<span class="lineCov"> 1 : signal_name_s[SIGPOLL ] = (char*)&quot;SIGPOLL&quot;;</span></a>
<a name="2103"><span class="lineNum"> 2103 </span> :<span class="lineCov"> 1 : signal_name_s[SIGPROF ] = (char*)&quot;SIGPROF&quot;;</span></a>
<a name="2104"><span class="lineNum"> 2104 </span> :<span class="lineCov"> 1 : signal_name_s[SIGSYS ] = (char*)&quot;SIGSYS&quot; ;</span></a>
<a name="2105"><span class="lineNum"> 2105 </span> :<span class="lineCov"> 1 : signal_name_s[SIGTRAP ] = (char*)&quot;SIGTRAP&quot;;</span></a>
<a name="2106"><span class="lineNum"> 2106 </span> :<span class="lineCov"> 1 : signal_name_s[SIGURG ] = (char*)&quot;SIGURG&quot; ;</span></a>
<a name="2107"><span class="lineNum"> 2107 </span> :<span class="lineCov"> 1 : signal_name_s[SIGVTALRM] = (char*)&quot;SIGVTALRM&quot;;</span></a>
<a name="2108"><span class="lineNum"> 2108 </span> :<span class="lineCov"> 1 : signal_name_s[SIGXCPU ] = (char*)&quot;SIGXCPU&quot;;</span></a>
<a name="2109"><span class="lineNum"> 2109 </span> :<span class="lineCov"> 1 : signal_name_s[SIGXFSZ ] = (char*)&quot;SIGXFSZ&quot;;</span></a>
<a name="2110"><span class="lineNum"> 2110 </span> :<span class="lineCov"> 1 : color_s[0] = (char*)NONE;</span></a>
<a name="2111"><span class="lineNum"> 2111 </span> :<span class="lineCov"> 1 : color_s[1] = (char*)L_GREEN;</span></a>
<a name="2112"><span class="lineNum"> 2112 </span> :<span class="lineCov"> 1 : color_s[2] = (char*)L_RED;</span></a>
<a name="2113"><span class="lineNum"> 2113 </span> :<span class="lineCov"> 1 : color_s[3] = (char*)YELLOW;</span></a>
<a name="2114"><span class="lineNum"> 2114 </span> :<span class="lineCov"> 1 : color_s[4] = (char*)L_BLUE;</span></a>
<a name="2115"><span class="lineNum"> 2115 </span> :<span class="lineCov"> 1 : color_s[5] = (char*)L_PURPLE;</span></a>
<a name="2116"><span class="lineNum"> 2116 </span> :<span class="lineCov"> 1 : color_s[6] = (char*)L_CYAN;</span></a>
<a name="2117"><span class="lineNum"> 2117 </span> :<span class="lineCov"> 1 : color_s[7] = (char*)(RED UNDERLINE);</span></a>
<a name="2118"><span class="lineNum"> 2118 </span> :<span class="lineCov"> 1 : color_s[8] = (char*)(GREEN UNDERLINE);</span></a>
<a name="2119"><span class="lineNum"> 2119 </span> :<span class="lineCov"> 1 : color_s[9] = (char*)(BROWN UNDERLINE);</span></a>
<a name="2120"><span class="lineNum"> 2120 </span> :<span class="lineCov"> 1 : color_s[10] = (char*)(BLUE UNDERLINE);</span></a>
<a name="2121"><span class="lineNum"> 2121 </span> :<span class="lineCov"> 1 : color_s[11] = (char*)(PURPLE UNDERLINE);</span></a>
<a name="2122"><span class="lineNum"> 2122 </span> :<span class="lineCov"> 1 : color_s[12] = (char*)(CYAN UNDERLINE);</span></a>
<a name="2123"><span class="lineNum"> 2123 </span> :<span class="lineCov"> 1 : color_s_size = 12;</span></a>
<a name="2124"><span class="lineNum"> 2124 </span> :<span class="lineCov"> 1 : }</span></a>
<a name="2125"><span class="lineNum"> 2125 </span> : : /*</a>
<a name="2126"><span class="lineNum"> 2126 </span> : : int main0(int argc, char* argv[]) {</a>
<a name="2127"><span class="lineNum"> 2127 </span> : : init_constants();</a>
<a name="2128"><span class="lineNum"> 2128 </span> : : init_handler();</a>
<a name="2129"><span class="lineNum"> 2129 </span> : : if (argc == 2) {</a>
<a name="2130"><span class="lineNum"> 2130 </span> : : port = atoi(argv[1]);</a>
<a name="2131"><span class="lineNum"> 2131 </span> : : }</a>
<a name="2132"><span class="lineNum"> 2132 </span> : : srand(time(NULL));</a>
<a name="2133"><span class="lineNum"> 2133 </span> : : </a>
<a name="2134"><span class="lineNum"> 2134 </span> : : pthread_t thread;</a>
<a name="2135"><span class="lineNum"> 2135 </span> : : </a>
<a name="2136"><span class="lineNum"> 2136 </span> : : if (signal(SIGINT, terminate_entrance) == SIG_ERR) {</a>
<a name="2137"><span class="lineNum"> 2137 </span> : : eprintf(&quot;an error occurred while setting a signal handler.&quot;);</a>
<a name="2138"><span class="lineNum"> 2138 </span> : : }</a>
<a name="2139"><span class="lineNum"> 2139 </span> : : if (signal(SIGSEGV, terminate_entrance) == SIG_ERR) {</a>
<a name="2140"><span class="lineNum"> 2140 </span> : : eprintf(&quot;an error occurred while setting a signal handler.&quot;);</a>
<a name="2141"><span class="lineNum"> 2141 </span> : : }</a>
<a name="2142"><span class="lineNum"> 2142 </span> : : if (signal(SIGABRT, terminate_entrance) == SIG_ERR) {</a>
<a name="2143"><span class="lineNum"> 2143 </span> : : eprintf(&quot;an error occurred while setting a signal handler.&quot;);</a>
<a name="2144"><span class="lineNum"> 2144 </span> : : }</a>
<a name="2145"><span class="lineNum"> 2145 </span> : : if (signal(SIGTERM, terminate_entrance) == SIG_ERR) {</a>
<a name="2146"><span class="lineNum"> 2146 </span> : : eprintf(&quot;an error occurred while setting a signal handler.&quot;);</a>
<a name="2147"><span class="lineNum"> 2147 </span> : : }</a>
<a name="2148"><span class="lineNum"> 2148 </span> : : if (signal(SIGTRAP, terminate_entrance) == SIG_ERR) {</a>
<a name="2149"><span class="lineNum"> 2149 </span> : : eprintf(&quot;an error occurred while setting a signal handler.&quot;);</a>
<a name="2150"><span class="lineNum"> 2150 </span> : : }</a>
<a name="2151"><span class="lineNum"> 2151 </span> : : </a>
<a name="2152"><span class="lineNum"> 2152 </span> : : for (int i = 0; i &lt; USER_CNT; i++) {</a>
<a name="2153"><span class="lineNum"> 2153 </span> : : pthread_mutex_init(&amp;items_lock[i], NULL);</a>
<a name="2154"><span class="lineNum"> 2154 </span> : : }</a>
<a name="2155"><span class="lineNum"> 2155 </span> : : log(&quot;server %s&quot;, version);</a>
<a name="2156"><span class="lineNum"> 2156 </span> : : if (sizeof(server_message_t) &gt;= 1000)</a>
<a name="2157"><span class="lineNum"> 2157 </span> : : logw(&quot;message_size = %ldB&quot;, sizeof(server_message_t));</a>
<a name="2158"><span class="lineNum"> 2158 </span> : : </a>
<a name="2159"><span class="lineNum"> 2159 </span> : : server_fd = server_start();</a>
<a name="2160"><span class="lineNum"> 2160 </span> : : load_user_list();</a>
<a name="2161"><span class="lineNum"> 2161 </span> : : </a>
<a name="2162"><span class="lineNum"> 2162 </span> : : for (int i = 0; i &lt; USER_CNT; i++)</a>
<a name="2163"><span class="lineNum"> 2163 </span> : : sessions[i].conn = -1;</a>
<a name="2164"><span class="lineNum"> 2164 </span> : : </a>
<a name="2165"><span class="lineNum"> 2165 </span> : : struct sockaddr_in client_addr;</a>
<a name="2166"><span class="lineNum"> 2166 </span> : : socklen_t length = sizeof(client_addr);</a>
<a name="2167"><span class="lineNum"> 2167 </span> : : while (1) {</a>
<a name="2168"><span class="lineNum"> 2168 </span> : : static session_args_t info;</a>
<a name="2169"><span class="lineNum"> 2169 </span> : : info.conn = accept(server_fd, (struct sockaddr*)&amp;client_addr, &amp;length);</a>
<a name="2170"><span class="lineNum"> 2170 </span> : : strncpy(info.ip_addr, inet_ntoa(client_addr.sin_addr), IPADDR_SIZE - 1);</a>
<a name="2171"><span class="lineNum"> 2171 </span> : : log(&quot;connected by %s:%d , conn:%d&quot;, info.ip_addr, client_addr.sin_port, info.conn);</a>
<a name="2172"><span class="lineNum"> 2172 </span> : : if (info.conn &lt; 0) {</a>
<a name="2173"><span class="lineNum"> 2173 </span> : : loge(&quot;fail to accept client.&quot;);</a>
<a name="2174"><span class="lineNum"> 2174 </span> : : } else if (pthread_create(&amp;thread, NULL, session_start, (void*)(uintptr_t)&amp;info) != 0) {</a>
<a name="2175"><span class="lineNum"> 2175 </span> : : loge(&quot;fail to create thread.&quot;);</a>
<a name="2176"><span class="lineNum"> 2176 </span> : : }</a>
<a name="2177"><span class="lineNum"> 2177 </span> : : logi(&quot;bind thread #%lu&quot;, thread);</a>
<a name="2178"><span class="lineNum"> 2178 </span> : : }</a>
<a name="2179"><span class="lineNum"> 2179 </span> : : </a>
<a name="2180"><span class="lineNum"> 2180 </span> : : return 0;</a>
<a name="2181"><span class="lineNum"> 2181 </span> : : }</a>
<a name="2182"><span class="lineNum"> 2182 </span> : : */</a>
<a name="2183"><span class="lineNum"> 2183 </span> : : </a>
<a name="2184"><span class="lineNum"> 2184 </span> :<span class="lineCov"> 2 : int EightQueen(int n) { //函数返回八皇后问题的解法个数</span></a>
<a name="2185"><span class="lineNum"> 2185 </span> [<span class="branchCov" title="Branch 0 was taken 1 time"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 2 : int *p = new int[n]; //p[8]用来存储八皇后的位置,下标表示行号,数值表示列号</span></a>
<a name="2186"><span class="lineNum"> 2186 </span> : : //例如p[2]=3表示落在(2,3)这个点上行号列号均为0~8</a>
<a name="2187"><span class="lineNum"> 2187 </span> :<span class="lineCov"> 1 : memset(p, 0, n * sizeof(int));//初始化所有p[i]=0</span></a>
<a name="2188"><span class="lineNum"> 2188 </span> :<span class="lineCov"> 1 : int k = 0; //k用来记录行号</span></a>
<a name="2189"><span class="lineNum"> 2189 </span> :<span class="lineCov"> 1 : int count = 0; //count用来记录解法个数函数最终返回该值</span></a>
<a name="2190"><span class="lineNum"> 2190 </span> [<span class="branchCov" title="Branch 0 was taken 4021 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 4022 : while (k &gt;= 0) { //最后一次回溯k=-1跳出循环从而找到全部解法</span></a>
<a name="2191"><span class="lineNum"> 2191 </span> [<span class="branchCov" title="Branch 0 was taken 15720 times"> + </span><span class="branchCov" title="Branch 1 was taken 1965 times"> + </span>]:<span class="lineCov"> 17685 : while (p[k] &lt; n) {</span></a>
<a name="2192"><span class="lineNum"> 2192 </span> : : int i;</a>
<a name="2193"><span class="lineNum"> 2193 </span> [<span class="branchCov" title="Branch 0 was taken 46752 times"> + </span><span class="branchCov" title="Branch 1 was taken 2056 times"> + </span>]:<span class="lineCov"> 48808 : for (i = 0; i &lt; k; i++)//找一下K行之前的几行有没有与p[k]在同一列或者同一对角线上</span></a>
<a name="2194"><span class="lineNum"> 2194 </span> [<span class="branchCov" title="Branch 0 was taken 39556 times"> + </span><span class="branchCov" title="Branch 1 was taken 7196 times"> + </span>]:<span class="lineCov"> 46752 : if (p[i] == p[k] ||</span></a>
<a name="2195"><span class="lineNum"> 2195 </span> [<span class="branchCov" title="Branch 0 was taken 36322 times"> + </span><span class="branchCov" title="Branch 1 was taken 3234 times"> + </span>]:<span class="lineCov"> 39556 : p[i] - p[k] == i - k ||</span></a>
<a name="2196"><span class="lineNum"> 2196 </span> [<span class="branchCov" title="Branch 0 was taken 33088 times"> + </span><span class="branchCov" title="Branch 1 was taken 3234 times"> + </span>]:<span class="lineCov"> 36322 : p[i] - p[k] == k - i)</span></a>
<a name="2197"><span class="lineNum"> 2197 </span> : : break; //如果有就跳出循环此时i&lt;k否则i=k</a>
<a name="2198"><span class="lineNum"> 2198 </span> [<span class="branchCov" title="Branch 0 was taken 13664 times"> + </span><span class="branchCov" title="Branch 1 was taken 2056 times"> + </span>]:<span class="lineCov"> 15720 : if (i &lt; k)p[k]++; //p[k]不满足条件p[k]++再次进入循环与前几行对比直至p[k]满足条件此时p[0]到p[k]之间都满足条件了</span></a>
<a name="2199"><span class="lineNum"> 2199 </span> :<span class="lineCov"> 2056 : else break; //p[k]满足条件,跳出 while(p[k]&lt;n) 循环</span></a>
<a name="2200"><span class="lineNum"> 2200 </span> : : }</a>
<a name="2201"><span class="lineNum"> 2201 </span> [<span class="branchCov" title="Branch 0 was taken 2056 times"> + </span><span class="branchCov" title="Branch 1 was taken 1965 times"> + </span>]:<span class="lineCov"> 4021 : if (p[k] &lt; n) { //如果p[k]&lt;n,即合法的话,进入下面代码</span></a>
<a name="2202"><span class="lineNum"> 2202 </span> [<span class="branchCov" title="Branch 0 was taken 1964 times"> + </span><span class="branchCov" title="Branch 1 was taken 92 times"> + </span>]:<span class="lineCov"> 2056 : if (k &lt; n - 1)k++; //如果还没到最后一行的话就k++,进入下一行如果k=7到了最后一行的话就表明找到一组解进入else开始输出</span></a>
<a name="2203"><span class="lineNum"> 2203 </span> : : else { //以下为打印函数,可以不看</a>
<a name="2204"><span class="lineNum"> 2204 </span> [<span class="branchCov" title="Branch 0 was taken 736 times"> + </span><span class="branchCov" title="Branch 1 was taken 92 times"> + </span>]:<span class="lineCov"> 828 : for (int i = 0; i &lt; n; i++) {//i为行号</span></a>
<a name="2205"><span class="lineNum"> 2205 </span> [<span class="branchCov" title="Branch 0 was taken 2576 times"> + </span><span class="branchCov" title="Branch 1 was taken 736 times"> + </span>]:<span class="lineCov"> 3312 : for (int j = 0; j &lt; p[i]; j++)</span></a>
<a name="2206"><span class="lineNum"> 2206 </span> :<span class="lineCov"> 2576 : cout &lt;&lt; &quot;|--&quot;; //输出此行皇后之前的格子</span></a>
<a name="2207"><span class="lineNum"> 2207 </span> :<span class="lineCov"> 736 : cout &lt;&lt; &quot;O&quot;; //输出皇后O</span></a>
<a name="2208"><span class="lineNum"> 2208 </span> [<span class="branchCov" title="Branch 0 was taken 2576 times"> + </span><span class="branchCov" title="Branch 1 was taken 736 times"> + </span>]:<span class="lineCov"> 3312 : for (int j = 0; j &lt; n - p[i] - 1; j++)</span></a>
<a name="2209"><span class="lineNum"> 2209 </span> :<span class="lineCov"> 2576 : cout &lt;&lt; &quot;--|&quot;;//输出此行皇后之后的格子</span></a>
<a name="2210"><span class="lineNum"> 2210 </span> :<span class="lineCov"> 736 : cout &lt;&lt; endl;</span></a>
<a name="2211"><span class="lineNum"> 2211 </span> : : }</a>
<a name="2212"><span class="lineNum"> 2212 </span> :<span class="lineCov"> 92 : cout &lt;&lt; &quot;……………………………&quot; &lt;&lt; endl;</span></a>
<a name="2213"><span class="lineNum"> 2213 </span> [<span class="branchCov" title="Branch 0 was taken 736 times"> + </span><span class="branchCov" title="Branch 1 was taken 92 times"> + </span>]:<span class="lineCov"> 828 : for (int i = 0; i &lt; n; i++)cout &lt;&lt; p[i] + 1; cout &lt;&lt; endl;//输出此组解法</span></a>
<a name="2214"><span class="lineNum"> 2214 </span> :<span class="lineCov"> 92 : cout &lt;&lt; &quot;……………………………&quot; &lt;&lt; endl;</span></a>
<a name="2215"><span class="lineNum"> 2215 </span> :<span class="lineCov"> 92 : count++; //解法数加一</span></a>
<a name="2216"><span class="lineNum"> 2216 </span> :<span class="lineCov"> 92 : p[k]++; //把p[7]++ 重新开始找下一个解法</span></a>
<a name="2217"><span class="lineNum"> 2217 </span> : : }</a>
<a name="2218"><span class="lineNum"> 2218 </span> : : }</a>
<a name="2219"><span class="lineNum"> 2219 </span> : : else { //p[k]=8,此行找不到解,需要回溯,更改上一行的解法</a>
<a name="2220"><span class="lineNum"> 2220 </span> :<span class="lineCov"> 1965 : p[k] = 0; //重新初始化k行</span></a>
<a name="2221"><span class="lineNum"> 2221 </span> :<span class="lineCov"> 1965 : k--; //回到上一行</span></a>
<a name="2222"><span class="lineNum"> 2222 </span> [<span class="branchCov" title="Branch 0 was taken 1964 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 1965 : if (k &gt;= 0)p[k]++; //如果还没到最后的解法即如果不是0行找不到解的话就可以开始回溯将上一行的位置++</span></a>
<a name="2223"><span class="lineNum"> 2223 </span> : : }</a>
<a name="2224"><span class="lineNum"> 2224 </span> : : }</a>
<a name="2225"><span class="lineNum"> 2225 </span> :<span class="lineCov"> 1 : return count; //函数返回count解法数量</span></a>
<a name="2226"><span class="lineNum"> 2226 </span> : : }</a>
<a name="2227"><span class="lineNum"> 2227 </span> : : </a>
<a name="2228"><span class="lineNum"> 2228 </span> : : </a>
<a name="2229"><span class="lineNum"> 2229 </span> : : int data[ 8 ][ 8 ]; //chess(double dimensional array)</a>
<a name="2230"><span class="lineNum"> 2230 </span> : : int a[ 8 ]; //column(列)</a>
<a name="2231"><span class="lineNum"> 2231 </span> : : int b[ 15 ]; //主对角线(左上至右下)</a>
<a name="2232"><span class="lineNum"> 2232 </span> : : int c[ 15 ]; //从对角线(右上至左下)</a>
<a name="2233"><span class="lineNum"> 2233 </span> : : int cnt = 0;</a>
<a name="2234"><span class="lineNum"> 2234 </span> : : void eightQueens( int );</a>
<a name="2235"><span class="lineNum"> 2235 </span> : : void output( const int [][ 8 ], int );</a>
<a name="2236"><span class="lineNum"> 2236 </span> :<span class="lineCov"> 1 : int EightQueen1()</span></a>
<a name="2237"><span class="lineNum"> 2237 </span> : : {</a>
<a name="2238"><span class="lineNum"> 2238 </span> : : </a>
<a name="2239"><span class="lineNum"> 2239 </span> : : int i, j;</a>
<a name="2240"><span class="lineNum"> 2240 </span> : : </a>
<a name="2241"><span class="lineNum"> 2241 </span> [<span class="branchCov" title="Branch 0 was taken 15 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 16 : for( i = 0; i &lt; 15; ++i ) //主、从对角线</span></a>
<a name="2242"><span class="lineNum"> 2242 </span> :<span class="lineCov"> 15 : b[ i ] = c[ i ] = 0; //表示安全</span></a>
<a name="2243"><span class="lineNum"> 2243 </span> : : </a>
<a name="2244"><span class="lineNum"> 2244 </span> [<span class="branchCov" title="Branch 0 was taken 8 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 9 : for( i = 0; i &lt; 8; ++i )//chess</span></a>
<a name="2245"><span class="lineNum"> 2245 </span> : : {</a>
<a name="2246"><span class="lineNum"> 2246 </span> :<span class="lineCov"> 8 : a[ i ] = 0; //i列安全</span></a>
<a name="2247"><span class="lineNum"> 2247 </span> [<span class="branchCov" title="Branch 0 was taken 64 times"> + </span><span class="branchCov" title="Branch 1 was taken 8 times"> + </span>]:<span class="lineCov"> 72 : for( j = 0; j &lt; 8; ++j )</span></a>
<a name="2248"><span class="lineNum"> 2248 </span> :<span class="lineCov"> 64 : data[ i ][ j ] = 0;</span></a>
<a name="2249"><span class="lineNum"> 2249 </span> : : }</a>
<a name="2250"><span class="lineNum"> 2250 </span> : : </a>
<a name="2251"><span class="lineNum"> 2251 </span> :<span class="lineCov"> 1 : eightQueens( 0 );</span></a>
<a name="2252"><span class="lineNum"> 2252 </span> : : </a>
<a name="2253"><span class="lineNum"> 2253 </span> :<span class="lineCov"> 1 : cout &lt;&lt; &quot;/ncount = &quot; &lt;&lt; cnt &lt;&lt; endl;</span></a>
<a name="2254"><span class="lineNum"> 2254 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="2255"><span class="lineNum"> 2255 </span> : : }</a>
<a name="2256"><span class="lineNum"> 2256 </span> : : </a>
<a name="2257"><span class="lineNum"> 2257 </span> :<span class="lineCov"> 2057 : void eightQueens( int line )</span></a>
<a name="2258"><span class="lineNum"> 2258 </span> : : {</a>
<a name="2259"><span class="lineNum"> 2259 </span> [<span class="branchCov" title="Branch 0 was taken 92 times"> + </span><span class="branchCov" title="Branch 1 was taken 1965 times"> + </span>]:<span class="lineCov"> 2057 : if( 8 == line )//八个皇后安置就位,输出</span></a>
<a name="2260"><span class="lineNum"> 2260 </span> : : {</a>
<a name="2261"><span class="lineNum"> 2261 </span> :<span class="lineCov"> 92 : output( data, 8 );</span></a>
<a name="2262"><span class="lineNum"> 2262 </span> :<span class="lineCov"> 92 : cout &lt;&lt; endl;</span></a>
<a name="2263"><span class="lineNum"> 2263 </span> :<span class="lineCov"> 92 : return;</span></a>
<a name="2264"><span class="lineNum"> 2264 </span> : : }</a>
<a name="2265"><span class="lineNum"> 2265 </span> : : </a>
<a name="2266"><span class="lineNum"> 2266 </span> : : </a>
<a name="2267"><span class="lineNum"> 2267 </span> [<span class="branchCov" title="Branch 0 was taken 15720 times"> + </span><span class="branchCov" title="Branch 1 was taken 1965 times"> + </span>]:<span class="lineCov"> 17685 : for( int column = 0; column &lt; 8; ++column )</span></a>
<a name="2268"><span class="lineNum"> 2268 </span> : : {</a>
<a name="2269"><span class="lineNum"> 2269 </span> [<span class="branchCov" title="Branch 0 was taken 5508 times"> + </span><span class="branchCov" title="Branch 1 was taken 10212 times"> + </span><span class="branchCov" title="Branch 2 was taken 3420 times"> + </span><span class="branchCov" title="Branch 3 was taken 2088 times"> + </span> :<span class="lineCov"> 15720 : if( 0 == a[ column ] &amp;&amp; 0 == b[ line - column + 7 ] &amp;&amp; 0 == c[ line + column ] )</span></a>
<span class="lineNum"> </span> <span class="branchCov" title="Branch 4 was taken 2056 times"> + </span><span class="branchCov" title="Branch 5 was taken 1364 times"> + </span>]
<a name="2270"><span class="lineNum"> 2270 </span> : : {</a>
<a name="2271"><span class="lineNum"> 2271 </span> :<span class="lineCov"> 2056 : data[ line ][ column ] = 1; //安置皇后</span></a>
<a name="2272"><span class="lineNum"> 2272 </span> :<span class="lineCov"> 2056 : a[ column ] = 1; //此列被占</span></a>
<a name="2273"><span class="lineNum"> 2273 </span> :<span class="lineCov"> 2056 : b[ line - column + 7 ] = 1; //主对角线被占</span></a>
<a name="2274"><span class="lineNum"> 2274 </span> :<span class="lineCov"> 2056 : c[ line + column ] = 1; //从对角线被占</span></a>
<a name="2275"><span class="lineNum"> 2275 </span> :<span class="lineCov"> 2056 : eightQueens( line + 1 ); //下一个皇后</span></a>
<a name="2276"><span class="lineNum"> 2276 </span> : : //重置</a>
<a name="2277"><span class="lineNum"> 2277 </span> :<span class="lineCov"> 2056 : data[ line ][ column ] = 0;</span></a>
<a name="2278"><span class="lineNum"> 2278 </span> :<span class="lineCov"> 2056 : a[ column ] = 0;</span></a>
<a name="2279"><span class="lineNum"> 2279 </span> :<span class="lineCov"> 2056 : b[ line - column + 7 ] = 0;</span></a>
<a name="2280"><span class="lineNum"> 2280 </span> :<span class="lineCov"> 2056 : c[ line + column ] = 0;</span></a>
<a name="2281"><span class="lineNum"> 2281 </span> : : }</a>
<a name="2282"><span class="lineNum"> 2282 </span> : : }</a>
<a name="2283"><span class="lineNum"> 2283 </span> : : }</a>
<a name="2284"><span class="lineNum"> 2284 </span> : : </a>
<a name="2285"><span class="lineNum"> 2285 </span> : : //output chess</a>
<a name="2286"><span class="lineNum"> 2286 </span> :<span class="lineCov"> 92 : void output( const int data[][ 8 ], int size )</span></a>
<a name="2287"><span class="lineNum"> 2287 </span> : : {</a>
<a name="2288"><span class="lineNum"> 2288 </span> [<span class="branchCov" title="Branch 0 was taken 736 times"> + </span><span class="branchCov" title="Branch 1 was taken 92 times"> + </span>]:<span class="lineCov"> 828 : for( int i = 0; i &lt; size; ++i )</span></a>
<a name="2289"><span class="lineNum"> 2289 </span> : : {</a>
<a name="2290"><span class="lineNum"> 2290 </span> [<span class="branchCov" title="Branch 0 was taken 5888 times"> + </span><span class="branchCov" title="Branch 1 was taken 736 times"> + </span>]:<span class="lineCov"> 6624 : for( int j = 0; j &lt; size; ++j )</span></a>
<a name="2291"><span class="lineNum"> 2291 </span> :<span class="lineCov"> 5888 : cout &lt;&lt; data[ i ][ j ] &lt;&lt; ' ';</span></a>
<a name="2292"><span class="lineNum"> 2292 </span> :<span class="lineCov"> 736 : cout &lt;&lt; endl;</span></a>
<a name="2293"><span class="lineNum"> 2293 </span> : : }</a>
<a name="2294"><span class="lineNum"> 2294 </span> :<span class="lineCov"> 92 : ++cnt;</span></a>
<a name="2295"><span class="lineNum"> 2295 </span> :<span class="lineCov"> 92 : }</span></a>
<a name="2296"><span class="lineNum"> 2296 </span> : : </a>
<a name="2297"><span class="lineNum"> 2297 </span> : : namespace floyd_algorithm{</a>
<a name="2298"><span class="lineNum"> 2298 </span> : : </a>
<a name="2299"><span class="lineNum"> 2299 </span> : : </a>
<a name="2300"><span class="lineNum"> 2300 </span> : : #include&lt;stdio.h&gt;</a>
<a name="2301"><span class="lineNum"> 2301 </span> : : #include&lt;malloc.h&gt;</a>
<a name="2302"><span class="lineNum"> 2302 </span> : : </a>
<a name="2303"><span class="lineNum"> 2303 </span> : : #define MAXV 7 //最大顶点个数</a>
<a name="2304"><span class="lineNum"> 2304 </span> : : #define INF 32767 //定义 ∞</a>
<a name="2305"><span class="lineNum"> 2305 </span> : : //∞ == 32767 ,int 型的最大范围2位= 2^(2*8-1)TC告诉我们int占用2个字节而VC和LGCC告诉我们int占用4个字节</a>
<a name="2306"><span class="lineNum"> 2306 </span> : : //图Graph</a>
<a name="2307"><span class="lineNum"> 2307 </span> : : //顶点Vertex</a>
<a name="2308"><span class="lineNum"> 2308 </span> : : //邻接Adjacency</a>
<a name="2309"><span class="lineNum"> 2309 </span> : : //矩阵Matrix</a>
<a name="2310"><span class="lineNum"> 2310 </span> : : //表List</a>
<a name="2311"><span class="lineNum"> 2311 </span> : : //边Edge</a>
<a name="2312"><span class="lineNum"> 2312 </span> : : </a>
<a name="2313"><span class="lineNum"> 2313 </span> : : typedef struct vertex {</a>
<a name="2314"><span class="lineNum"> 2314 </span> : : int number; //顶点的编号</a>
<a name="2315"><span class="lineNum"> 2315 </span> : : }VertexType; //别名,顶点的类型</a>
<a name="2316"><span class="lineNum"> 2316 </span> : : </a>
<a name="2317"><span class="lineNum"> 2317 </span> : : typedef struct matrix {</a>
<a name="2318"><span class="lineNum"> 2318 </span> : : int n; //顶点个数</a>
<a name="2319"><span class="lineNum"> 2319 </span> : : int e; //边数</a>
<a name="2320"><span class="lineNum"> 2320 </span> : : int adjMat[MAXV][MAXV]; //邻接矩阵数组</a>
<a name="2321"><span class="lineNum"> 2321 </span> : : VertexType ver[MAXV]; //存放顶点信息</a>
<a name="2322"><span class="lineNum"> 2322 </span> : : }MatGraph; //别名,完整的图邻接矩阵类型</a>
<a name="2323"><span class="lineNum"> 2323 </span> : : </a>
<a name="2324"><span class="lineNum"> 2324 </span> : : typedef struct eNode {</a>
<a name="2325"><span class="lineNum"> 2325 </span> : : int adjVer; //该边的邻接点编号</a>
<a name="2326"><span class="lineNum"> 2326 </span> : : int weiLGht; //该边的的信息,如权值</a>
<a name="2327"><span class="lineNum"> 2327 </span> : : struct eNode* nextEdLGe; //指向下一条边的指针</a>
<a name="2328"><span class="lineNum"> 2328 </span> : : }EdgeNode; //别名,边结点的类型</a>
<a name="2329"><span class="lineNum"> 2329 </span> : : </a>
<a name="2330"><span class="lineNum"> 2330 </span> : : typedef struct vNode {</a>
<a name="2331"><span class="lineNum"> 2331 </span> : : EdgeNode* firstEdLGe; //指向第一个边结点</a>
<a name="2332"><span class="lineNum"> 2332 </span> : : }VNode; //别名,邻接表的头结点类型</a>
<a name="2333"><span class="lineNum"> 2333 </span> : : </a>
<a name="2334"><span class="lineNum"> 2334 </span> : : typedef struct list {</a>
<a name="2335"><span class="lineNum"> 2335 </span> : : int n; //顶点个数</a>
<a name="2336"><span class="lineNum"> 2336 </span> : : int e; //边数</a>
<a name="2337"><span class="lineNum"> 2337 </span> : : VNode adjList[MAXV]; //邻接表的头结点数组</a>
<a name="2338"><span class="lineNum"> 2338 </span> : : }ListGraph; //别名,完整的图邻接表类型</a>
<a name="2339"><span class="lineNum"> 2339 </span> : : </a>
<a name="2340"><span class="lineNum"> 2340 </span> : : //创建图的邻接表</a>
<a name="2341"><span class="lineNum"> 2341 </span> :<span class="lineCov"> 2 : void createAdjListGraph(ListGraph*&amp; LG, int A[MAXV][MAXV], int n, int e) {</span></a>
<a name="2342"><span class="lineNum"> 2342 </span> : : int i, j;</a>
<a name="2343"><span class="lineNum"> 2343 </span> : : EdgeNode* p;</a>
<a name="2344"><span class="lineNum"> 2344 </span> :<span class="lineCov"> 2 : LG = (ListGraph*)malloc(sizeof(ListGraph));</span></a>
<a name="2345"><span class="lineNum"> 2345 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; n; i++) {</span></a>
<a name="2346"><span class="lineNum"> 2346 </span> :<span class="lineCov"> 14 : LG-&gt;adjList[i].firstEdLGe = NULL; //给邻接表中所有头结点指针域置初值</span></a>
<a name="2347"><span class="lineNum"> 2347 </span> : : }</a>
<a name="2348"><span class="lineNum"> 2348 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; n; i++) { //检查邻接矩阵中的每个元素</span></a>
<a name="2349"><span class="lineNum"> 2349 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (j = n - 1; j &gt;= 0; j--) {</span></a>
<a name="2350"><span class="lineNum"> 2350 </span> [<span class="branchCov" title="Branch 0 was taken 84 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 98 : if (A[i][j] != 0) { //存在一条边</span></a>
<a name="2351"><span class="lineNum"> 2351 </span> :<span class="lineCov"> 84 : p = (EdgeNode*)malloc(sizeof(EdgeNode)); //申请一个结点内存</span></a>
<a name="2352"><span class="lineNum"> 2352 </span> :<span class="lineCov"> 84 : p-&gt;adjVer = j; //存放邻接点</span></a>
<a name="2353"><span class="lineNum"> 2353 </span> :<span class="lineCov"> 84 : p-&gt;weiLGht = A[i][j]; //存放权值</span></a>
<a name="2354"><span class="lineNum"> 2354 </span> :<span class="lineCov"> 84 : p-&gt;nextEdLGe = NULL;</span></a>
<a name="2355"><span class="lineNum"> 2355 </span> : : </a>
<a name="2356"><span class="lineNum"> 2356 </span> :<span class="lineCov"> 84 : p-&gt;nextEdLGe = LG-&gt;adjList[i].firstEdLGe; //头插法</span></a>
<a name="2357"><span class="lineNum"> 2357 </span> :<span class="lineCov"> 84 : LG-&gt;adjList[i].firstEdLGe = p;</span></a>
<a name="2358"><span class="lineNum"> 2358 </span> : : }</a>
<a name="2359"><span class="lineNum"> 2359 </span> : : }</a>
<a name="2360"><span class="lineNum"> 2360 </span> : : }</a>
<a name="2361"><span class="lineNum"> 2361 </span> :<span class="lineCov"> 2 : LG-&gt;n = n;</span></a>
<a name="2362"><span class="lineNum"> 2362 </span> :<span class="lineCov"> 2 : LG-&gt;e = e;</span></a>
<a name="2363"><span class="lineNum"> 2363 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="2364"><span class="lineNum"> 2364 </span> : : </a>
<a name="2365"><span class="lineNum"> 2365 </span> : : //输出邻接表</a>
<a name="2366"><span class="lineNum"> 2366 </span> :<span class="lineCov"> 1 : void displayAdjList(ListGraph* LG) {</span></a>
<a name="2367"><span class="lineNum"> 2367 </span> : : int i;</a>
<a name="2368"><span class="lineNum"> 2368 </span> : : EdgeNode* p;</a>
<a name="2369"><span class="lineNum"> 2369 </span> [<span class="branchCov" title="Branch 0 was taken 7 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 8 : for (i = 0; i &lt; MAXV; i++) {</span></a>
<a name="2370"><span class="lineNum"> 2370 </span> :<span class="lineCov"> 7 : p = LG-&gt;adjList[i].firstEdLGe;</span></a>
<a name="2371"><span class="lineNum"> 2371 </span> :<span class="lineCov"> 7 : printf(&quot;%d:&quot;, i);</span></a>
<a name="2372"><span class="lineNum"> 2372 </span> [<span class="branchCov" title="Branch 0 was taken 42 times"> + </span><span class="branchCov" title="Branch 1 was taken 7 times"> + </span>]:<span class="lineCov"> 49 : while (p != NULL) {</span></a>
<a name="2373"><span class="lineNum"> 2373 </span> [<span class="branchCov" title="Branch 0 was taken 12 times"> + </span><span class="branchCov" title="Branch 1 was taken 30 times"> + </span>]:<span class="lineCov"> 42 : if (p-&gt;weiLGht != 32767) {</span></a>
<a name="2374"><span class="lineNum"> 2374 </span> :<span class="lineCov"> 12 : printf(&quot;%2d[%d]-&gt;&quot;, p-&gt;adjVer, p-&gt;weiLGht);</span></a>
<a name="2375"><span class="lineNum"> 2375 </span> : : }</a>
<a name="2376"><span class="lineNum"> 2376 </span> :<span class="lineCov"> 42 : p = p-&gt;nextEdLGe;</span></a>
<a name="2377"><span class="lineNum"> 2377 </span> : : }</a>
<a name="2378"><span class="lineNum"> 2378 </span> :<span class="lineCov"> 7 : printf(&quot; NULL\n&quot;);</span></a>
<a name="2379"><span class="lineNum"> 2379 </span> : : }</a>
<a name="2380"><span class="lineNum"> 2380 </span> :<span class="lineCov"> 1 : }</span></a>
<a name="2381"><span class="lineNum"> 2381 </span> : : </a>
<a name="2382"><span class="lineNum"> 2382 </span> : : //输出邻接矩阵</a>
<a name="2383"><span class="lineNum"> 2383 </span> :<span class="lineCov"> 1 : void displayAdjMat(MatGraph MG) {</span></a>
<a name="2384"><span class="lineNum"> 2384 </span> : : int i, j;</a>
<a name="2385"><span class="lineNum"> 2385 </span> [<span class="branchCov" title="Branch 0 was taken 7 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 8 : for (i = 0; i &lt; MAXV; i++) {</span></a>
<a name="2386"><span class="lineNum"> 2386 </span> [<span class="branchCov" title="Branch 0 was taken 49 times"> + </span><span class="branchCov" title="Branch 1 was taken 7 times"> + </span>]:<span class="lineCov"> 56 : for (j = 0; j &lt; MAXV; j++) {</span></a>
<a name="2387"><span class="lineNum"> 2387 </span> [<span class="branchCov" title="Branch 0 was taken 7 times"> + </span><span class="branchCov" title="Branch 1 was taken 42 times"> + </span>]:<span class="lineCov"> 49 : if (MG.adjMat[i][j] == 0) {</span></a>
<a name="2388"><span class="lineNum"> 2388 </span> :<span class="lineCov"> 7 : printf(&quot;%4s&quot;, &quot;0&quot;);</span></a>
<a name="2389"><span class="lineNum"> 2389 </span> : : }</a>
<a name="2390"><span class="lineNum"> 2390 </span> [<span class="branchCov" title="Branch 0 was taken 30 times"> + </span><span class="branchCov" title="Branch 1 was taken 12 times"> + </span>]:<span class="lineCov"> 42 : else if (MG.adjMat[i][j] == 32767) {</span></a>
<a name="2391"><span class="lineNum"> 2391 </span> :<span class="lineCov"> 30 : printf(&quot;%4s&quot;, &quot;&quot;);</span></a>
<a name="2392"><span class="lineNum"> 2392 </span> : : }</a>
<a name="2393"><span class="lineNum"> 2393 </span> : : else {</a>
<a name="2394"><span class="lineNum"> 2394 </span> :<span class="lineCov"> 12 : printf(&quot;%4d&quot;, MG.adjMat[i][j]);</span></a>
<a name="2395"><span class="lineNum"> 2395 </span> : : }</a>
<a name="2396"><span class="lineNum"> 2396 </span> : : }</a>
<a name="2397"><span class="lineNum"> 2397 </span> :<span class="lineCov"> 7 : printf(&quot;\n&quot;);</span></a>
<a name="2398"><span class="lineNum"> 2398 </span> : : }</a>
<a name="2399"><span class="lineNum"> 2399 </span> :<span class="lineCov"> 1 : }</span></a>
<a name="2400"><span class="lineNum"> 2400 </span> : : </a>
<a name="2401"><span class="lineNum"> 2401 </span> : : //邻接表转换为邻接矩阵</a>
<a name="2402"><span class="lineNum"> 2402 </span> :<span class="lineCov"> 2 : void ListToMat(ListGraph* LG, MatGraph&amp; MG) {</span></a>
<a name="2403"><span class="lineNum"> 2403 </span> : : int i, j;</a>
<a name="2404"><span class="lineNum"> 2404 </span> : : EdgeNode* p;</a>
<a name="2405"><span class="lineNum"> 2405 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; MAXV; i++) {</span></a>
<a name="2406"><span class="lineNum"> 2406 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (j = 0; j &lt; MAXV; j++) {</span></a>
<a name="2407"><span class="lineNum"> 2407 </span> :<span class="lineCov"> 98 : MG.adjMat[i][j] = 0;</span></a>
<a name="2408"><span class="lineNum"> 2408 </span> : : }</a>
<a name="2409"><span class="lineNum"> 2409 </span> : : }</a>
<a name="2410"><span class="lineNum"> 2410 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; LG-&gt;n; i++) {</span></a>
<a name="2411"><span class="lineNum"> 2411 </span> :<span class="lineCov"> 14 : p = LG-&gt;adjList[i].firstEdLGe;</span></a>
<a name="2412"><span class="lineNum"> 2412 </span> [<span class="branchCov" title="Branch 0 was taken 84 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 98 : while (p != NULL) {</span></a>
<a name="2413"><span class="lineNum"> 2413 </span> :<span class="lineCov"> 84 : MG.adjMat[i][p-&gt;adjVer] = p-&gt;weiLGht;</span></a>
<a name="2414"><span class="lineNum"> 2414 </span> :<span class="lineCov"> 84 : p = p-&gt;nextEdLGe;</span></a>
<a name="2415"><span class="lineNum"> 2415 </span> : : }</a>
<a name="2416"><span class="lineNum"> 2416 </span> : : }</a>
<a name="2417"><span class="lineNum"> 2417 </span> :<span class="lineCov"> 2 : MG.n = LG-&gt;n;</span></a>
<a name="2418"><span class="lineNum"> 2418 </span> :<span class="lineCov"> 2 : MG.e = LG-&gt;e;</span></a>
<a name="2419"><span class="lineNum"> 2419 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="2420"><span class="lineNum"> 2420 </span> : : </a>
<a name="2421"><span class="lineNum"> 2421 </span> : : //输出多源最短路径</a>
<a name="2422"><span class="lineNum"> 2422 </span> :<span class="lineCov"> 2 : void displayPath(MatGraph MG, int A[MAXV][MAXV], int path[MAXV][MAXV]) {</span></a>
<a name="2423"><span class="lineNum"> 2423 </span> : : int i, j, k;</a>
<a name="2424"><span class="lineNum"> 2424 </span> : : int s;</a>
<a name="2425"><span class="lineNum"> 2425 </span> : : int aPath[MAXV]; //存放一条最短路径(逆向)</a>
<a name="2426"><span class="lineNum"> 2426 </span> : : int d; //顶点个数</a>
<a name="2427"><span class="lineNum"> 2427 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; MG.n; i++) {</span></a>
<a name="2428"><span class="lineNum"> 2428 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (j = 0; j &lt; MG.n; j++) {</span></a>
<a name="2429"><span class="lineNum"> 2429 </span> [<span class="branchCov" title="Branch 0 was taken 54 times"> + </span><span class="branchCov" title="Branch 1 was taken 44 times"> + </span><span class="branchCov" title="Branch 2 was taken 40 times"> + </span><span class="branchCov" title="Branch 3 was taken 14 times"> + </span>]:<span class="lineCov"> 98 : if (A[i][j] != INF &amp;&amp; i != j) { //若顶点 i 和 顶点 j 之间存在路径</span></a>
<a name="2430"><span class="lineNum"> 2430 </span> : : //printf(&quot;从 %d 到 %d 的路径为:&quot;, i, j);</a>
<a name="2431"><span class="lineNum"> 2431 </span> :<span class="lineCov"> 40 : k = path[i][j];</span></a>
<a name="2432"><span class="lineNum"> 2432 </span> :<span class="lineCov"> 40 : d = 0;</span></a>
<a name="2433"><span class="lineNum"> 2433 </span> :<span class="lineCov"> 40 : aPath[d] = j; //路径上添加终点</span></a>
<a name="2434"><span class="lineNum"> 2434 </span> :<span class="lineCov"> 46 : while (//k != -1 &amp;&amp;</span></a>
<a name="2435"><span class="lineNum"> 2435 </span> [<span class="branchCov" title="Branch 0 was taken 46 times"> + </span><span class="branchCov" title="Branch 1 was taken 40 times"> + </span>]:<span class="lineCov"> 86 : k != i) { //路劲上添加中间点</span></a>
<a name="2436"><span class="lineNum"> 2436 </span> :<span class="lineCov"> 46 : d++;</span></a>
<a name="2437"><span class="lineNum"> 2437 </span> :<span class="lineCov"> 46 : aPath[d] = k;</span></a>
<a name="2438"><span class="lineNum"> 2438 </span> :<span class="lineCov"> 46 : k = path[i][k];</span></a>
<a name="2439"><span class="lineNum"> 2439 </span> : : }</a>
<a name="2440"><span class="lineNum"> 2440 </span> :<span class="lineCov"> 40 : d++;</span></a>
<a name="2441"><span class="lineNum"> 2441 </span> :<span class="lineCov"> 40 : aPath[d] = i; //路径上添加起点</span></a>
<a name="2442"><span class="lineNum"> 2442 </span> : : //printf(&quot;%d&quot;, aPath[d]); //输出起点</a>
<a name="2443"><span class="lineNum"> 2443 </span> [<span class="branchCov" title="Branch 0 was taken 86 times"> + </span><span class="branchCov" title="Branch 1 was taken 40 times"> + </span>]:<span class="lineCov"> 126 : for (s = d - 1; s &gt;= 0; s--) { //输出路径上其他顶点</span></a>
<a name="2444"><span class="lineNum"> 2444 </span> : : //printf(&quot;-&gt;%d&quot;, aPath[s]);</a>
<a name="2445"><span class="lineNum"> 2445 </span> : : }</a>
<a name="2446"><span class="lineNum"> 2446 </span> : : //printf(&quot;\t\t&quot;);</a>
<a name="2447"><span class="lineNum"> 2447 </span> : : //printf(&quot;路径长度为:%d\n&quot;, A[i][j]);</a>
<a name="2448"><span class="lineNum"> 2448 </span> : : }</a>
<a name="2449"><span class="lineNum"> 2449 </span> : : }</a>
<a name="2450"><span class="lineNum"> 2450 </span> : : }</a>
<a name="2451"><span class="lineNum"> 2451 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="2452"><span class="lineNum"> 2452 </span> : : </a>
<a name="2453"><span class="lineNum"> 2453 </span> : : //Floyd算法</a>
<a name="2454"><span class="lineNum"> 2454 </span> :<span class="lineCov"> 2 : void Floyd(MatGraph MG) {</span></a>
<a name="2455"><span class="lineNum"> 2455 </span> : : int i, j, k;</a>
<a name="2456"><span class="lineNum"> 2456 </span> : : int A[MAXV][MAXV];</a>
<a name="2457"><span class="lineNum"> 2457 </span> : : int path[MAXV][MAXV];</a>
<a name="2458"><span class="lineNum"> 2458 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; MG.n; i++) {</span></a>
<a name="2459"><span class="lineNum"> 2459 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (j = 0; j &lt; MG.n; j++) {</span></a>
<a name="2460"><span class="lineNum"> 2460 </span> :<span class="lineCov"> 98 : A[i][j] = MG.adjMat[i][j];</span></a>
<a name="2461"><span class="lineNum"> 2461 </span> [<span class="branchCov" title="Branch 0 was taken 84 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span><span class="branchCov" title="Branch 2 was taken 24 times"> + </span><span class="branchCov" title="Branch 3 was taken 60 times"> + </span>]:<span class="lineCov"> 98 : if (i != j &amp;&amp; MG.adjMat[i][j] &lt; INF) {</span></a>
<a name="2462"><span class="lineNum"> 2462 </span> :<span class="lineCov"> 24 : path[i][j] = i; //顶点 i 到顶点 j 有边时</span></a>
<a name="2463"><span class="lineNum"> 2463 </span> : : }</a>
<a name="2464"><span class="lineNum"> 2464 </span> : : else {</a>
<a name="2465"><span class="lineNum"> 2465 </span> :<span class="lineCov"> 74 : path[i][j] = -1; //顶点 i 到顶点 j 无边时</span></a>
<a name="2466"><span class="lineNum"> 2466 </span> : : }</a>
<a name="2467"><span class="lineNum"> 2467 </span> : : }</a>
<a name="2468"><span class="lineNum"> 2468 </span> : : }</a>
<a name="2469"><span class="lineNum"> 2469 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (k = 0; k &lt; MG.n; k++) { //一次考察所有顶点</span></a>
<a name="2470"><span class="lineNum"> 2470 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (i = 0; i &lt; MG.n; i++) {</span></a>
<a name="2471"><span class="lineNum"> 2471 </span> [<span class="branchCov" title="Branch 0 was taken 686 times"> + </span><span class="branchCov" title="Branch 1 was taken 98 times"> + </span>]:<span class="lineCov"> 784 : for (j = 0; j &lt; MG.n; j++) {</span></a>
<a name="2472"><span class="lineNum"> 2472 </span> [<span class="branchCov" title="Branch 0 was taken 36 times"> + </span><span class="branchCov" title="Branch 1 was taken 650 times"> + </span>]:<span class="lineCov"> 686 : if (A[i][j] &gt; A[i][k] + A[k][j]) {</span></a>
<a name="2473"><span class="lineNum"> 2473 </span> :<span class="lineCov"> 36 : A[i][j] = A[i][k] + A[k][j]; //修改最短路径长度</span></a>
<a name="2474"><span class="lineNum"> 2474 </span> :<span class="lineCov"> 36 : path[i][j] = path[k][j]; //修改最短路径</span></a>
<a name="2475"><span class="lineNum"> 2475 </span> : : }</a>
<a name="2476"><span class="lineNum"> 2476 </span> : : }</a>
<a name="2477"><span class="lineNum"> 2477 </span> : : }</a>
<a name="2478"><span class="lineNum"> 2478 </span> : : }</a>
<a name="2479"><span class="lineNum"> 2479 </span> :<span class="lineCov"> 2 : displayPath(MG, A, path); //输出最短路径</span></a>
<a name="2480"><span class="lineNum"> 2480 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="2481"><span class="lineNum"> 2481 </span> : : </a>
<a name="2482"><span class="lineNum"> 2482 </span> :<span class="lineCov"> 1 : int floyd() {</span></a>
<a name="2483"><span class="lineNum"> 2483 </span> : : ListGraph* LG;</a>
<a name="2484"><span class="lineNum"> 2484 </span> : : MatGraph MG;</a>
<a name="2485"><span class="lineNum"> 2485 </span> : : </a>
<a name="2486"><span class="lineNum"> 2486 </span> :<span class="lineCov"> 1 : int array[MAXV][MAXV] = {</span></a>
<a name="2487"><span class="lineNum"> 2487 </span> : : { 0, 4, 6, 6,INF,INF,INF},</a>
<a name="2488"><span class="lineNum"> 2488 </span> : : {INF, 0, 1,INF, 7,INF,INF},</a>
<a name="2489"><span class="lineNum"> 2489 </span> : : {INF,INF, 0,INF, 6, 4,INF},</a>
<a name="2490"><span class="lineNum"> 2490 </span> : : {INF,INF, 2, 0,INF, 5,INF},</a>
<a name="2491"><span class="lineNum"> 2491 </span> : : {INF,INF,INF,INF, 0,INF, 6},</a>
<a name="2492"><span class="lineNum"> 2492 </span> : : {INF,INF,INF,INF, 1, 0, 8},</a>
<a name="2493"><span class="lineNum"> 2493 </span> : : {INF,INF,INF,INF,INF,INF, 0}</a>
<a name="2494"><span class="lineNum"> 2494 </span> : : };</a>
<a name="2495"><span class="lineNum"> 2495 </span> : : </a>
<a name="2496"><span class="lineNum"> 2496 </span> :<span class="lineCov"> 1 : int e = 12;</span></a>
<a name="2497"><span class="lineNum"> 2497 </span> :<span class="lineCov"> 1 : createAdjListGraph(LG, array, MAXV, e);</span></a>
<a name="2498"><span class="lineNum"> 2498 </span> : : //displayAdjList(LG);</a>
<a name="2499"><span class="lineNum"> 2499 </span> : : //printf(&quot;\n&quot;);</a>
<a name="2500"><span class="lineNum"> 2500 </span> : : </a>
<a name="2501"><span class="lineNum"> 2501 </span> :<span class="lineCov"> 1 : ListToMat(LG, MG);</span></a>
<a name="2502"><span class="lineNum"> 2502 </span> : : //displayAdjMat(MG);</a>
<a name="2503"><span class="lineNum"> 2503 </span> : : //printf(&quot;\n&quot;);</a>
<a name="2504"><span class="lineNum"> 2504 </span> : : </a>
<a name="2505"><span class="lineNum"> 2505 </span> :<span class="lineCov"> 1 : Floyd(MG);</span></a>
<a name="2506"><span class="lineNum"> 2506 </span> : : //printf(&quot;\n&quot;);</a>
<a name="2507"><span class="lineNum"> 2507 </span> : : </a>
<a name="2508"><span class="lineNum"> 2508 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="2509"><span class="lineNum"> 2509 </span> : : }</a>
<a name="2510"><span class="lineNum"> 2510 </span> : : </a>
<a name="2511"><span class="lineNum"> 2511 </span> : : }</a>
<a name="2512"><span class="lineNum"> 2512 </span> : : </a>
<a name="2513"><span class="lineNum"> 2513 </span> : : namespace __floyd{</a>
<a name="2514"><span class="lineNum"> 2514 </span> : : </a>
<a name="2515"><span class="lineNum"> 2515 </span> : : </a>
<a name="2516"><span class="lineNum"> 2516 </span> : : #include&lt;stdio.h&gt;</a>
<a name="2517"><span class="lineNum"> 2517 </span> : : #include&lt;malloc.h&gt;</a>
<a name="2518"><span class="lineNum"> 2518 </span> : : </a>
<a name="2519"><span class="lineNum"> 2519 </span> : : #define MAXV 7 //最大顶点个数</a>
<a name="2520"><span class="lineNum"> 2520 </span> : : #define INF 32767 //定义 ∞</a>
<a name="2521"><span class="lineNum"> 2521 </span> : : //∞ == 32767 ,int 型的最大范围2位= 2^(2*8-1)TC告诉我们int占用2个字节而VC和LGCC告诉我们int占用4个字节</a>
<a name="2522"><span class="lineNum"> 2522 </span> : : //图Graph</a>
<a name="2523"><span class="lineNum"> 2523 </span> : : //顶点Vertex</a>
<a name="2524"><span class="lineNum"> 2524 </span> : : //邻接Adjacency</a>
<a name="2525"><span class="lineNum"> 2525 </span> : : //矩阵Matrix</a>
<a name="2526"><span class="lineNum"> 2526 </span> : : //表List</a>
<a name="2527"><span class="lineNum"> 2527 </span> : : //边Edge</a>
<a name="2528"><span class="lineNum"> 2528 </span> : : </a>
<a name="2529"><span class="lineNum"> 2529 </span> : : typedef struct vertex {</a>
<a name="2530"><span class="lineNum"> 2530 </span> : : int number; //顶点的编号</a>
<a name="2531"><span class="lineNum"> 2531 </span> : : }VertexType; //别名,顶点的类型</a>
<a name="2532"><span class="lineNum"> 2532 </span> : : </a>
<a name="2533"><span class="lineNum"> 2533 </span> : : typedef struct matrix {</a>
<a name="2534"><span class="lineNum"> 2534 </span> : : int n; //顶点个数</a>
<a name="2535"><span class="lineNum"> 2535 </span> : : int e; //边数</a>
<a name="2536"><span class="lineNum"> 2536 </span> : : int adjMat[MAXV][MAXV]; //邻接矩阵数组</a>
<a name="2537"><span class="lineNum"> 2537 </span> : : VertexType ver[MAXV]; //存放顶点信息</a>
<a name="2538"><span class="lineNum"> 2538 </span> : : }MatGraph; //别名,完整的图邻接矩阵类型</a>
<a name="2539"><span class="lineNum"> 2539 </span> : : </a>
<a name="2540"><span class="lineNum"> 2540 </span> : : typedef struct eNode {</a>
<a name="2541"><span class="lineNum"> 2541 </span> : : int adjVer; //该边的邻接点编号</a>
<a name="2542"><span class="lineNum"> 2542 </span> : : int weiLGht; //该边的的信息,如权值</a>
<a name="2543"><span class="lineNum"> 2543 </span> : : struct eNode* nextEdLGe; //指向下一条边的指针</a>
<a name="2544"><span class="lineNum"> 2544 </span> : : }EdgeNode; //别名,边结点的类型</a>
<a name="2545"><span class="lineNum"> 2545 </span> : : </a>
<a name="2546"><span class="lineNum"> 2546 </span> : : typedef struct vNode {</a>
<a name="2547"><span class="lineNum"> 2547 </span> : : EdgeNode* firstEdLGe; //指向第一个边结点</a>
<a name="2548"><span class="lineNum"> 2548 </span> : : }VNode; //别名,邻接表的头结点类型</a>
<a name="2549"><span class="lineNum"> 2549 </span> : : </a>
<a name="2550"><span class="lineNum"> 2550 </span> : : typedef struct list {</a>
<a name="2551"><span class="lineNum"> 2551 </span> : : int n; //顶点个数</a>
<a name="2552"><span class="lineNum"> 2552 </span> : : int e; //边数</a>
<a name="2553"><span class="lineNum"> 2553 </span> : : VNode adjList[MAXV]; //邻接表的头结点数组</a>
<a name="2554"><span class="lineNum"> 2554 </span> : : }ListGraph; //别名,完整的图邻接表类型</a>
<a name="2555"><span class="lineNum"> 2555 </span> : : </a>
<a name="2556"><span class="lineNum"> 2556 </span> : : //创建图的邻接表</a>
<a name="2557"><span class="lineNum"> 2557 </span> :<span class="lineCov"> 2 : void createAdjListGraph(ListGraph*&amp; LG, int A[MAXV][MAXV], int n, int e) {</span></a>
<a name="2558"><span class="lineNum"> 2558 </span> : : int i, j;</a>
<a name="2559"><span class="lineNum"> 2559 </span> : : EdgeNode* p;</a>
<a name="2560"><span class="lineNum"> 2560 </span> :<span class="lineCov"> 2 : LG = (ListGraph*)malloc(sizeof(ListGraph));</span></a>
<a name="2561"><span class="lineNum"> 2561 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; n; i++) {</span></a>
<a name="2562"><span class="lineNum"> 2562 </span> :<span class="lineCov"> 14 : LG-&gt;adjList[i].firstEdLGe = NULL; //给邻接表中所有头结点指针域置初值</span></a>
<a name="2563"><span class="lineNum"> 2563 </span> : : }</a>
<a name="2564"><span class="lineNum"> 2564 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; n; i++) { //检查邻接矩阵中的每个元素</span></a>
<a name="2565"><span class="lineNum"> 2565 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (j = n - 1; j &gt;= 0; j--) {</span></a>
<a name="2566"><span class="lineNum"> 2566 </span> [<span class="branchCov" title="Branch 0 was taken 84 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 98 : if (A[i][j] != 0) { //存在一条边</span></a>
<a name="2567"><span class="lineNum"> 2567 </span> :<span class="lineCov"> 84 : p = (EdgeNode*)malloc(sizeof(EdgeNode)); //申请一个结点内存</span></a>
<a name="2568"><span class="lineNum"> 2568 </span> :<span class="lineCov"> 84 : p-&gt;adjVer = j; //存放邻接点</span></a>
<a name="2569"><span class="lineNum"> 2569 </span> :<span class="lineCov"> 84 : p-&gt;weiLGht = A[i][j]; //存放权值</span></a>
<a name="2570"><span class="lineNum"> 2570 </span> :<span class="lineCov"> 84 : p-&gt;nextEdLGe = NULL;</span></a>
<a name="2571"><span class="lineNum"> 2571 </span> : : </a>
<a name="2572"><span class="lineNum"> 2572 </span> :<span class="lineCov"> 84 : p-&gt;nextEdLGe = LG-&gt;adjList[i].firstEdLGe; //头插法</span></a>
<a name="2573"><span class="lineNum"> 2573 </span> :<span class="lineCov"> 84 : LG-&gt;adjList[i].firstEdLGe = p;</span></a>
<a name="2574"><span class="lineNum"> 2574 </span> : : }</a>
<a name="2575"><span class="lineNum"> 2575 </span> : : }</a>
<a name="2576"><span class="lineNum"> 2576 </span> : : }</a>
<a name="2577"><span class="lineNum"> 2577 </span> :<span class="lineCov"> 2 : LG-&gt;n = n;</span></a>
<a name="2578"><span class="lineNum"> 2578 </span> :<span class="lineCov"> 2 : LG-&gt;e = e;</span></a>
<a name="2579"><span class="lineNum"> 2579 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="2580"><span class="lineNum"> 2580 </span> : : </a>
<a name="2581"><span class="lineNum"> 2581 </span> : : //输出邻接表</a>
<a name="2582"><span class="lineNum"> 2582 </span> :<span class="lineCov"> 1 : void displayAdjList(ListGraph* LG) {</span></a>
<a name="2583"><span class="lineNum"> 2583 </span> : : int i;</a>
<a name="2584"><span class="lineNum"> 2584 </span> : : EdgeNode* p;</a>
<a name="2585"><span class="lineNum"> 2585 </span> [<span class="branchCov" title="Branch 0 was taken 7 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 8 : for (i = 0; i &lt; MAXV; i++) {</span></a>
<a name="2586"><span class="lineNum"> 2586 </span> :<span class="lineCov"> 7 : p = LG-&gt;adjList[i].firstEdLGe;</span></a>
<a name="2587"><span class="lineNum"> 2587 </span> :<span class="lineCov"> 7 : printf(&quot;%d:&quot;, i);</span></a>
<a name="2588"><span class="lineNum"> 2588 </span> [<span class="branchCov" title="Branch 0 was taken 42 times"> + </span><span class="branchCov" title="Branch 1 was taken 7 times"> + </span>]:<span class="lineCov"> 49 : while (p != NULL) {</span></a>
<a name="2589"><span class="lineNum"> 2589 </span> [<span class="branchCov" title="Branch 0 was taken 12 times"> + </span><span class="branchCov" title="Branch 1 was taken 30 times"> + </span>]:<span class="lineCov"> 42 : if (p-&gt;weiLGht != 32767) {</span></a>
<a name="2590"><span class="lineNum"> 2590 </span> :<span class="lineCov"> 12 : printf(&quot;%2d[%d]-&gt;&quot;, p-&gt;adjVer, p-&gt;weiLGht);</span></a>
<a name="2591"><span class="lineNum"> 2591 </span> : : }</a>
<a name="2592"><span class="lineNum"> 2592 </span> :<span class="lineCov"> 42 : p = p-&gt;nextEdLGe;</span></a>
<a name="2593"><span class="lineNum"> 2593 </span> : : }</a>
<a name="2594"><span class="lineNum"> 2594 </span> :<span class="lineCov"> 7 : printf(&quot; NULL\n&quot;);</span></a>
<a name="2595"><span class="lineNum"> 2595 </span> : : }</a>
<a name="2596"><span class="lineNum"> 2596 </span> :<span class="lineCov"> 1 : }</span></a>
<a name="2597"><span class="lineNum"> 2597 </span> : : </a>
<a name="2598"><span class="lineNum"> 2598 </span> : : //输出邻接矩阵</a>
<a name="2599"><span class="lineNum"> 2599 </span> :<span class="lineCov"> 1 : void displayAdjMat(MatGraph MG) {</span></a>
<a name="2600"><span class="lineNum"> 2600 </span> : : int i, j;</a>
<a name="2601"><span class="lineNum"> 2601 </span> [<span class="branchCov" title="Branch 0 was taken 7 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 8 : for (i = 0; i &lt; MAXV; i++) {</span></a>
<a name="2602"><span class="lineNum"> 2602 </span> [<span class="branchCov" title="Branch 0 was taken 49 times"> + </span><span class="branchCov" title="Branch 1 was taken 7 times"> + </span>]:<span class="lineCov"> 56 : for (j = 0; j &lt; MAXV; j++) {</span></a>
<a name="2603"><span class="lineNum"> 2603 </span> [<span class="branchCov" title="Branch 0 was taken 7 times"> + </span><span class="branchCov" title="Branch 1 was taken 42 times"> + </span>]:<span class="lineCov"> 49 : if (MG.adjMat[i][j] == 0) {</span></a>
<a name="2604"><span class="lineNum"> 2604 </span> :<span class="lineCov"> 7 : printf(&quot;%4s&quot;, &quot;0&quot;);</span></a>
<a name="2605"><span class="lineNum"> 2605 </span> : : }</a>
<a name="2606"><span class="lineNum"> 2606 </span> [<span class="branchCov" title="Branch 0 was taken 30 times"> + </span><span class="branchCov" title="Branch 1 was taken 12 times"> + </span>]:<span class="lineCov"> 42 : else if (MG.adjMat[i][j] == 32767) {</span></a>
<a name="2607"><span class="lineNum"> 2607 </span> :<span class="lineCov"> 30 : printf(&quot;%4s&quot;, &quot;&quot;);</span></a>
<a name="2608"><span class="lineNum"> 2608 </span> : : }</a>
<a name="2609"><span class="lineNum"> 2609 </span> : : else {</a>
<a name="2610"><span class="lineNum"> 2610 </span> :<span class="lineCov"> 12 : printf(&quot;%4d&quot;, MG.adjMat[i][j]);</span></a>
<a name="2611"><span class="lineNum"> 2611 </span> : : }</a>
<a name="2612"><span class="lineNum"> 2612 </span> : : }</a>
<a name="2613"><span class="lineNum"> 2613 </span> :<span class="lineCov"> 7 : printf(&quot;\n&quot;);</span></a>
<a name="2614"><span class="lineNum"> 2614 </span> : : }</a>
<a name="2615"><span class="lineNum"> 2615 </span> :<span class="lineCov"> 1 : }</span></a>
<a name="2616"><span class="lineNum"> 2616 </span> : : </a>
<a name="2617"><span class="lineNum"> 2617 </span> : : //邻接表转换为邻接矩阵</a>
<a name="2618"><span class="lineNum"> 2618 </span> :<span class="lineCov"> 2 : void ListToMat(ListGraph* LG, MatGraph&amp; MG) {</span></a>
<a name="2619"><span class="lineNum"> 2619 </span> : : int i, j;</a>
<a name="2620"><span class="lineNum"> 2620 </span> : : EdgeNode* p;</a>
<a name="2621"><span class="lineNum"> 2621 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; MAXV; i++) {</span></a>
<a name="2622"><span class="lineNum"> 2622 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (j = 0; j &lt; MAXV; j++) {</span></a>
<a name="2623"><span class="lineNum"> 2623 </span> :<span class="lineCov"> 98 : MG.adjMat[i][j] = 0;</span></a>
<a name="2624"><span class="lineNum"> 2624 </span> : : }</a>
<a name="2625"><span class="lineNum"> 2625 </span> : : }</a>
<a name="2626"><span class="lineNum"> 2626 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; LG-&gt;n; i++) {</span></a>
<a name="2627"><span class="lineNum"> 2627 </span> :<span class="lineCov"> 14 : p = LG-&gt;adjList[i].firstEdLGe;</span></a>
<a name="2628"><span class="lineNum"> 2628 </span> [<span class="branchCov" title="Branch 0 was taken 84 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 98 : while (p != NULL) {</span></a>
<a name="2629"><span class="lineNum"> 2629 </span> :<span class="lineCov"> 84 : MG.adjMat[i][p-&gt;adjVer] = p-&gt;weiLGht;</span></a>
<a name="2630"><span class="lineNum"> 2630 </span> :<span class="lineCov"> 84 : p = p-&gt;nextEdLGe;</span></a>
<a name="2631"><span class="lineNum"> 2631 </span> : : }</a>
<a name="2632"><span class="lineNum"> 2632 </span> : : }</a>
<a name="2633"><span class="lineNum"> 2633 </span> :<span class="lineCov"> 2 : MG.n = LG-&gt;n;</span></a>
<a name="2634"><span class="lineNum"> 2634 </span> :<span class="lineCov"> 2 : MG.e = LG-&gt;e;</span></a>
<a name="2635"><span class="lineNum"> 2635 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="2636"><span class="lineNum"> 2636 </span> : : </a>
<a name="2637"><span class="lineNum"> 2637 </span> : : //输出多源最短路径</a>
<a name="2638"><span class="lineNum"> 2638 </span> :<span class="lineCov"> 2 : void displayPath(MatGraph MG, int A[MAXV][MAXV], int path[MAXV][MAXV]) {</span></a>
<a name="2639"><span class="lineNum"> 2639 </span> : : int i, j, k;</a>
<a name="2640"><span class="lineNum"> 2640 </span> : : int s;</a>
<a name="2641"><span class="lineNum"> 2641 </span> : : int aPath[MAXV]; //存放一条最短路径(逆向)</a>
<a name="2642"><span class="lineNum"> 2642 </span> : : int d; //顶点个数</a>
<a name="2643"><span class="lineNum"> 2643 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; MG.n; i++) {</span></a>
<a name="2644"><span class="lineNum"> 2644 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (j = 0; j &lt; MG.n; j++) {</span></a>
<a name="2645"><span class="lineNum"> 2645 </span> [<span class="branchCov" title="Branch 0 was taken 54 times"> + </span><span class="branchCov" title="Branch 1 was taken 44 times"> + </span>]:<span class="lineCov"> 98 : if (A[i][j] != INF</span></a>
<a name="2646"><span class="lineNum"> 2646 </span> [<span class="branchCov" title="Branch 0 was taken 40 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 54 : &amp;&amp; i != j) { //若顶点 i 和 顶点 j 之间存在路径</span></a>
<a name="2647"><span class="lineNum"> 2647 </span> : : //printf(&quot;从 %d 到 %d 的路径为:&quot;, i, j);</a>
<a name="2648"><span class="lineNum"> 2648 </span> :<span class="lineCov"> 40 : k = path[i][j];</span></a>
<a name="2649"><span class="lineNum"> 2649 </span> :<span class="lineCov"> 40 : d = 0;</span></a>
<a name="2650"><span class="lineNum"> 2650 </span> :<span class="lineCov"> 40 : aPath[d] = j; //路径上添加终点</span></a>
<a name="2651"><span class="lineNum"> 2651 </span> :<span class="lineCov"> 46 : while (//k != -1 &amp;&amp;</span></a>
<a name="2652"><span class="lineNum"> 2652 </span> [<span class="branchCov" title="Branch 0 was taken 46 times"> + </span><span class="branchCov" title="Branch 1 was taken 40 times"> + </span>]:<span class="lineCov"> 86 : k != i) { //路劲上添加中间点</span></a>
<a name="2653"><span class="lineNum"> 2653 </span> :<span class="lineCov"> 46 : d++;</span></a>
<a name="2654"><span class="lineNum"> 2654 </span> :<span class="lineCov"> 46 : aPath[d] = k;</span></a>
<a name="2655"><span class="lineNum"> 2655 </span> :<span class="lineCov"> 46 : k = path[i][k];</span></a>
<a name="2656"><span class="lineNum"> 2656 </span> : : }</a>
<a name="2657"><span class="lineNum"> 2657 </span> :<span class="lineCov"> 40 : d++;</span></a>
<a name="2658"><span class="lineNum"> 2658 </span> :<span class="lineCov"> 40 : aPath[d] = i; //路径上添加起点</span></a>
<a name="2659"><span class="lineNum"> 2659 </span> : : //printf(&quot;%d&quot;, aPath[d]); //输出起点</a>
<a name="2660"><span class="lineNum"> 2660 </span> [<span class="branchCov" title="Branch 0 was taken 86 times"> + </span><span class="branchCov" title="Branch 1 was taken 40 times"> + </span>]:<span class="lineCov"> 126 : for (s = d - 1; s &gt;= 0; s--) { //输出路径上其他顶点</span></a>
<a name="2661"><span class="lineNum"> 2661 </span> : : //printf(&quot;-&gt;%d&quot;, aPath[s]);</a>
<a name="2662"><span class="lineNum"> 2662 </span> : : }</a>
<a name="2663"><span class="lineNum"> 2663 </span> : : //printf(&quot;\t\t&quot;);</a>
<a name="2664"><span class="lineNum"> 2664 </span> : : //printf(&quot;路径长度为:%d\n&quot;, A[i][j]);</a>
<a name="2665"><span class="lineNum"> 2665 </span> : : }</a>
<a name="2666"><span class="lineNum"> 2666 </span> : : }</a>
<a name="2667"><span class="lineNum"> 2667 </span> : : }</a>
<a name="2668"><span class="lineNum"> 2668 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="2669"><span class="lineNum"> 2669 </span> : : </a>
<a name="2670"><span class="lineNum"> 2670 </span> : : //Floyd算法</a>
<a name="2671"><span class="lineNum"> 2671 </span> :<span class="lineCov"> 2 : void Floyd(MatGraph MG) {</span></a>
<a name="2672"><span class="lineNum"> 2672 </span> : : int i, j, k;</a>
<a name="2673"><span class="lineNum"> 2673 </span> : : int A[MAXV][MAXV];</a>
<a name="2674"><span class="lineNum"> 2674 </span> : : int path[MAXV][MAXV];</a>
<a name="2675"><span class="lineNum"> 2675 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (i = 0; i &lt; MG.n; i++) {</span></a>
<a name="2676"><span class="lineNum"> 2676 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (j = 0; j &lt; MG.n; j++) {</span></a>
<a name="2677"><span class="lineNum"> 2677 </span> :<span class="lineCov"> 98 : A[i][j] = MG.adjMat[i][j];</span></a>
<a name="2678"><span class="lineNum"> 2678 </span> [<span class="branchCov" title="Branch 0 was taken 84 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 98 : if (i != j &amp;&amp;</span></a>
<a name="2679"><span class="lineNum"> 2679 </span> [<span class="branchCov" title="Branch 0 was taken 24 times"> + </span><span class="branchCov" title="Branch 1 was taken 60 times"> + </span>]:<span class="lineCov"> 84 : MG.adjMat[i][j] &lt; INF) {</span></a>
<a name="2680"><span class="lineNum"> 2680 </span> :<span class="lineCov"> 24 : path[i][j] = i; //顶点 i 到顶点 j 有边时</span></a>
<a name="2681"><span class="lineNum"> 2681 </span> : : }</a>
<a name="2682"><span class="lineNum"> 2682 </span> : : else {</a>
<a name="2683"><span class="lineNum"> 2683 </span> :<span class="lineCov"> 74 : path[i][j] = -1; //顶点 i 到顶点 j 无边时</span></a>
<a name="2684"><span class="lineNum"> 2684 </span> : : }</a>
<a name="2685"><span class="lineNum"> 2685 </span> : : }</a>
<a name="2686"><span class="lineNum"> 2686 </span> : : }</a>
<a name="2687"><span class="lineNum"> 2687 </span> [<span class="branchCov" title="Branch 0 was taken 14 times"> + </span><span class="branchCov" title="Branch 1 was taken 2 times"> + </span>]:<span class="lineCov"> 16 : for (k = 0; k &lt; MG.n; k++) { //一次考察所有顶点</span></a>
<a name="2688"><span class="lineNum"> 2688 </span> [<span class="branchCov" title="Branch 0 was taken 98 times"> + </span><span class="branchCov" title="Branch 1 was taken 14 times"> + </span>]:<span class="lineCov"> 112 : for (i = 0; i &lt; MG.n; i++) {</span></a>
<a name="2689"><span class="lineNum"> 2689 </span> [<span class="branchCov" title="Branch 0 was taken 686 times"> + </span><span class="branchCov" title="Branch 1 was taken 98 times"> + </span>]:<span class="lineCov"> 784 : for (j = 0; j &lt; MG.n; j++) {</span></a>
<a name="2690"><span class="lineNum"> 2690 </span> [<span class="branchCov" title="Branch 0 was taken 36 times"> + </span><span class="branchCov" title="Branch 1 was taken 650 times"> + </span>]:<span class="lineCov"> 686 : if (A[i][j] &gt; A[i][k] + A[k][j]) {</span></a>
<a name="2691"><span class="lineNum"> 2691 </span> :<span class="lineCov"> 36 : A[i][j] = A[i][k] + A[k][j]; //修改最短路径长度</span></a>
<a name="2692"><span class="lineNum"> 2692 </span> :<span class="lineCov"> 36 : path[i][j] = path[k][j]; //修改最短路径</span></a>
<a name="2693"><span class="lineNum"> 2693 </span> : : }</a>
<a name="2694"><span class="lineNum"> 2694 </span> : : }</a>
<a name="2695"><span class="lineNum"> 2695 </span> : : }</a>
<a name="2696"><span class="lineNum"> 2696 </span> : : }</a>
<a name="2697"><span class="lineNum"> 2697 </span> :<span class="lineCov"> 2 : displayPath(MG, A, path); //输出最短路径</span></a>
<a name="2698"><span class="lineNum"> 2698 </span> :<span class="lineCov"> 2 : }</span></a>
<a name="2699"><span class="lineNum"> 2699 </span> : : </a>
<a name="2700"><span class="lineNum"> 2700 </span> :<span class="lineCov"> 1 : int floyd() {</span></a>
<a name="2701"><span class="lineNum"> 2701 </span> : : ListGraph* LG;</a>
<a name="2702"><span class="lineNum"> 2702 </span> : : MatGraph MG;</a>
<a name="2703"><span class="lineNum"> 2703 </span> : : </a>
<a name="2704"><span class="lineNum"> 2704 </span> :<span class="lineCov"> 1 : int array[MAXV][MAXV] = {</span></a>
<a name="2705"><span class="lineNum"> 2705 </span> : : { 0, 4, 6, 6,INF,INF,INF},</a>
<a name="2706"><span class="lineNum"> 2706 </span> : : {INF, 0, 1,INF, 7,INF,INF},</a>
<a name="2707"><span class="lineNum"> 2707 </span> : : {INF,INF, 0,INF, 6, 4,INF},</a>
<a name="2708"><span class="lineNum"> 2708 </span> : : {INF,INF, 2, 0,INF, 5,INF},</a>
<a name="2709"><span class="lineNum"> 2709 </span> : : {INF,INF,INF,INF, 0,INF, 6},</a>
<a name="2710"><span class="lineNum"> 2710 </span> : : {INF,INF,INF,INF, 1, 0, 8},</a>
<a name="2711"><span class="lineNum"> 2711 </span> : : {INF,INF,INF,INF,INF,INF, 0}</a>
<a name="2712"><span class="lineNum"> 2712 </span> : : };</a>
<a name="2713"><span class="lineNum"> 2713 </span> : : </a>
<a name="2714"><span class="lineNum"> 2714 </span> :<span class="lineCov"> 1 : int e = 12;</span></a>
<a name="2715"><span class="lineNum"> 2715 </span> :<span class="lineCov"> 1 : createAdjListGraph(LG, array, MAXV, e);</span></a>
<a name="2716"><span class="lineNum"> 2716 </span> : : //displayAdjList(LG);</a>
<a name="2717"><span class="lineNum"> 2717 </span> : : //printf(&quot;\n&quot;);</a>
<a name="2718"><span class="lineNum"> 2718 </span> : : </a>
<a name="2719"><span class="lineNum"> 2719 </span> :<span class="lineCov"> 1 : ListToMat(LG, MG);</span></a>
<a name="2720"><span class="lineNum"> 2720 </span> : : //displayAdjMat(MG);</a>
<a name="2721"><span class="lineNum"> 2721 </span> : : //printf(&quot;\n&quot;);</a>
<a name="2722"><span class="lineNum"> 2722 </span> : : </a>
<a name="2723"><span class="lineNum"> 2723 </span> :<span class="lineCov"> 1 : Floyd(MG);</span></a>
<a name="2724"><span class="lineNum"> 2724 </span> : : //printf(&quot;\n&quot;);</a>
<a name="2725"><span class="lineNum"> 2725 </span> : : </a>
<a name="2726"><span class="lineNum"> 2726 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="2727"><span class="lineNum"> 2727 </span> : : }</a>
<a name="2728"><span class="lineNum"> 2728 </span> : : </a>
<a name="2729"><span class="lineNum"> 2729 </span> : : }</a>
<a name="2730"><span class="lineNum"> 2730 </span> : : </a>
<a name="2731"><span class="lineNum"> 2731 </span> : : namespace Queue{</a>
<a name="2732"><span class="lineNum"> 2732 </span> : : int data[ 8 ][ 8 ]; //chess(double dimensional array)</a>
<a name="2733"><span class="lineNum"> 2733 </span> : : int a[ 8 ]; //column(列)</a>
<a name="2734"><span class="lineNum"> 2734 </span> : : int b[ 15 ]; //主对角线(左上至右下)</a>
<a name="2735"><span class="lineNum"> 2735 </span> : : int c[ 15 ]; //从对角线(右上至左下)</a>
<a name="2736"><span class="lineNum"> 2736 </span> : : int cnt = 0;</a>
<a name="2737"><span class="lineNum"> 2737 </span> : : void eightQueens( int );</a>
<a name="2738"><span class="lineNum"> 2738 </span> : : void output( const int [][ 8 ], int );</a>
<a name="2739"><span class="lineNum"> 2739 </span> :<span class="lineCov"> 1 : int EightQueen1()</span></a>
<a name="2740"><span class="lineNum"> 2740 </span> : : {</a>
<a name="2741"><span class="lineNum"> 2741 </span> : : </a>
<a name="2742"><span class="lineNum"> 2742 </span> : : int i, j;</a>
<a name="2743"><span class="lineNum"> 2743 </span> : : </a>
<a name="2744"><span class="lineNum"> 2744 </span> [<span class="branchCov" title="Branch 0 was taken 15 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 16 : for( i = 0; i &lt; 15; ++i ) //主、从对角线</span></a>
<a name="2745"><span class="lineNum"> 2745 </span> :<span class="lineCov"> 15 : b[ i ] = c[ i ] = 0; //表示安全</span></a>
<a name="2746"><span class="lineNum"> 2746 </span> : : </a>
<a name="2747"><span class="lineNum"> 2747 </span> [<span class="branchCov" title="Branch 0 was taken 8 times"> + </span><span class="branchCov" title="Branch 1 was taken 1 time"> + </span>]:<span class="lineCov"> 9 : for( i = 0; i &lt; 8; ++i )//chess</span></a>
<a name="2748"><span class="lineNum"> 2748 </span> : : {</a>
<a name="2749"><span class="lineNum"> 2749 </span> :<span class="lineCov"> 8 : a[ i ] = 0; //i列安全</span></a>
<a name="2750"><span class="lineNum"> 2750 </span> [<span class="branchCov" title="Branch 0 was taken 64 times"> + </span><span class="branchCov" title="Branch 1 was taken 8 times"> + </span>]:<span class="lineCov"> 72 : for( j = 0; j &lt; 8; ++j )</span></a>
<a name="2751"><span class="lineNum"> 2751 </span> :<span class="lineCov"> 64 : data[ i ][ j ] = 0;</span></a>
<a name="2752"><span class="lineNum"> 2752 </span> : : }</a>
<a name="2753"><span class="lineNum"> 2753 </span> : : </a>
<a name="2754"><span class="lineNum"> 2754 </span> :<span class="lineCov"> 1 : eightQueens( 0 );</span></a>
<a name="2755"><span class="lineNum"> 2755 </span> : : </a>
<a name="2756"><span class="lineNum"> 2756 </span> :<span class="lineCov"> 1 : cout &lt;&lt; &quot;/ncount = &quot; &lt;&lt; cnt &lt;&lt; endl;</span></a>
<a name="2757"><span class="lineNum"> 2757 </span> :<span class="lineCov"> 1 : return 0;</span></a>
<a name="2758"><span class="lineNum"> 2758 </span> : : }</a>
<a name="2759"><span class="lineNum"> 2759 </span> : : </a>
<a name="2760"><span class="lineNum"> 2760 </span> :<span class="lineCov"> 2057 : void eightQueens( int line )</span></a>
<a name="2761"><span class="lineNum"> 2761 </span> : : {</a>
<a name="2762"><span class="lineNum"> 2762 </span> [<span class="branchCov" title="Branch 0 was taken 92 times"> + </span><span class="branchCov" title="Branch 1 was taken 1965 times"> + </span>]:<span class="lineCov"> 2057 : if( 8 == line )//八个皇后安置就位,输出</span></a>
<a name="2763"><span class="lineNum"> 2763 </span> : : {</a>
<a name="2764"><span class="lineNum"> 2764 </span> :<span class="lineCov"> 92 : output( data, 8 );</span></a>
<a name="2765"><span class="lineNum"> 2765 </span> :<span class="lineCov"> 92 : cout &lt;&lt; endl;</span></a>
<a name="2766"><span class="lineNum"> 2766 </span> :<span class="lineCov"> 92 : return;</span></a>
<a name="2767"><span class="lineNum"> 2767 </span> : : }</a>
<a name="2768"><span class="lineNum"> 2768 </span> : : </a>
<a name="2769"><span class="lineNum"> 2769 </span> : : </a>
<a name="2770"><span class="lineNum"> 2770 </span> [<span class="branchCov" title="Branch 0 was taken 15720 times"> + </span><span class="branchCov" title="Branch 1 was taken 1965 times"> + </span>]:<span class="lineCov"> 17685 : for( int column = 0; column &lt; 8; ++column )</span></a>
<a name="2771"><span class="lineNum"> 2771 </span> : : {</a>
<a name="2772"><span class="lineNum"> 2772 </span> [<span class="branchCov" title="Branch 0 was taken 5508 times"> + </span><span class="branchCov" title="Branch 1 was taken 10212 times"> + </span><span class="branchCov" title="Branch 2 was taken 3420 times"> + </span><span class="branchCov" title="Branch 3 was taken 2088 times"> + </span> :<span class="lineCov"> 15720 : if( 0 == a[ column ] &amp;&amp; 0 == b[ line - column + 7 ] &amp;&amp; 0 == c[ line + column ] )</span></a>
<span class="lineNum"> </span> <span class="branchCov" title="Branch 4 was taken 2056 times"> + </span><span class="branchCov" title="Branch 5 was taken 1364 times"> + </span>]
<a name="2773"><span class="lineNum"> 2773 </span> : : {</a>
<a name="2774"><span class="lineNum"> 2774 </span> :<span class="lineCov"> 2056 : data[ line ][ column ] = 1; //安置皇后</span></a>
<a name="2775"><span class="lineNum"> 2775 </span> :<span class="lineCov"> 2056 : a[ column ] = 1; //此列被占</span></a>
<a name="2776"><span class="lineNum"> 2776 </span> :<span class="lineCov"> 2056 : b[ line - column + 7 ] = 1; //主对角线被占</span></a>
<a name="2777"><span class="lineNum"> 2777 </span> :<span class="lineCov"> 2056 : c[ line + column ] = 1; //从对角线被占</span></a>
<a name="2778"><span class="lineNum"> 2778 </span> :<span class="lineCov"> 2056 : eightQueens( line + 1 ); //下一个皇后</span></a>
<a name="2779"><span class="lineNum"> 2779 </span> : : //重置</a>
<a name="2780"><span class="lineNum"> 2780 </span> :<span class="lineCov"> 2056 : data[ line ][ column ] = 0;</span></a>
<a name="2781"><span class="lineNum"> 2781 </span> :<span class="lineCov"> 2056 : a[ column ] = 0;</span></a>
<a name="2782"><span class="lineNum"> 2782 </span> :<span class="lineCov"> 2056 : b[ line - column + 7 ] = 0;</span></a>
<a name="2783"><span class="lineNum"> 2783 </span> :<span class="lineCov"> 2056 : c[ line + column ] = 0;</span></a>
<a name="2784"><span class="lineNum"> 2784 </span> : : }</a>
<a name="2785"><span class="lineNum"> 2785 </span> : : }</a>
<a name="2786"><span class="lineNum"> 2786 </span> : : }</a>
<a name="2787"><span class="lineNum"> 2787 </span> : : </a>
<a name="2788"><span class="lineNum"> 2788 </span> : : //output chess</a>
<a name="2789"><span class="lineNum"> 2789 </span> :<span class="lineCov"> 92 : void output( const int data[][ 8 ], int size )</span></a>
<a name="2790"><span class="lineNum"> 2790 </span> : : {</a>
<a name="2791"><span class="lineNum"> 2791 </span> [<span class="branchCov" title="Branch 0 was taken 736 times"> + </span><span class="branchCov" title="Branch 1 was taken 92 times"> + </span>]:<span class="lineCov"> 828 : for( int i = 0; i &lt; size; ++i )</span></a>
<a name="2792"><span class="lineNum"> 2792 </span> : : {</a>
<a name="2793"><span class="lineNum"> 2793 </span> [<span class="branchCov" title="Branch 0 was taken 5888 times"> + </span><span class="branchCov" title="Branch 1 was taken 736 times"> + </span>]:<span class="lineCov"> 6624 : for( int j = 0; j &lt; size; ++j )</span></a>
<a name="2794"><span class="lineNum"> 2794 </span> :<span class="lineCov"> 5888 : cout &lt;&lt; data[ i ][ j ] &lt;&lt; ' ';</span></a>
<a name="2795"><span class="lineNum"> 2795 </span> :<span class="lineCov"> 736 : cout &lt;&lt; endl;</span></a>
<a name="2796"><span class="lineNum"> 2796 </span> : : }</a>
<a name="2797"><span class="lineNum"> 2797 </span> :<span class="lineCov"> 92 : ++cnt;</span></a>
<a name="2798"><span class="lineNum"> 2798 </span> :<span class="lineCov"> 92 : }</span></a>
<a name="2799"><span class="lineNum"> 2799 </span> : : }</a>
</pre>
</td>
</tr>
</table>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>