Jump moves in Checkers Game
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;
}