70 lines
1.6 KiB
C++
70 lines
1.6 KiB
C++
|
/* -*- Mode: C -*- */
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdbool.h>
|
||
|
#include <unistd.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#include <mcp.h>
|
||
|
|
||
|
static int
|
||
|
send_move(int row, int col)
|
||
|
{
|
||
|
FILE *f = fdopen(dup(CHILD_OUT_FD), "w");
|
||
|
fprintf(f, "%u,%u", row, col);
|
||
|
fclose(f);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
read_move_from_user(int *row, int *col)
|
||
|
{
|
||
|
char input[128];
|
||
|
|
||
|
do {
|
||
|
printf("Zug (<Zeile>,<Spalte>): "); fflush(stdout);
|
||
|
if (fgets(input, sizeof(input), stdin) == NULL) abort();
|
||
|
} while((sscanf(input, "%u,%u", row, col) != 2) ||
|
||
|
(*row > 8) || (*col > 8));
|
||
|
}
|
||
|
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
int done = 0;
|
||
|
int turn_row, turn_col;
|
||
|
|
||
|
while (!done) {
|
||
|
/* BEGIN PLAYER-SPECIFIC CODE */
|
||
|
|
||
|
// 1. Read state
|
||
|
char state_buffer[128];
|
||
|
ssize_t bytes = read(CHILD_IN_FD, state_buffer, sizeof(state_buffer));
|
||
|
if (bytes != 65) // invalid number of chars
|
||
|
abort();
|
||
|
|
||
|
// state_buffer enthält jetzt 65 Zeichen ('.' oder 'X' oder 'O'):
|
||
|
// * Das ERSTE Zeichen gibt an, welcher Spieler an der Reihe ist.
|
||
|
// * Die weiteren 64 Zeichen definieren die Belegung des Feldes.
|
||
|
// * Die Belegung wird reihenweise gegeben, d.h. die Zeichen
|
||
|
// 1 bis 8 definieren die erste Zeile des Feldes, Zeichen 9 bis 17
|
||
|
// geben die zweite Zeile usw.
|
||
|
// * X und O stehen hierbei für die jeweiligen Spieler. Leere Felder
|
||
|
// sind durch einen Punkt (.) gekennzeichnet.
|
||
|
|
||
|
// 2. Input move
|
||
|
read_move_from_user(&turn_row, &turn_col);
|
||
|
|
||
|
// 3. Return result
|
||
|
send_move(turn_row, turn_col);
|
||
|
|
||
|
/* END PLAYER-SPECIFIC CODE */
|
||
|
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/* EOF */
|