Merge branch 'beccadev' of https://github.tamu.edu/brj2013/Breakthrough into beccadev
This commit is contained in:
commit
21e4691905
8 changed files with 372 additions and 342 deletions
363
Board.cpp
363
Board.cpp
|
@ -7,32 +7,40 @@ using namespace std;
|
|||
Board::Board() {
|
||||
for (int i = 0; i < 2; ++i) {
|
||||
for (int j = 0; j < 8; ++j) {
|
||||
boardArray[i][j] = 'X';
|
||||
xpieces.push_back(new Piece(i, j, 'X'));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (int i = 2; i < 6; ++i) {
|
||||
for (int i = 6; i < 8; ++i) {
|
||||
for (int j = 0; j < 8; ++j) {
|
||||
boardArray[i][j] = '_';
|
||||
opieces.push_back(new Piece(i, j, 'O'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool Board::elemInXs(int r, int c){
|
||||
for (int i = 0; i < xpieces.size(); ++i){
|
||||
if (xpieces[i]->getX() == r && xpieces[i]->getY() == c){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 6; i <= 7; ++i) {
|
||||
for (int j = 0; j < 8; ++j) {
|
||||
boardArray[i][j] = 'O';
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Board::elemInOs(int r, int c){
|
||||
for (int i = 0; i < opieces.size(); ++i){
|
||||
if (opieces[i]->getX() == r && opieces[i]->getY() == c){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
moves Board::parse(string input)
|
||||
{
|
||||
|
||||
input = myToUpper(input);
|
||||
|
||||
cout<<input<<endl;
|
||||
|
||||
int temp1;
|
||||
char temp2;
|
||||
string temp3;
|
||||
|
@ -63,18 +71,16 @@ moves Board::parse(string input)
|
|||
|
||||
bool Board::isGameOver()
|
||||
{
|
||||
for (int i = 0; i < 8; ++i)
|
||||
{
|
||||
|
||||
if (boardArray[0][i] == 'O')
|
||||
{
|
||||
cout<<"\n\n\nplayer O wins!\n\n\n"<<endl;
|
||||
for (int i = 0; i < xpieces.size(); ++i){
|
||||
if (xpieces[i]->getX() == 0){
|
||||
cout<<"\n\n\nPlayer X wins!\n\n\n"<<endl;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (boardArray[7][i] == 'X')
|
||||
{
|
||||
cout<<"\n\n\nplayer X wins!\n\n\n"<<endl;
|
||||
for (int i = 0; i < opieces.size(); ++i){
|
||||
if (opieces[i]->getX() == 7){
|
||||
cout<<"\n\n\nPlayer O wins!\n\n\n"<<endl;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -89,16 +95,21 @@ void Board::changeTurns()
|
|||
void Board::displayBoard()
|
||||
{
|
||||
cout<<"; A B C D E F G H"<<endl;
|
||||
for (int i = 0; i < 8; ++i)
|
||||
{
|
||||
int mango = 8 - i;
|
||||
cout<<"; "<<mango<<" ";
|
||||
for (int j = 0; j < 8; ++j)
|
||||
{
|
||||
cout<<"|"<<boardArray[i][j];
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
int label = 8 - i;
|
||||
cout<<"; "<<label<<" ";
|
||||
for (int j = 0; j < 8; ++j){
|
||||
if (elemInXs(i, j))
|
||||
cout << "|" << "X";
|
||||
else if (elemInOs(i, j))
|
||||
cout << "|" << "O";
|
||||
else
|
||||
cout << "|" << "_";
|
||||
}
|
||||
|
||||
cout<<"|\n";
|
||||
}
|
||||
|
||||
cout<<'\n'<<endl;
|
||||
cout<<"turn: "<<turn << "\n";
|
||||
}
|
||||
|
@ -140,234 +151,74 @@ char Board::intToCharColumn(int input) //converts column number to int
|
|||
|
||||
return kolumn;
|
||||
}
|
||||
|
||||
/*
|
||||
void Board::move(string inputMove)
|
||||
{
|
||||
moves jugada = parse(inputMove);
|
||||
|
||||
int row = 8 - (jugada.row);
|
||||
int kolumn = charToIntColumn(jugada.column);
|
||||
int temp = boardArray[row][kolumn];
|
||||
int reflector = 1;
|
||||
|
||||
if (row > 8 || row < 0 || kolumn > 8 || kolumn < 0)
|
||||
{
|
||||
cout<<"ERROR: index out of bound in move()!"<<endl;
|
||||
}
|
||||
|
||||
else if (temp != turn)
|
||||
{
|
||||
cout<<"you can't move that piece at this turn!"<<endl;
|
||||
}
|
||||
|
||||
else if (temp == '_')
|
||||
{
|
||||
cout<<"there's no piece in that spot!"<<endl;
|
||||
}
|
||||
|
||||
else if (temp == 'X' || temp == 'O')
|
||||
{
|
||||
|
||||
if (temp == 'O')
|
||||
{
|
||||
reflector *= -1;
|
||||
}
|
||||
|
||||
|
||||
if (jugada.moveType == "FWD")
|
||||
{
|
||||
|
||||
if(boardArray[row+reflector][kolumn] != '_')
|
||||
{
|
||||
cout<<"you can't move that piece forward"<<endl;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
boardArray[row][kolumn] = '_';
|
||||
boardArray[row+reflector][kolumn] = temp;
|
||||
|
||||
changeTurns();
|
||||
displayBoard();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
else if (jugada.moveType == "LEFT")
|
||||
{
|
||||
if (kolumn == 0)
|
||||
{
|
||||
cout<<"Destination Spot out of range!"<<endl;
|
||||
}
|
||||
|
||||
else if (boardArray[row+reflector][kolumn-1] == temp)
|
||||
{
|
||||
cout<<"you hate your own team or something? you can't do that!"<<endl;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
boardArray[row][kolumn] = '_';
|
||||
boardArray[row+reflector][kolumn-1] = temp;
|
||||
|
||||
changeTurns();
|
||||
displayBoard();
|
||||
}
|
||||
}
|
||||
|
||||
else if (jugada.moveType == "RIGHT")
|
||||
{
|
||||
if (kolumn == 7)
|
||||
{
|
||||
cout<<"Destination Spot out of range!"<<endl;
|
||||
}
|
||||
|
||||
else if (boardArray[row+reflector][kolumn+1] == temp)
|
||||
{
|
||||
cout<<"you hate your own team or something? you can't do that!"<<endl;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
boardArray[row][kolumn] = '_';
|
||||
boardArray[row+reflector][kolumn+1] = temp;
|
||||
|
||||
changeTurns();
|
||||
displayBoard();
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
cout<<"Unrecognized movetype!"<<endl;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
cout<<"Invalid piece!"<<endl;
|
||||
}
|
||||
|
||||
|
||||
move(jugada);
|
||||
}
|
||||
|
||||
void Board::move(moves jugada)
|
||||
{
|
||||
|
||||
int row = 8 - (jugada.row);
|
||||
int kolumn = charToIntColumn(jugada.column);
|
||||
int column = charToIntColumn(jugada.column);
|
||||
|
||||
if (row > 8 || row < 0 || kolumn > 8 || kolumn < 0)
|
||||
{
|
||||
cout<<"ERROR: index out of bound in second move()!"<<endl;
|
||||
cout << "move coordinates: (" << row << ", " << column << ")\n";
|
||||
|
||||
if (row > 8 || row < 0 || column > 8 || column < 0) {
|
||||
cout<<"ERROR: index out of bound."<<endl;
|
||||
}
|
||||
|
||||
int temp = boardArray[row][kolumn];
|
||||
if (temp != turn)
|
||||
{
|
||||
cout<<"you can't move that piece at this turn!"<<endl;
|
||||
char temp = boardArray[row][column]->getType();
|
||||
cout << "temp: " << temp << "\n";
|
||||
|
||||
if (temp != turn || temp == '_') {
|
||||
cout<<"ERROR: attempting to move an invalid piece."<<endl;
|
||||
}
|
||||
|
||||
else if (temp == '_')
|
||||
{
|
||||
cout<<"there's no piece in that spot!"<<endl;
|
||||
else {
|
||||
if (jugada.moveType == "FWD") {
|
||||
boardArray[row][column]->moveFwd();
|
||||
}
|
||||
|
||||
int reflector = 1;
|
||||
|
||||
if (temp == 'X' || temp == 'O')
|
||||
{
|
||||
|
||||
if (temp == 'O')
|
||||
{
|
||||
reflector *= -1;
|
||||
}
|
||||
|
||||
|
||||
if (jugada.moveType == "FWD")
|
||||
{
|
||||
|
||||
if(boardArray[row+reflector][kolumn] != '_')
|
||||
{
|
||||
cout<<"you can't move that piece forward"<<endl;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
boardArray[row][kolumn] = '_';
|
||||
boardArray[row+reflector][kolumn] = temp;
|
||||
|
||||
changeTurns();
|
||||
displayBoard();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
else if (jugada.moveType == "LEFT")
|
||||
{
|
||||
if (kolumn == 0)
|
||||
{
|
||||
else if (jugada.moveType == "LEFT") {
|
||||
if (column == 0)
|
||||
cout<<"Destination Spot out of range!"<<endl;
|
||||
}
|
||||
|
||||
else if (boardArray[row+reflector][kolumn-1] == temp)
|
||||
{
|
||||
else if (boardArray[row][column-1]->getType() == temp)
|
||||
cout<<"you hate your own team or something? you can't do that!"<<endl;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
boardArray[row][kolumn] = '_';
|
||||
boardArray[row+reflector][kolumn-1] = temp;
|
||||
|
||||
changeTurns();
|
||||
displayBoard();
|
||||
}
|
||||
boardArray[row][column]->moveLeft();
|
||||
}
|
||||
|
||||
else if (jugada.moveType == "RIGHT")
|
||||
{
|
||||
if (kolumn == 7)
|
||||
{
|
||||
else if (jugada.moveType == "RIGHT") {
|
||||
if (column == 7)
|
||||
cout<<"Destination Spot out of range!"<<endl;
|
||||
}
|
||||
|
||||
else if (boardArray[row+reflector][kolumn+1] == temp)
|
||||
{
|
||||
else if (boardArray[row][column+1]->getType() == temp)
|
||||
cout<<"you hate your own team or something? you can't do that!"<<endl;
|
||||
}
|
||||
|
||||
else
|
||||
boardArray[row][column]->moveRight();
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
//FIX THIS
|
||||
//take out the prints and turn changes from move
|
||||
void Board::moveWOPrint(moves jugada)
|
||||
{
|
||||
boardArray[row][kolumn] = '_';
|
||||
boardArray[row+reflector][kolumn+1] = temp;
|
||||
|
||||
changeTurns();
|
||||
displayBoard();
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
cout<<"Unrecognized movetype!"<<endl;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
cout<<"Invalid piece!"<<endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
bool Board::isThisMovePossible(int r, int c, string moveType)
|
||||
{
|
||||
char pieceToMove = boardArray[r][c];
|
||||
char pieceToMove = boardArray[r][c]->getType();
|
||||
|
||||
if (pieceToMove != turn) //trying to move invalid piece
|
||||
{
|
||||
cout << "Error in Board::isThisMovePossible: trying to move a piece outside your turn.\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -382,22 +233,26 @@ bool Board::isThisMovePossible(int r, int c, string moveType)
|
|||
{
|
||||
if (moveType == "FWD")
|
||||
{
|
||||
|
||||
if (boardArray[r+reflector][c] == '_') return true;
|
||||
else return false;
|
||||
|
||||
if (boardArray[r+reflector][c]->getType() == '_')
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
else if (moveType == "RIGHT")
|
||||
{
|
||||
if (boardArray[r+reflector][c+1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7) ) return true;
|
||||
else return false;
|
||||
if (boardArray[r+reflector][c+1]->getType() != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 <= 7) )
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
else if (moveType == "LEFT")
|
||||
{
|
||||
if (boardArray[r+reflector][c-1] != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) ) return true;
|
||||
else return false;
|
||||
if (boardArray[r+reflector][c-1]->getType() != pieceToMove && (r+reflector >= 0) && (r+reflector <= 7) && (c+1 >= 0) )
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
else return false;
|
||||
|
@ -412,7 +267,7 @@ vector<moves> Board::viewPossibleMoves()
|
|||
{
|
||||
for (int c = 0; c < 8; ++c)
|
||||
{
|
||||
if (boardArray[r][c] == turn)
|
||||
if (boardArray[r][c]->getType() == turn)
|
||||
{
|
||||
if (isThisMovePossible(r,c,"FWD"))
|
||||
{
|
||||
|
@ -438,7 +293,7 @@ vector<moves> Board::viewPossibleMoves()
|
|||
|
||||
return output;
|
||||
}
|
||||
|
||||
*/
|
||||
string Board::myToUpper(string input)
|
||||
{
|
||||
string output;
|
||||
|
@ -455,11 +310,6 @@ string Board::myToUpper(string input)
|
|||
else output.push_back(input[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < output.size(); ++i)
|
||||
{
|
||||
cout<<output[i]<<endl;
|
||||
}
|
||||
|
||||
return output;
|
||||
|
||||
}
|
||||
|
@ -479,13 +329,14 @@ void Board::undo(Board& tablero)
|
|||
{
|
||||
for (int k = 0; k < 8; ++k)
|
||||
{
|
||||
tablero.modifyAt(r,k,(record[record.size()-2]).elementAt(r,k));
|
||||
}
|
||||
}
|
||||
record.pop_back();
|
||||
//tablero.modifyAt(r,k,(record[record.size()-2]).elementAt(r,k));
|
||||
}
|
||||
}
|
||||
|
||||
record.pop_back();
|
||||
}
|
||||
}
|
||||
/*
|
||||
void Board::interpret(string input, Board& tablero) //determines what kind of command its input is
|
||||
{
|
||||
vector<Board> record;
|
||||
|
@ -509,7 +360,7 @@ void Board::interpret(string input, Board& tablero) //determines what kind of co
|
|||
|
||||
else tablero.move(input);
|
||||
}
|
||||
|
||||
*/
|
||||
void Board::snapshot(vector<Board>& inputVec, Board inputBoard)
|
||||
{
|
||||
if (inputVec.size() == 10)
|
||||
|
@ -522,31 +373,21 @@ void Board::snapshot(vector<Board>& inputVec, Board inputBoard)
|
|||
cout<<"QUEUE OVERFLOW!"<<endl;
|
||||
}
|
||||
|
||||
|
||||
inputVec.push_back(inputBoard);
|
||||
}
|
||||
|
||||
//move this to its own file
|
||||
void Board::easyAI()
|
||||
{
|
||||
|
||||
//1) see all possible movements
|
||||
|
||||
vector<moves> listOfMoves = viewPossibleMoves();
|
||||
|
||||
//obvious moves
|
||||
if (false){
|
||||
return;
|
||||
int Board::evaluate(char max, char min){
|
||||
//right now just evaluating number of pieces
|
||||
if (max == 'X'){
|
||||
return (xpieces.size() - opieces.size());
|
||||
}
|
||||
|
||||
else if (max == 'O'){
|
||||
return (opieces.size() - xpieces.size());
|
||||
}
|
||||
|
||||
//random
|
||||
else {
|
||||
srand(time(NULL));
|
||||
int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element
|
||||
|
||||
//3) execute movement
|
||||
int temp = randomChoice;
|
||||
|
||||
move(listOfMoves[randomChoice]);
|
||||
cout << "Unidentified max, must be either X or O.\n";
|
||||
return 0;
|
||||
}
|
||||
}
|
21
Board.h
21
Board.h
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include "Piece.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -18,13 +19,16 @@ struct moves {
|
|||
};
|
||||
|
||||
class Board {
|
||||
char boardArray [8][8];
|
||||
//vector<vector<char>> boardArray;
|
||||
vector<Piece*> xpieces;
|
||||
vector<Piece*> opieces;
|
||||
//char boardArray [8][8];
|
||||
char turn = 'O';
|
||||
|
||||
public:
|
||||
Board();
|
||||
char elementAt(int r, int k) { return boardArray[r][k]; }
|
||||
void modifyAt(int r, int k, char input) { boardArray[r][k] = input; }
|
||||
bool elemInXs(int r, int c);
|
||||
bool elemInOs(int r, int c);
|
||||
moves parse(string input);
|
||||
char getTurn() { return turn; }
|
||||
bool isGameOver();
|
||||
|
@ -32,13 +36,14 @@ public:
|
|||
void displayBoard();
|
||||
int charToIntColumn(char input);
|
||||
char intToCharColumn(int input);
|
||||
void move(string inputMove);
|
||||
void move(moves jugada);
|
||||
bool isThisMovePossible(int r, int c, string moveType);
|
||||
vector<moves> viewPossibleMoves();
|
||||
//void move(string inputMove);
|
||||
//void move(moves jugada);
|
||||
void moveWOPrint(moves jugada);
|
||||
//bool isThisMovePossible(int r, int c, string moveType);
|
||||
//vector<moves> viewPossibleMoves();
|
||||
string myToUpper(string input);
|
||||
void undo(Board& tablero);
|
||||
void interpret(string input, Board& tablero);
|
||||
void snapshot(vector<Board>& inputVec, Board inputBoard);
|
||||
void easyAI();
|
||||
int evaluate(char max, char min);
|
||||
};
|
135
Engine.cpp
Executable file
135
Engine.cpp
Executable file
|
@ -0,0 +1,135 @@
|
|||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "Engine.h"
|
||||
|
||||
|
||||
Engine::Engine(){
|
||||
Board* brd = new Board();
|
||||
b = brd;
|
||||
}
|
||||
|
||||
void Engine::startGame(){
|
||||
cout<<"WELCOME\n";
|
||||
|
||||
cout<<"1. Play against AI?\n";
|
||||
cout<<"2. Play against a human?\n";
|
||||
cout<<"Enter choice: \n";
|
||||
|
||||
int choice = -1;
|
||||
cin >> choice;
|
||||
cout << "OK" << endl;
|
||||
|
||||
string move;
|
||||
|
||||
bool gameOver = false;
|
||||
vector<Board> record;
|
||||
b->snapshot(record, *b);
|
||||
|
||||
while (gameOver != true)
|
||||
{
|
||||
gameOver = b->isGameOver();
|
||||
|
||||
while(b->getTurn() == 'O' )
|
||||
{
|
||||
b->displayBoard();
|
||||
cout<<"\nEnter command: ";
|
||||
cin>>move;
|
||||
cout << "\n";
|
||||
b->interpret(move, *b);
|
||||
}
|
||||
|
||||
b->changeTurns();
|
||||
|
||||
while(b->getTurn() == 'X' )
|
||||
{
|
||||
cout << "\n\n\n\nit gets here\n\n\n\n";
|
||||
easyAI();
|
||||
}
|
||||
|
||||
gameOver = b->isGameOver();
|
||||
|
||||
b->snapshot(record, *b);
|
||||
}
|
||||
}
|
||||
|
||||
void Engine::easyAI()
|
||||
{
|
||||
//1) see all possible movements
|
||||
vector<moves> listOfMoves = b->viewPossibleMoves();
|
||||
|
||||
//obvious moves
|
||||
if (false){
|
||||
b->changeTurns();
|
||||
}
|
||||
|
||||
//random
|
||||
else {
|
||||
srand(time(NULL));
|
||||
int randomChoice = rand() % (listOfMoves.size()-1) - 0; // choose a move betwen listOfMoves[0] to last element
|
||||
|
||||
//3) execute movement
|
||||
int temp = randomChoice;
|
||||
b->move(listOfMoves[randomChoice]);
|
||||
}
|
||||
}
|
||||
|
||||
void Engine::AI(){
|
||||
cout << "----------------------BEGIN AI FUNCTION----------------------\n";
|
||||
vector<moves> listOfMoves = b->viewPossibleMoves();
|
||||
Board temp = *b;
|
||||
|
||||
//probably not needed, check later
|
||||
if (temp.getTurn() != 'X'){
|
||||
cout << "a changing of turns is needed. \n";
|
||||
temp.changeTurns();
|
||||
}
|
||||
|
||||
//only doing 1 branch right now because testing
|
||||
/*for (int i = 0; i < listOfMoves.size(); ++i){
|
||||
minMax(temp, listOfMoves[i]);
|
||||
}*/
|
||||
|
||||
b->moveWOPrint(minMax(temp, listOfMoves[0], 0));
|
||||
|
||||
//verification of correct turn
|
||||
if (b->getTurn() != 'O'){
|
||||
cout << "ERROR in Engine::AI: b is on the wrong turn. \n";
|
||||
}
|
||||
|
||||
b->displayBoard();
|
||||
cout << "----------------------END AI FUNCTION----------------------\n";
|
||||
}
|
||||
|
||||
moves Engine::minMax(Board temp, moves m, int c){
|
||||
//testing purposes only
|
||||
if (c > 5){
|
||||
return m;
|
||||
}
|
||||
|
||||
if (temp.isGameOver() == true){
|
||||
cout << "END OF PATH REACHED\n";
|
||||
return m;
|
||||
}
|
||||
|
||||
else {
|
||||
if(temp.isThisMovePossible(8 - m.row, temp.charToIntColumn(m.column), m.moveType)){
|
||||
cout << "piece has been moved in minMax\n";
|
||||
temp.moveWOPrint(m);
|
||||
}
|
||||
cout << "c: " << c << "\n\n";
|
||||
cout << "current turn: " << temp.getTurn() << "\n";
|
||||
vector<moves> listOfMoves = temp.viewPossibleMoves();
|
||||
|
||||
for (int i = 0; i < listOfMoves.size(); ++i){
|
||||
//return minMax(temp, listOfMoves[i]);
|
||||
}
|
||||
|
||||
//limited recursion
|
||||
return minMax(temp, listOfMoves[0], ++c);
|
||||
|
||||
//testing
|
||||
return m;
|
||||
}
|
||||
}
|
16
Engine.h
Executable file
16
Engine.h
Executable file
|
@ -0,0 +1,16 @@
|
|||
#pragma once
|
||||
|
||||
#include "Board.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class Engine {
|
||||
Board* b;
|
||||
|
||||
public:
|
||||
Engine();
|
||||
void startGame();
|
||||
void easyAI();
|
||||
void AI();
|
||||
moves minMax(Board temp, moves m, int c);
|
||||
};
|
69
Piece.cpp
Executable file
69
Piece.cpp
Executable file
|
@ -0,0 +1,69 @@
|
|||
#include <iostream>
|
||||
#include "Piece.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
Piece::Piece(){
|
||||
x = -1;
|
||||
y = -1;
|
||||
type = '?';
|
||||
}
|
||||
|
||||
Piece::Piece(int r, int c){
|
||||
x = r;
|
||||
y = c;
|
||||
type = '_';
|
||||
}
|
||||
|
||||
Piece::Piece(int r, int c, char t){
|
||||
x = r;
|
||||
y = c;
|
||||
type = t;
|
||||
}
|
||||
|
||||
void Piece::moveFwd(){
|
||||
if (type == 'X'){
|
||||
x++;
|
||||
}
|
||||
|
||||
else if (type == 'O'){
|
||||
x--;
|
||||
}
|
||||
|
||||
else
|
||||
cout << "Error: trying to move an empty piece forward.";
|
||||
}
|
||||
|
||||
void Piece::moveLeft(){
|
||||
if (type == 'X'){
|
||||
x++;
|
||||
y--;
|
||||
}
|
||||
|
||||
else if (type == 'O'){
|
||||
x--;
|
||||
y++;
|
||||
}
|
||||
|
||||
else
|
||||
cout << "Error: trying to move an empty piece left.";
|
||||
}
|
||||
|
||||
void Piece::moveRight(){
|
||||
if (type == 'X'){
|
||||
x++;
|
||||
y++;
|
||||
}
|
||||
|
||||
else if (type == 'O'){
|
||||
x--;
|
||||
y--;
|
||||
}
|
||||
|
||||
else
|
||||
cout << "Error: trying to move an empty piece left.";
|
||||
}
|
||||
|
||||
void Piece::isTaken(){
|
||||
//
|
||||
}
|
25
Piece.h
Executable file
25
Piece.h
Executable file
|
@ -0,0 +1,25 @@
|
|||
#pragma once
|
||||
|
||||
using namespace std;
|
||||
|
||||
class Piece {
|
||||
int x;
|
||||
int y;
|
||||
char type;
|
||||
|
||||
public:
|
||||
Piece();
|
||||
Piece(int r, int c);
|
||||
Piece(int r, int c, char t);
|
||||
void moveFwd();
|
||||
void moveLeft();
|
||||
void moveRight();
|
||||
int getX(){ return x; }
|
||||
void setX(int r){ x = r; }
|
||||
int getY(){ return y; }
|
||||
void setY(int c){ y = c; }
|
||||
char getType(){ return type; }
|
||||
void setType(char t){ type = t; }
|
||||
void makeEmpty(){ type = '_'; }
|
||||
void isTaken();
|
||||
};
|
BIN
a.out
BIN
a.out
Binary file not shown.
73
test.cpp
73
test.cpp
|
@ -1,76 +1,15 @@
|
|||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "Board.h"
|
||||
#include "Engine.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main()
|
||||
{
|
||||
cout<<"WELCOME\n";
|
||||
|
||||
cout<<"1. Play against AI?\n";
|
||||
cout<<"2. Play against a human?\n";
|
||||
//cout<<"CHANGE THIS TO PARSE THINGS\n";
|
||||
cout<<"Enter choice: \n";
|
||||
|
||||
int choice;
|
||||
cin >> choice;
|
||||
cout << "OK" << endl;
|
||||
|
||||
//board testing
|
||||
Board b;
|
||||
string move;
|
||||
|
||||
bool gameOver = false;
|
||||
vector<Board> record;
|
||||
b.snapshot(record,b);
|
||||
|
||||
while (gameOver != true)
|
||||
{
|
||||
gameOver = b.isGameOver();
|
||||
|
||||
while(b.getTurn() == 'O' )
|
||||
{
|
||||
b.displayBoard();
|
||||
cout<<"\nEnter command: ";
|
||||
cin>>move;
|
||||
b.interpret(move,b);
|
||||
}
|
||||
|
||||
|
||||
vector<moves> possibleMoves = b.viewPossibleMoves();
|
||||
|
||||
if (choice == 1)
|
||||
{
|
||||
b.easyAI();
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
while(b.getTurn() == 'X' )
|
||||
{
|
||||
b.displayBoard();
|
||||
cout<<"\nEnter command: ";
|
||||
cout<<"OK\n";
|
||||
cin>>move;
|
||||
b.interpret(move,b);
|
||||
}
|
||||
}
|
||||
|
||||
//b.snapshot();
|
||||
gameOver = b.isGameOver();
|
||||
|
||||
b.snapshot(record,b);
|
||||
}
|
||||
|
||||
//for debugging purposes
|
||||
cout<<"Record:"<<endl;
|
||||
|
||||
|
||||
cout<<record.size();
|
||||
for (int i = 0; i < record.size(); ++i)
|
||||
{
|
||||
record[i].displayBoard();
|
||||
}
|
||||
|
||||
//engine testing
|
||||
//Engine e;
|
||||
//e.startGame();
|
||||
}
|
||||
|
|
Reference in a new issue