-
Notifications
You must be signed in to change notification settings - Fork 0
/
saori.cc
136 lines (131 loc) · 4.02 KB
/
saori.cc
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
133
134
135
136
#include "saori.h"
#include <iostream>
#include <optional>
#include <sstream>
#include "request.h"
#include "response.h"
#include "estimate.h"
bool __load(std::string path) {
return true;
}
bool __unload() {
return true;
}
std::string __request(std::string request) {
Base::Request req = Base::Request::parse(request);
if (req.getCommand() == "GET Version") {
Base::Response res{204, "No Content", "SAORI/1.0"};
return res;
}
if ( ! req["Argument0"]) {
Base::Response res{400, "Bad Request", "SAORI/1.0"};
return res;
}
std::string command = req["Argument0"].value();
if (command == "hand") {
std::vector<card_t> list;
for (int i = 1; ; i++) {
std::ostringstream oss;
oss << "Argument" << i;
if (req[oss.str()]) {
list.push_back(str2card(req[oss.str()].value()));
}
else {
break;
}
}
for (int i = list.size(); i < 5; i++) {
list.push_back({'N', 0});
}
auto ret = evaluate(list);
Base::Response res{200, "OK", "SAORI/1.0"};
res.set("Result", static_cast<int>(ret.main));
for (int i = 0; i < ret.sub.size(); i++) {
std::ostringstream oss;
oss << "Value" << i;
res.set(oss.str(), ret.sub[i]);
}
return res;
}
else if (command == "estimate") {
if ( ! req["Argument1"]) {
Base::Response res{400, "Bad Request", "SAORI/1.0"};
return res;
}
int num_of_community;
std::vector<card_t> community;
int num_of_player;
std::vector<player_t> list;
{
std::istringstream iss(req["Argument1"].value());
iss >> num_of_community;
}
int index = 2;
for (; index - 2 < num_of_community; index++) {
std::ostringstream oss;
oss << "Argument" << index;
if (req[oss.str()]) {
community.push_back(str2card(req[oss.str()].value()));
}
else {
std::cout << "invalid community number" << std::endl;
goto invalid;
}
}
{
std::ostringstream oss;
oss << "Argument" << index;
if (req[oss.str()]) {
std::istringstream iss(req[oss.str()].value());
iss >> num_of_player;
if (num_of_player > 10) {
goto invalid;
std::cout << "invalid num_of_player" << std::endl;
}
}
else {
goto invalid;
}
index++;
}
for (int i = index; i - index < num_of_player * 2; i+=2) {
std::string tmp;
{
std::ostringstream oss;
oss << "Argument" << i;
if (req[oss.str()]) {
tmp = req[oss.str()].value();
}
else {
break;
}
}
{
std::ostringstream oss;
oss << "Argument" << (i + 1);
if (req[oss.str()]) {
player_t player;
player.cards[0] = str2card(tmp);
player.cards[1] = str2card(req[oss.str()].value());
list.push_back(player);
}
else {
player_t player;
player.cards[0] = str2card(tmp);
// 2枚目はNull相当の値を入れる。
player.cards[1] = str2card("N0");
list.push_back(player);
break;
}
}
}
auto rate = estimate(community, num_of_player, list);
Base::Response res{200, "OK", "SAORI/1.0"};
res.set("Result", rate);
return res;
}
invalid:
Base::Response res{200, "OK", "SAORI/1.0"};
res.set("Result", -1);
return res;
}