PraktikumOthello/players/random-player.cc

101 lines
2.4 KiB
C++

/* -*- Mode: C -*- */
#define debugprint
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <mcp.h>
#include "playerlib.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;
}
int main(void)
{
int done = 0;
while (!done) {
int turn_row = 0;
int turn_col = 0;
/* 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. TODO: Strategie hier einfügen. Resultat in turn_row und turn_col speichern.
if(!enemyc)
{
ownc = state_buffer[0];
enemyc = getEnemyChar(ownc);
}
//pure C:
//struct cell (*field)[fieldWidth] = malloc(fieldHeight*fieldWidth*sizeof(struct cell));
//C++ version:
auto field = new cell[fieldHeight][fieldWidth]();
readStateBuffer(state_buffer, field); //stateBuffer ist Pointer auf char, field ist Pointer auf struct cell[]
movesList *moves = new movesList();
findHorizontalForwardMoves(field, moves);
findHorizontalBackwardMoves(field, moves);
findVerticalForwardMoves(field, moves);
findVerticalBackwardMoves(field, moves);
findDiagonalBottomRightMoves(field, moves);
findDiagonalTopLeftMoves(field, moves);
#ifdef debugprint
printf("BottomLeft\n");
#endif
findDiagonalBottomLeftMoves(field, moves);
#ifdef debugprint
printf("TopRight\n");
#endif
findDiagonalTopRightMoves(field, moves);
printf("\nZüge:\n");
for (unsigned int i=0; i<moves->movesNumber; ++i)
{
printf("%d,%d\n",moves->list[i].turnRow,moves->list[i].turnCol);
}
// 3. Return result
//send_move(turn_row, turn_col);
//for(int i=0; i<fieldHeight; ++i)
// delete [] field[i];
delete [] field;
delete [] moves;
/* END PLAYER-SPECIFIC CODE */
}
return 0;
}
/* EOF */