このコミットが含まれているのは:
woosh 2023-11-16 01:24:39 +00:00
コミット 2ccce9c493
1個のファイルの変更19行の追加56行の削除

75
uttt.c
ファイルの表示

@ -288,15 +288,6 @@ void ut_sockdraw(const struct ut_state *state, int fd)
}
}
/*void ut_show_boards(const struct ut_state *state) {
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 3; i++) {
putchar(state->boards[j][i] ? state->boards[j][i] : ' ');
}
putchar('\n');
}
}*/
int ut_readfill(int fd, char *x, size_t l)
{
while(l > 0)
@ -411,36 +402,6 @@ int ut_cursgetpos(const struct ut_state *state, int *r, int *c)
#undef P
}
/*bool getpos(const struct ut_state *state, int *x, int *y) {
while (true) {
printf("Place token %c at position x,y: ", state->player);
char line[5] = {0};
if (fgets(line, 5, stdin) == NULL)
return false;
// line was too short
if (line[3] == '\0')
continue;
// line was too long
if (line[3] != '\n') {
// consume rest of line
while (true) {
int garbage = getchar();
if (garbage == EOF)
return false;
if (garbage == '\n')
break;
}
continue;
}
int sscanf_result = sscanf(line, "%d,%d", x, y);
if (sscanf_result == EOF)
return false;
if (sscanf_result != 2)
continue;
break;
}
return true;
}*/
int ut_ignore_line(int sock) {
char byte;
@ -453,7 +414,7 @@ int ut_ignore_line(int sock) {
return 2;
}
int ut_sockgetpos(const struct ut_state *state, int sock, int *y, int *x, bool readable) { // TODO
int ut_sockgetpos(const struct ut_state *state, int sock, int *y, int *x, bool readable) {
int index = 0;
char byte;
while (true) {
@ -509,7 +470,7 @@ int ut_local_game(struct ut_state *state) {
return 0;
}
int ut_network_game(struct ut_state *state, int sock, char player, bool readable) { // TODO
int ut_network_game(struct ut_state *state, int sock, char player, bool readable) {
while (true) {
int r = 4, c = 4;
ut_curserase();
@ -571,7 +532,7 @@ char ut_random_player(void) {
int ut_host_game(struct ut_state *state) {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
printf("error %d\n", errno);
ut_cursprintf("error %d\n", errno);
return 1;
}
const struct sockaddr_in addr = {
@ -581,19 +542,21 @@ int ut_host_game(struct ut_state *state) {
};
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int));
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
printf("error %d\n", errno);
ut_cursprintf("error %d\n", errno);
return 1;
}
if (listen(sock, 128) == -1) {
printf("error %d\n", errno);
ut_cursprintf("error %d\n", errno);
return 1;
}
ut_cursprintf("Waiting for game partner at 127.0.0.1:6669 ...\n");
refresh();
int conn = accept(sock, NULL, NULL);
if (conn == -1) {
printf("error %d\n", errno);
ut_cursprintf("error %d\n", errno);
return 1;
}
close(sock);
// decide X or O
char player;
@ -603,17 +566,17 @@ int ut_host_game(struct ut_state *state) {
char byte;
ut_dprintf(conn, "| Press enter to start.\n");
if (ut_readfill(conn, &byte, 1)) {
printf("Connection closed.\n");
ut_cursprintf("Connection closed.\n");
return 1;
}
bool readable = byte != '\0';
bool readable = (byte != '\0');
if (byte != '\n') {
int err = ut_ignore_line(conn);
if (err == 1) {
printf("Connection closed.\n");
ut_cursprintf("Connection closed.\n");
return 1;
} else if (err == 2) {
printf("Partner sent too much data - exiting\n");
ut_cursprintf("Partner sent too much data - exiting\n");
return 1;
}
}
@ -630,7 +593,7 @@ int ut_host_game(struct ut_state *state) {
int ut_join_game(struct ut_state *state) {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
printf("error %d\n", errno);
ut_cursprintf("error %d\n", errno);
return 1;
}
const struct sockaddr_in addr = {
@ -639,9 +602,10 @@ int ut_join_game(struct ut_state *state) {
.sin_addr = { .s_addr = htonl(0x7f000001) },
};
ut_cursprintf("Connecting to game host at 127.0.0.1:6669 ...\n");
refresh();
if(connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1)
{
printf("error %d\n", errno);
ut_cursprintf("error %d\n", errno);
return 1;
}
@ -649,20 +613,19 @@ int ut_join_game(struct ut_state *state) {
ut_writefill(sock, "\0\n", 2);
// host decides X or O
char player_buf[2];
char *player = player_buf;
char player[2];
for (int i = 0; i < 10; i++) {
int r = ut_readfill(sock, player_buf, 1);
int r = ut_readfill(sock, player, 1);
ut_ignore_line(sock);
if (*player == '|') {
continue;
}
if (r == 2) {printf("Connection closed.\n");}
if (r == 2) {ut_cursprintf("Connection closed.\n");}
if (r != 0) {return 1;}
break;
}
if (*player != 'X' && *player != 'O') {
printf("Host is retarded.\n");
ut_cursprintf("Host is retarded.\n");
return 1;
}