71 lines
1.6 KiB
C++
71 lines
1.6 KiB
C++
#include <cstdio>
|
|
#include <format>
|
|
#include <string>
|
|
#include <cstdlib>
|
|
#include <sstream>
|
|
#include <cstring>
|
|
#include <unistd.h>
|
|
#include <sys/socket.h>
|
|
#include <arpa/inet.h>
|
|
#include "Strategy.h"
|
|
using namespace std;
|
|
|
|
int main(int argc, char **argv) {
|
|
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
|
if (sockfd == -1) {
|
|
perror("socket()");
|
|
return -1;
|
|
}
|
|
|
|
sockaddr_in addr;
|
|
memset(&addr, 0, sizeof(addr));
|
|
addr.sin_family = AF_INET;
|
|
addr.sin_port = htons(3030);
|
|
addr.sin_addr.s_addr = inet_addr(argc >= 2 ? argv[1] : "127.0.0.1");
|
|
|
|
if (connect(sockfd, (sockaddr*)&addr, sizeof(addr)) == -1) {
|
|
perror("connect()");
|
|
return -1;
|
|
}
|
|
|
|
fprintf(stderr, "Connected to server.\n");
|
|
FILE *fserverr = fdopen(sockfd, "r");
|
|
FILE *fserverw = fdopen(dup(sockfd), "w");
|
|
static char buf[128];
|
|
while (true) {
|
|
if (fscanf(fserverr, "%s", buf) == -1)
|
|
break;
|
|
string method(buf);
|
|
|
|
if (method == "init") {
|
|
int n;
|
|
fscanf(fserverr, "%d", &n);
|
|
vector<vector<int>> B(n, vector<int>(n));
|
|
for (int i = 0; i < n; ++i) {
|
|
for (int j = 0; j < n; ++j)
|
|
fscanf(fserverr, "%d", &B[i][j]);
|
|
}
|
|
initStrategy(n, B);
|
|
fprintf(stderr, "init() called\n");
|
|
} else if (method == "getMove") {
|
|
int lstX, lstY;
|
|
fscanf(fserverr, "%d %d", &lstX, &lstY);
|
|
fprintf(stderr, "getMove(%d, %d) called\n", lstX, lstY);
|
|
auto [x, y] = getMove(lstX, lstY);
|
|
if (fprintf(fserverw, "%d %d\n", x, y) == -1) {
|
|
perror("send(getMove)");
|
|
return -1;
|
|
}
|
|
fflush(fserverw);
|
|
fprintf(stderr, "getMove(%d, %d): (%d, %d)\n", lstX, lstY, x, y);
|
|
} else {
|
|
fprintf(stderr, "Unknown method: %s\n", method.c_str());
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
close(sockfd);
|
|
return 0;
|
|
}
|
|
|