-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstate_update.cpp
More file actions
132 lines (132 loc) · 3.82 KB
/
Copy pathstate_update.cpp
File metadata and controls
132 lines (132 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "all.h"
void state()
{
int location[2]; //建立一个数组,用来储存程序员下一个目标点。第一个数据为x坐标,第二个数据为y坐标
deliver* cur; //创建一个指针记录当前快递员信息
missionptr m; //创建一个指针记录当前任务信息
num_order = num_completed; //让接单数先等于当前完成数,便于一会统计总接单数
for (int i = 0; i < num_deliver_man; i++) //对所有快递员进行遍历
{
cur = &deliver_man[i];
for (int n = 0; n < max_dispose; n++)
{
if (cur->task[n].is_complete == 0)
num_order++;
} //订单正在途中则接单数加一
if (cur->num_mission == 0)
continue; //如果快递员当前没有任务,则对下一个快递员进行操作
else
{
m = &(cur->task[deliver_man[i].mission_queue[deliver_man[i].index_misson]]);
if (m->fetch_time == 0) //如果还未取单
{
location[0] = m->x_start;
location[1] = m->y_start;
} //则目标点为接单处
else
{
location[0] = m->x_terminal;
location[1] = m->y_terminal;
} //否则目标点为送单处
if (abs(location[0] - cur->x_location) <= 1) //判断快递员横坐标是否已到达目标点附近
{
if (abs(location[1] - cur->y_location) <= 1) //判断快递员纵坐标是否已到达目标点附近
{
cur->index_misson++; //若已到达,则进行下一个任务
cur->num_mission--; //当前任务数量减一
if (m->fetch_time == 0)
m->fetch_time = time; //若到达的是取单处,则当前时间即为取单时间
else
{
m->is_complete += 1; //若到达的是送单点,则任务已被完成
if (time - (m->order_time) <= dead_line)
{
money += 10;
num_completed += 1;
} //若送单时间在30以内,则金钱加10,完成数加1
else if (time - (m->order_time) <= total_dead_line)
{
money -= 40;
num_completed += 1;
num_overtime += 1;
} //在30-60之间
else if (time - (m->order_time) > total_dead_line)
{
is_break = 1;
} //超过60则破产
}
m = &(cur->task[deliver_man[i].mission_queue[deliver_man[i].index_misson]]);
if (m->fetch_time == 0) //如果还未取单
{
location[0] = m->x_start;
location[1] = m->y_start;
} //则目标点为接单处
else
{
location[0] = m->x_terminal;
location[1] = m->y_terminal;
} //否则目标点为送单处
while (abs(location[1] - cur->x_location) <= 1)
{
if (abs(location[1] - cur->y_location) <= 1) //判断快递员纵坐标是否已到达目标点附近
{
cur->index_misson++; //若已到达,则进行下一个任务
cur->num_mission--; //当前任务数量减一
if (m->fetch_time == 0)
m->fetch_time = time; //若到达的是取单处,则当前时间即为取单时间
else
{
m->is_complete += 1; //若到达的是送单点,则任务已被完成
if (time - (m->order_time) <= dead_line)
{
money += 10;
num_completed += 1;
} //若送单时间在30以内,则金钱加10,完成数加1
else if (time - (m->order_time) <= total_dead_line)
{
money -= 40;
num_completed += 1;
num_overtime += 1;
} //在30-60之间
else if (time - (m->order_time) > total_dead_line)
{
is_break = 1;
} //超过60则破产
}
m = &(cur->task[deliver_man[i].mission_queue[deliver_man[i].index_misson]]);
if (m->fetch_time == 0) //如果还未取单
{
location[0] = m->x_start;
location[1] = m->y_start;
} //则目标点为接单处
else
{
location[0] = m->x_terminal;
location[1] = m->y_terminal;
} //否则目标点为送单处
}
else
break;
}
}
else
{
if (cur->y_location > location[1])
cur->y_location -= 2;
else
cur->y_location += 2;
} //若纵坐标未到达附近,则向目标点前进
}
else
{
if (cur->x_location > location[0])
cur->x_location -= 2;
else
cur->x_location += 2;
}
}
} //若横坐标未到达附近,则向目标点前进
add_deliver();
if (money < 0)
is_break = 1; //若钱数<0,则破产
}