From a9399ddf06f4790f8e59a992930281fa590386e2 Mon Sep 17 00:00:00 2001 From: Trolli Schmittlauch Date: Wed, 11 Mar 2015 15:52:48 +0100 Subject: [PATCH] find vertical and horizontal moves, forwards and backwards --- players/playerlib.cc | 89 +++++++++++++++++++++++++ players/playerlib.h | 12 ++-- players/random-player.cc | 138 +++++++++++++++------------------------ 3 files changed, 149 insertions(+), 90 deletions(-) diff --git a/players/playerlib.cc b/players/playerlib.cc index a7bea5b..9872da2 100644 --- a/players/playerlib.cc +++ b/players/playerlib.cc @@ -3,6 +3,9 @@ #include "playerlib.h" +//determines whether move or not and adds them to a movesList +int fillMovesList(cell (*)[fieldWidth], movesList *, size_t, size_t, unsigned int *, unsigned int *); + char enemyc = 0, ownc = 0; char @@ -31,3 +34,89 @@ readStateBuffer(char *stateBuffer, struct cell (*gameField)[fieldWidth]) { } return 0; } + +int +fillMovesList(cell (*field)[fieldWidth], movesList *moves, size_t row, size_t col, unsigned int *ownCount, unsigned int *enemyCount) { + ++(field[row][col].timesVisited); + if (field[row][col].content == ownc) + { + ++(*ownCount); + *enemyCount = 0; + printf("%d,%d: ownCount: %d, enemyCount: %d\n", row, col, *ownCount, *enemyCount); + } + if(field[row][col].content == enemyc && ownCount) + { + ++(*enemyCount); + printf("%d,%d: ownCount: %d, enemyCount: %d\n", row, col, *ownCount, *enemyCount); + } + if(field[row][col].content == '.') + { + if (*ownCount && *enemyCount > 0) + { + printf("BAM!\n"); + moves->list[moves->movesNumber].turnRow = row+1; + moves->list[moves->movesNumber].turnCol = col+1; + ++(moves->movesNumber); + } + *ownCount = 0; + *enemyCount = 0; + printf("%d,%d: ownCount: %d, enemyCount: %d\n", row, col, *ownCount, *enemyCount); + } + return 0; +} + +int +findHorizontalForwardMoves(cell (*field)[fieldWidth], movesList *moves) { + //Anzahl eigener/gegnerischer Steine + unsigned int ownCount = 0, enemyCount = 0; + for (size_t row = 0;row < fieldHeight; ++row) + { + for (size_t col = 0;col < fieldWidth; ++col) + { + fillMovesList(field, moves, row, col, &ownCount, &enemyCount); + } + } + return 0; +} + +int +findHorizontalBackwardMoves(cell (*field)[fieldWidth], movesList *moves) { + //Anzahl eigener/gegnerischer Steine + unsigned int ownCount = 0, enemyCount = 0; + for (int row = 7; row >= 0; --row) + { + for (int col = 7; col >= 0; --col) + { + fillMovesList(field, moves, row, col, &ownCount, &enemyCount); + } + } + return 0; +} + +int +findVerticalForwardMoves(cell (*field)[fieldWidth], movesList *moves) { + //Anzahl eigener/gegnerischer Steine + unsigned int ownCount = 0, enemyCount = 0; + for (size_t col = 0;col < fieldHeight; ++col) + { + for (size_t row = 0;row < fieldWidth; ++row) + { + fillMovesList(field, moves, row, col, &ownCount, &enemyCount); + } + } + return 0; +} + +int +findVerticalBackwardMoves(cell (*field)[fieldWidth], movesList *moves) { + //Anzahl eigener/gegnerischer Steine + unsigned int ownCount = 0, enemyCount = 0; + for (int col = 7; col >= 0; --col) + { + for (int row = 7; row >= 0; --row) + { + fillMovesList(field, moves, row, col, &ownCount, &enemyCount); + } + } + return 0; +} diff --git a/players/playerlib.h b/players/playerlib.h index f17ca35..c455eb1 100644 --- a/players/playerlib.h +++ b/players/playerlib.h @@ -18,15 +18,15 @@ struct movesList { move *list = new move[fieldWidth*fieldHeight-4](); }; -enum iterDirection -{ - forwards, backwards -}; - - //returns the character used for the enemy's stones extern char getEnemyChar(char); //reads the stateBuffer string into a 2d matrix extern int readStateBuffer(char*, cell (*)[fieldWidth]); +//adds all hotizontally-forward found moves to movesList +int findHorizontalForwardMoves(cell (*)[fieldWidth], movesList *); +int findHorizontalBackwardMoves(cell (*)[fieldWidth], movesList *); +int findVerticalForwardMoves(cell (*)[fieldWidth], movesList *); +int findVerticalBackwardMoves(cell (*)[fieldWidth], movesList *); + #endif diff --git a/players/random-player.cc b/players/random-player.cc index c479f19..8489699 100644 --- a/players/random-player.cc +++ b/players/random-player.cc @@ -19,100 +19,70 @@ send_move(int row, int col) return 0; } -int -findVerticalMoves(cell (*field)[fieldWidth], movesList *moves, iterDirection direction) { - //Anzahl eigener/gegnerischer Steine - unsigned int ownCount = 0, enemyCount = 0; - if (direction == forwards) - { - for (size_t row = 0;row < fieldHeight; ++row) - { - for (size_t col = 0;col < fieldWidth; ++col) - { - //TODO: diesen Teil auslagern - ++(field[row][col].timesVisited); - if (field[row][col].content == ownc) - ++ownCount; - if(field[row][col].content == enemyc && ownCount) - ++enemyCount; - if(field[row][col].content == '.') - { - if (ownCount && enemyCount > 0) - { - moves->list[moves->movesNumber].turnRow = row+1; - moves->list[moves->movesNumber].turnCol = col+1; - ++(moves->movesNumber); - } - ownCount = 0; - enemyCount = 0; - } - } - } - } - return 0; -} int main(void) { - int done = 0; + int done = 0; - while (!done) { - int turn_row = 0; - int turn_col = 0; - /* BEGIN PLAYER-SPECIFIC CODE */ + 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(); + // 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. + // 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); + + for (unsigned int i=0; imovesNumber; ++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; imovesNumber; ++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