From b1b340e6d2fe2271c61d8adb0391185cf405e05b Mon Sep 17 00:00:00 2001 From: Rebecca Schofield Date: Thu, 29 Oct 2015 08:58:32 -0500 Subject: [PATCH] minmax structure done --- Board.cpp | 26 ++++++++++++++------------ Board.h | 11 ++++++++--- Engine.cpp | 37 ++++++++++++++----------------------- Engine.h | 5 +++-- MNode.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ MNode.h | 30 ++++++++++++++++++++++++++++++ makefile | 12 ++++++------ 7 files changed, 118 insertions(+), 46 deletions(-) create mode 100755 MNode.cpp create mode 100755 MNode.h diff --git a/Board.cpp b/Board.cpp index c3b5902..6750ab2 100644 --- a/Board.cpp +++ b/Board.cpp @@ -250,7 +250,7 @@ void Board::move(string inputMove){ move(m); } -void Board::move(moves m){ +Board Board::move(moves m){ int row = 8 - (m.row); int column = m.column; @@ -258,7 +258,7 @@ void Board::move(moves m){ if (row > 8 || row < 0 || column > 8 || column < 0) { cout<<"ERROR: index out of bound."<getX() << piece->getY() << "\n\n"; if (piece->getType() != turn) { @@ -277,9 +277,9 @@ void Board::move(moves m){ else { if(isThisMovePossible(row, column, m.moveType)) - { + { if (m.moveType == "FWD") { - piece->moveFwd(); + piece->moveFwd(); } else if (m.moveType == "LEFT") { @@ -334,6 +334,8 @@ void Board::move(moves m){ setValidFalse(); } } + + return *this; } bool Board::isThisMovePossible(int r, int c, string moveType){ @@ -355,16 +357,16 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ if (piece->getType() == 'O') reflector = -1; - if (moveType == "FWD"){ + if (moveType == "FWD"){ if (!isPiece(r + reflector, c)) - return true; + return true; else return false; } else if (moveType == "RIGHT"){ temp = getPiece(r + reflector, c+1); - if(c < 7) { + if(c < 7) { if (!isPiece(r+reflector, c+1) && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7)) { //cout << "What.\n\n"; return true; @@ -379,14 +381,14 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ return false; } } - else { + else { return false; } } else if (moveType == "LEFT"){ temp = getPiece(r + reflector, c-1); - if(c > 0) { + if(c > 0) { if (!isPiece(r+reflector, c-1) && (r+reflector >= 0) && (r+reflector <= 7)) { //cout << "What.\n\n"; return true; @@ -401,7 +403,7 @@ bool Board::isThisMovePossible(int r, int c, string moveType){ return false; } } - else { + else { return false; } } @@ -549,4 +551,4 @@ int Board::evaluate(char max, char min){ return 0; } } - + diff --git a/Board.h b/Board.h index 21c5d4a..7af5bcf 100644 --- a/Board.h +++ b/Board.h @@ -10,6 +10,12 @@ struct moves { int row; int column; string moveType; + + moves() { + row = -1; + column = -1; + moveType = ""; + } moves(int linea, int columna, string m) { row = linea; @@ -47,8 +53,7 @@ public: int charToIntColumn(char input); char intToCharColumn(int input); void move(string inputMove); - void move(moves jugada); - void moveWOPrint(moves jugada); + Board move(moves m); bool isThisMovePossible(int r, int c, string moveType); vector viewPossibleMoves(); string myToUpper(string input); @@ -56,4 +61,4 @@ public: void interpret(string input, Board& tablero); void snapshot(vector& inputVec, Board inputBoard); int evaluate(char max, char min); -}; +}; diff --git a/Engine.cpp b/Engine.cpp index 3ba0753..17079f0 100644 --- a/Engine.cpp +++ b/Engine.cpp @@ -43,7 +43,8 @@ void Engine::startGame(){ } while(b->getTurn() == 'X' ){ - AI(); + easyAI(); + //AI(3); } gameOver = b->isGameOver(); @@ -64,10 +65,9 @@ void Engine::easyAI(){ } void Engine::AI(int depth){ - vector listOfMoves = b->viewPossibleMoves(); Board* temp = new Board(*b); - - //create node with current board state + moves empty; + MNode* root = new MNode(*temp, empty, 0); //only doing 1 branch right now because testing /*for (int i = 0; i < listOfMoves.size(); ++i){ @@ -75,33 +75,23 @@ void Engine::AI(int depth){ }*/ //remove this soon - b->move(minMax(temp, listOfMoves[0], 0, 0)); - - b->changeTurns(); - - //verification of correct turn - /* - if (b->getTurn() != 'O'){ - cout << "ERROR in Engine::AI: b is on the wrong turn. \n"; - } - */ + //b->move(minMax(temp, listOfMoves[0], 0, 0)); + b->changeTurns(); b->displayBoard(); } -moves Engine::minMax(Board* temp, moves m, int c, int r){ - //testing purposes only, c = finite depth - //cout << "c: " << c << "\n\n"; - //cout << "current turn: " << temp->getTurn() << "\n"; - vector listOfMoves = temp->viewPossibleMoves(); - - if (temp->isGameOver() == true){ +moves Engine::minMax(MNode* node, int depth){ + Board current = node->getState(); + vector listOfMoves = current.viewPossibleMoves(); + /* + if (current.isGameOver() == true){ cout << "END OF PATH REACHED\n\n"; return m; } else { - if(temp->getPiece(8 - m.row, m.column)->getType() == temp->getTurn() && temp->isThisMovePossible(8 - m.row, m.column, m.moveType)){ + if(current.getPiece(8 - m.row, m.column)->getType() == current.getTurn() && current.isThisMovePossible(8 - m.row, m.column, m.moveType)){ temp->move(m); temp->evaluate('X', 'O'); temp->changeTurns(); @@ -114,4 +104,5 @@ moves Engine::minMax(Board* temp, moves m, int c, int r){ minMax(temp, listOfMoves[0], 0, 0); return m; } -} + */ +} diff --git a/Engine.h b/Engine.h index d552741..89f3327 100644 --- a/Engine.h +++ b/Engine.h @@ -1,6 +1,7 @@ #pragma once #include "Board.h" +#include "MNode.h" using namespace std; @@ -13,5 +14,5 @@ public: void startGame(); void easyAI(); void AI(int depth); - moves minMax(Board* temp, moves m, int c, int r); -}; + moves minMax(MNode* node, int depth); +}; diff --git a/MNode.cpp b/MNode.cpp new file mode 100755 index 0000000..8f4c410 --- /dev/null +++ b/MNode.cpp @@ -0,0 +1,43 @@ +#include +#include +#include "MNode.h" + +using namespace std; + +MNode::MNode(){ + children.clear(); + minimax_val = -1; +} + +MNode::MNode(Board s, moves m, int mmval){ + state = s; + mvs = m; + minimax_val = mmval; +} + +MNode::MNode(const MNode& n){ + children = n.getChildren(); + minimax_val = n.getMMVal(); +} + +void MNode::setMMVal(int mmval) { + minimax_val = mmval; +} + +bool MNode::hasChildren(){ + if (children.size() != 0) + return true; + else + return false; +} + +void printTree(int depth, const MNode& n){ + vector children; + cout << "depth " << depth << " :" << n.getMMVal() << " "; + children = n.getChildren(); + + //print out root + for (int i = 0; i < children.size(); ++i){ + printTree(++depth, *children[i]); + } +} \ No newline at end of file diff --git a/MNode.h b/MNode.h new file mode 100755 index 0000000..1afe963 --- /dev/null +++ b/MNode.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include "Board.h" + +using namespace std; + +class MNode { + vector children; + Board state; + moves mvs; + int minimax_val; + +public: + MNode(); + MNode(Board s, moves m, int mmval); + MNode(const MNode& n); + vector getChildren() const { return children; } + void addChild(MNode* n) { children.push_back(n); } + int getMMVal() const { return minimax_val; } + void setMMVal(int mmval); + Board getState() { return state; } + void setState(Board s) { state = s; } + moves getMove() { return mvs; } + void setMove(moves m) { mvs = m; } + bool hasChildren(); +}; + +void printTree(int depth, const MNode& n); \ No newline at end of file diff --git a/makefile b/makefile index e779fde..de4028a 100755 --- a/makefile +++ b/makefile @@ -3,13 +3,13 @@ all: test server server: Server.o - g++ -std=c++11 -o server Server.o Engine.o Piece.o Board.o + g++ -std=c++11 -o server Server.o Engine.o Piece.o Board.o MNode.o -Server.o: Server.cpp Engine.cpp Board.cpp Piece.cpp - g++ -std=c++11 -c -g Server.cpp Engine.cpp Board.cpp Piece.cpp +Server.o: Server.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp + g++ -std=c++11 -c -g Server.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp test: test.o - g++ -std=c++11 -o test test.o Engine.o Piece.o Board.o + g++ -std=c++11 -o test test.o Engine.o Piece.o Board.o MNode.o -test.o: test.cpp Engine.cpp Board.cpp Piece.cpp - g++ -std=c++11 -c -g test.cpp Engine.cpp Board.cpp Piece.cpp \ No newline at end of file +test.o: test.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp + g++ -std=c++11 -c -g test.cpp Engine.cpp Board.cpp Piece.cpp MNode.cpp \ No newline at end of file