Hi,
I'm having a bit of trouble with getting jump moves and especially multiple jump moves working. Any help would be great! excuse the code, it may be a little all over the place and I could have totally the wrong method! I've also cut out a stringtokenizer class which I know works fine.
Thanks in advance,
Ronan
Code:#include <iostream> #include <string> #include <stdexcept> #include <ctype.h> #include <math.h> using namespace std; // Token types const int NONE = 0; const int WORD = 1; const int NUMBER = 2; string b_w = " Black"; //who's move is it int black_pieces_left = 12; int white_pieces_left = 12; class Board { public: Board(); void print_board(); void reset_space(int, int, bool); void jumped_space(int); char squares[32]; char spaces[32]; private: }; Board::Board() { for (int i=0; i<13; i++) { squares[i] = 'W'; } for (i=12; i<20; i++) { squares[i] = ' '; } for (i=20; i<32; i++) { squares[i] = 'B'; } for (i=0; i<32; i++) { spaces[i] = ' '; } squares[16] = 'W'; } void Board::print_board() { cout << endl << endl; cout << "\t\t +---+---+---+---+---+---+---+---+ " << endl; cout << "\t\t |///|" << spaces[0] << squares[0] << " |///|" << spaces[1] << squares[1] << " |///|" << spaces[2] << squares[2] << " |///|" << spaces[3] << squares[3] << " | " << endl; cout << "\t\t |///| 1 |///| 2 |///| 3 |///| 4 | " << endl; cout << "\t\t +---|---|---|---|---|---|---|---+ " << endl; cout << "\t\t |" << spaces[4] << squares[4] << " |///|" << spaces[5] << squares[5] << " |///|" << spaces[6] << squares[6] << " |///|" << spaces[7] << squares[7] << " |///|" << endl; cout << "\t\t | 5 |///| 6 |///| 7 |///| 8 |///| " << endl; cout << "\t\t +---|---|---|---|---|---|---|---+ " << endl; cout << "\t\t |///|" << spaces[8] << squares[8] << " |///|" << spaces[9] << squares[9] << " |///|" << spaces[10] << squares[10] << " |///|" << spaces[11] << squares[11] << " | " << endl; cout << "\t\t |///| 9 |///| 10|///| 11|///| 12| " << endl; cout << "\t\t +---|---|---|---|---|---|---|---+ " << endl; cout << "\t\t |" << spaces[12] << squares[12] << " |///|" << spaces[13] << squares[13] << " |///|" << spaces[14] << squares[14] << " |///|" << spaces[15] << squares[15] << " |///| " << "\tBlack Remaining: " << black_pieces_left << endl; cout << "\t\t | 13|///| 14|///| 15|///| 16|///| " << endl; cout << "\t\t +---|---|---|---|---|---|---|---+ " << endl; cout << "\t\t |///|" << spaces[16] << squares[16] << " |///|" << spaces[17] << squares[17] << " |///|" << spaces[18] << squares[18] << " |///|" << spaces[19] << squares[19] << " | " << "\tWhite Remaining: " << white_pieces_left << endl; cout << "\t\t |///| 17|///| 18|///| 19|///| 20| " << endl; cout << "\t\t +---|---|---|---|---|---|---|---+ " << endl; cout << "\t\t |" << spaces[20] << squares[20] << " |///|" << spaces[21] << squares[21] << " |///|" << spaces[22] << squares[22] << " |///|" << spaces[23] << squares[23] << " |///| " << endl; cout << "\t\t | 21|///| 22|///| 23|///| 24|///| " << endl; cout << "\t\t +---|---|---|---|---|---|---|---+ " << endl; cout << "\t\t |///|" << spaces[24] << squares[24] << " |///|" << spaces[25] << squares[25] << " |///|" << spaces[26] << squares[26] << " |///|" << spaces[27] << squares[27] << " | " << endl; cout << "\t\t |///| 25|///| 26|///| 27|///| 28| " << endl; cout << "\t\t +---|---|---|---|---|---|---|---+ " << endl; cout << "\t\t |" << spaces[28] << squares[28] << " |///|" << spaces[29] << squares[29] << " |///|" << spaces[30] << squares[30] << " |///|" << spaces[31] << squares[31] << " |///| " << endl; cout << "\t\t | 29|///| 30|///| 31|///| 32|///| " << endl; cout << "\t\t +---+---+---+---+---+---+---+---+ " << endl; cout << endl << endl; } void Board::reset_space(int start, int end, bool king) { char tmp1, tmp2; //King Me if (king == true) { spaces[start] = ' '; spaces[end] = 'K'; tmp1 = squares[start]; squares[start] = ' '; squares[end] = tmp1; } else { //Regular Moves Pieces tmp1 = squares[start]; squares[start] = ' '; squares[end] = tmp1; tmp2 = spaces[start]; spaces[start] = ' '; spaces[end] = tmp2; } } void Board::jumped_space(int del) { cout << "in jumped_space" << endl; cout << "space to del: " << del << endl; squares[del] = ' '; spaces[del] = ' '; if (b_w[1] == 'B') white_pieces_left--; else black_pieces_left--; } class GamePlay { public: GamePlay(); Board b; void check_move(int, int); bool legal(); bool game_over(string); bool king_me(); private: bool reg_move(); bool jump_legal(); int jump_move(); int moves_GP[4]; int row1, row2; int col1, col2; }; GamePlay::GamePlay() { row1 = 0, row2 = 0; col1 = 0, col2 = 0; } //Initilasing void GamePlay::check_move(int a, int b) { moves_GP[0] = a, moves_GP[1] = b; //Switch Statement if (moves_GP[0] >= 1 && moves_GP[0] <= 4) row1 = 1; else if (moves_GP[0] >= 5 && moves_GP[0] <= 8) row1 = 2; else if (moves_GP[0] >= 9 && moves_GP[0] <= 12) row1 = 3; else if (moves_GP[0] >= 13 && moves_GP[0] <= 16) row1 = 4; else if (moves_GP[0] >= 17 && moves_GP[0] <= 20) row1 = 5; else if (moves_GP[0] >= 21 && moves_GP[0] <= 24) row1 = 6; else if (moves_GP[0] >= 25 && moves_GP[0] <= 28) row1 = 7; else if (moves_GP[0] >= 29 && moves_GP[0] <= 32) row1 = 8; if (moves_GP[1] >= 1 && moves_GP[1] <= 4) row2 = 1; else if (moves_GP[1] >= 5 && moves_GP[1] <= 8) row2 = 2; else if (moves_GP[1] >= 9 && moves_GP[1] <= 12) row2 = 3; else if (moves_GP[1] >= 13 && moves_GP[1] <= 16) row2 = 4; else if (moves_GP[1] >= 17 && moves_GP[1] <= 20) row2 = 5; else if (moves_GP[1] >= 21 && moves_GP[1] <= 24) row2 = 6; else if (moves_GP[1] >= 25 && moves_GP[1] <= 28) row2 = 7; else if (moves_GP[1] >= 29 && moves_GP[1] <= 32) row2 = 8; if (moves_GP[0] == 5 || moves_GP[0] == 13 || moves_GP[0] == 21 || moves_GP[0] == 29) col1 = 1; else if (moves_GP[0] == 1 || moves_GP[0] == 9 || moves_GP[0] == 17 || moves_GP[0] == 25) col1 = 2; else if (moves_GP[0] == 6 || moves_GP[0] == 14 || moves_GP[0] == 22 || moves_GP[0] == 30) col1 = 3; else if (moves_GP[0] == 2 || moves_GP[0] == 10 || moves_GP[0] == 18 || moves_GP[0] == 26) col1 = 4; else if (moves_GP[0] == 7 || moves_GP[0] == 15 || moves_GP[0] == 23 || moves_GP[0] == 31) col1 = 5; else if (moves_GP[0] == 3 || moves_GP[0] == 11 || moves_GP[0] == 19 || moves_GP[0] == 27) col1 = 6; else if (moves_GP[0] == 8 || moves_GP[0] == 16 || moves_GP[0] == 24 || moves_GP[0] == 32) col1 = 7; else if (moves_GP[0] == 4 || moves_GP[0] == 12 || moves_GP[0] == 20 || moves_GP[0] == 28) col1 = 8; if (moves_GP[1] == 5 || moves_GP[1] == 13 || moves_GP[1] == 21 || moves_GP[1] == 29) col2 = 1; else if (moves_GP[1] == 1 || moves_GP[1] == 9 || moves_GP[1] == 17 || moves_GP[1] == 25) col2 = 2; else if (moves_GP[1] == 6 || moves_GP[1] == 14 || moves_GP[1] == 22 || moves_GP[1] == 30) col2 = 3; else if (moves_GP[1] == 2 || moves_GP[1] == 10 || moves_GP[1] == 18 || moves_GP[1] == 26) col2 = 4; else if (moves_GP[1] == 7 || moves_GP[1] == 15 || moves_GP[1] == 23 || moves_GP[1] == 31) col2 = 5; else if (moves_GP[1] == 3 || moves_GP[1] == 11 || moves_GP[1] == 19 || moves_GP[1] == 27) col2 = 6; else if (moves_GP[1] == 8 || moves_GP[1] == 16 || moves_GP[1] == 24 || moves_GP[1] == 32) col2 = 7; else if (moves_GP[1] == 4 || moves_GP[1] == 12 || moves_GP[1] == 20 || moves_GP[1] == 28) col2 = 8; } //Checking a number of parameters to see if spaces //used in the move are legal bool GamePlay::legal() { //Check number for validity if(moves_GP[0] <= 32 && moves_GP[0] > 0 && moves_GP[1] <= 32 && moves_GP[1] > 0) { //Check if space selected is empty if(b.squares[moves_GP[0]-1] != ' ') { //Check if own piece is in space selected if (b.squares[moves_GP[0]-1] == b_w[1]) { //Space not already occupied if (b.squares[moves_GP[1]-1] == ' ') { //Piece Moving Right Direction if ((b_w[1] == 'B' && row2 < row1) || (b_w[1] == 'W' && row1 < row2)) { if (reg_move() == true) return true; else return false; } //King Piece Moving else if (b.spaces[moves_GP[0]-1] == 'K') { if (reg_move() == true) return true; else return false; } else { cout << "Pieces may only move forward" << endl; return false; } } else { cout << "That space is already occupied" << endl; return false; } } else { cout << "You may only move your own pieces" << endl; return false; } } else { cout << "There is no piece in the space selected" << endl; return false; } } else { cout << "Move entered is outside the board or you have not entered enough parameters" << endl; return false; } } bool GamePlay::reg_move() { cout << "Space To Jump: " << jump_move() << endl; if (abs(col1 - col2) == 1 && abs(row1 - row2) == 1) { return true; } else if (jump_legal() == true) { return true; } else { cout << "You have tried to move too many spaces" << endl; return false; } } bool GamePlay::jump_legal() { if (b.squares[jump_move()] == ' ') { cout << "You cannot jump over empty spaces" << endl; return false; } else { if (b.squares[jump_move()] == b_w[1]) { cout << "You cannot jump over your own piece" << endl; return false; } else { b.jumped_space(jump_move()); return true; } } } int GamePlay::jump_move() { int jumped = 99; if (moves_GP[1] > moves_GP[0]) jumped = ((moves_GP[1] - moves_GP[0]) / 2) + moves_GP[0]; else if (moves_GP[0] > moves_GP[1]) jumped = ((moves_GP[0] - moves_GP[1]) / 2) + moves_GP[1] - 1; return jumped; } //Check if the moved piece needs to be knighted bool GamePlay::king_me() { if(b_w[1] == 'B' && row2 == 1) return true; else if (b_w[1] == 'W' && row2 == 8) return true; else return false; } bool GamePlay::game_over(string s) { // no legal move available, no pieces left; //Needs to be finished if (b_w[1] == 'B' && (black_pieces_left == 0 || s == "pass")) { cout << endl << endl << "WHITE WINS!!" << endl << endl; return true; } else if (b_w[1] == 'W' && (white_pieces_left == 0 || s == "pass")) { cout << endl << endl << "BLACK WINS!!" << endl << endl; return true; } else if (s == "False") return false; else return false; } int main() { int i,j; int moves[4]; string resign = "False"; string record = "\nRecord Of Moves For Game:\n"; //Board b; GamePlay g; //b.setup(); do { g.b.print_board(); j=0; for (i = 0; i < 4; i++) { moves[i] = 0; } cout << b_w << "'s go: "; string t=""; getline(cin,t); StringTokenizer st(t); cin.ignore(); /*cout << b_w << "'s go: "; string t; getline(cin,t); cin.ignore(); StringTokenizer st(t); */ while (!st.end()) { if (st.token_type() == NUMBER) { moves[j] = st.last_number(); j++; } else if (st.token_type() == WORD) { resign = st.last_word(); } st.next(); } //***QUIT*** if (moves[0] == 99) break; g.check_move(moves[0], moves[1]); if (resign != "pass") { if (g.legal() == true) { record = record + b_w + ": " + t + "\n"; //Checking if King if(b_w[1] == 'B') g.b.reset_space(moves[0]-1,moves[1]-1,g.king_me()); else if (b_w[1] == 'W') g.b.reset_space(moves[0]-1,moves[1]-1,g.king_me()); //Regular Pieces else g.b.reset_space(moves[0]-1,moves[1]-1,g.king_me()); //Switch Player if (b_w[1] == 'B') b_w = " White"; else if (b_w[1] == 'W') b_w = " Black"; } } } while (g.game_over(resign) == false); cout << record << endl; return 0; }



LinkBack URL
About LinkBacks


