Hey peeps,
ive been trying to implement a forced move functon in my game. I think the code makes sense, it should do what it says, but it never sets fm to "true" when it discovers a forced move. Either it doesn't enter the loop and carry out the code or its not setting forced move to true. Im very new to coding, so i may have made a silly mistake, but im not experienced enough to spot it. If anyone could it would be a great help, thank you.
sorry about the length of the code, im no where near good enough to optimize...
Code:
bool Game::move(Square *dest, Draught *current){
bool fm = false;
bool valid = false;
Square * sq1 = current->getSquare();
if (dest->isOccupied()) return false;
vector<int> forcedMovesp1;
vector<int> forcedMovesp2;
vector<int>::const_iterator move;
if (cp==1){
for(int i=0; i<player1->getNDraughts(); i++){
Draught * d1 = player1->getDraught(i);
Square * d1s = d1->getSquare();
for(int j=0; j<player2->getNDraughts(); j++){
Draught * d2 = player2->getDraught(j);
if(d1s->getY() == 0 && d1s->getY() == 1){
Square * s = board->getSquare(d1s->getX()+1, d1s->getY() +1); // getting squares for top right
Square * o = board->getSquare(d1s->getX()+2, d1s->getY() +2);
Square * s1 = board->getSquare(d1s->getX()-1, d1s->getY() +1); // getting squares for bottom right
Square * o1 = board->getSquare(d1s->getX()-2, d1s->getY() +2);
if ((d2->getSquare() == s) && !o->isOccupied()){ // checking if top right square is occupied
fm = true;
}
if ((d2->getSquare() == s1) && !o1->isOccupied()){ // checking if bottom right square is occupied
fm = true;
}
}
else if (sq1->getY() == 6 && sq1->getY() == 7){
Square * s = board->getSquare(d1s->getX()+1, d1s->getY()-1); // getting squares for top left focred move
Square * o = board->getSquare(d1s->getX()+2, d1s->getY()-2);
Square * s1 = board->getSquare(d1s->getX()-1, d1s->getY() -1); // getting squares for bottom left
Square * o1 = board->getSquare(d1s->getX()-2, d1s->getY() -2);
if ((d2->getSquare() == s) && !o->isOccupied()){ // checking if top right square is occupied
fm = true;
}
if ((d2->getSquare() == s1) && !o1->isOccupied()){ // checking if bottom right square is occupied
fm = true;
}
}
else if (sq1->getY() == 2 && sq1->getY() == 3 && sq1->getY() == 4 && sq1->getY() == 5) { //rest of squares on the row
Square * s = board->getSquare(d1s->getX()+1, d1s->getY()-1); // getting squares for top left focred move
Square * o = board->getSquare(d1s->getX()+2, d1s->getY()-2);
Square * s1 = board->getSquare(d1s->getX()+1, d1s->getY() +1); // getting squares for top right
Square * o1 = board->getSquare(d1s->getX()+2, d1s->getY() +2);
Square * s2 = board->getSquare(d1s->getX()-1, d1s->getY() -1); // getting squares for bottom left
Square * o2 = board->getSquare(d1s->getX()-2, d1s->getY() -2);
Square * s3 = board->getSquare(d1s->getX()-1, d1s->getY() +1); // getting squares for bottom right
Square * o3 = board->getSquare(d1s->getX()-2, d1s->getY() +2);
if ((d2->getSquare() == s) && !o->isOccupied()){ // checking if top left square is occupied
fm = true;
}
if ((d2->getSquare() == s1) && !o1->isOccupied()){ // checking if top right square is occupied
fm = true;
}
if (current->isKing()){
if ((d2->getSquare() == s2) && !o2->isOccupied()){ // checking if bottom left square is occupied
fm = true;
}
}
if (current->isKing()){
if ((d2->getSquare() == s3) && !o3->isOccupied()){ // checking if bottom right square is occupied
fm = true;
}
}
}
}
if (fm) {
forcedMovesp1.push_back(i);
}
}
if (fm){
for (move = forcedMovesp1.begin(); move != forcedMovesp1.end(); ++move){
if (sq1->getDraught() == move) {
if (sq1->getX()!=dest->getX()-2) {}
else if ((sq1->getY()!=dest->getY()+2) && (sq1->getY()!=dest->getY()-2)) {} // check if move made by player is valid
else if (current->isKing()){
if(sq1->getX()!=dest->getX()+2){}
else
{valid = true;}
}
else {
valid = true;
}
}
else {
cout << "Invalid selection" <<endl;
}
}
}
/* END OF FORCED MOVE CHECK FOR P1
NOW CHECK FOR STANDARD MOVES FOR P1*/
if (fm == false){
if (sq1->getX()!=dest->getX()-1){} // Checking conditon for P1
else if ((sq1->getY()!=dest->getY()+1) && (sq1->getY()!=dest->getY()-1)){}
else if (current->isKing()){
if (sq1->getX()!=dest->getX()+1){}
else
{valid = true;} // for the king
}
else {
valid = true; // standard piece
}
}
}
/* END OF PLAYER 1 STANDARD MOVES CHECK
NOW BEGIN CHECK FOR PLAYER 2*/
/* START P2 FORCED MOVE CHECK */
else{
cout << "player2" <<endl;
for(int i=0; i<player2->getNDraughts(); i++){
Draught * d1 = player2->getDraught(i);
Square * d1s = d1->getSquare();
for(int j=0; j<player1->getNDraughts(); j++){
Draught * d2 = player1->getDraught(j);
if(d1s->getX() == 0 && d1s->getX() == 1){
Square * s = board->getSquare(d1s->getX()-1, d1s->getY() +1); // getting squares for top right
Square * o = board->getSquare(d1s->getX()-2, d1s->getY() +2);
Square * s1 = board->getSquare(d1s->getX()+1, d1s->getY() +1); // getting squares for bottom right
Square * o1 = board->getSquare(d1s->getX()+2, d1s->getY() +2);
if ((d2->getSquare() == s) && !o->isOccupied()){ // checking if top right square is occupied
fm = true;
}
if ((d2->getSquare() == s1) && !o1->isOccupied()){ // checking if bottom right square is occupied
fm = true;
}
}
else if (sq1->getX() == 6 && sq1->getX() == 7){
Square * s = board->getSquare(d1s->getX()-1, d1s->getY()-1); // getting squares for top left focred move
Square * o = board->getSquare(d1s->getX()-2, d1s->getY()-2);
Square * s1 = board->getSquare(d1s->getX()+1, d1s->getY() -1); // getting squares for bottom left
Square * o1 = board->getSquare(d1s->getX()+2, d1s->getY() -2);
if ((d2->getSquare() == s) && !o->isOccupied()){ // checking if top right square is occupied
fm = true;
}
if ((d2->getSquare() == s1) && !o1->isOccupied()){ // checking if bottom right square is occupied
fm = true;
}
}
else if (sq1->getX() == 2 && sq1->getX() == 3 && sq1->getX() == 4 && sq1->getX() == 5) { //rest of squares on the row
Square * s = board->getSquare(d1s->getX()+1, d1s->getY()-1); // getting squares for top left focred move
Square * o = board->getSquare(d1s->getX()+2, d1s->getY()-2);
Square * s1 = board->getSquare(d1s->getX()+1, d1s->getY() +1); // getting squares for bottom right
Square * o1 = board->getSquare(d1s->getX()+2, d1s->getY() +2);
Square * s2 = board->getSquare(d1s->getX()-1, d1s->getY() -1); // getting squares for top right
Square * o2 = board->getSquare(d1s->getX()-2, d1s->getY() -2);
Square * s3 = board->getSquare(d1s->getX()-1, d1s->getY() +1); // getting squares for bottom left
Square * o3 = board->getSquare(d1s->getX()-2, d1s->getY() +2);
if ((d2->getSquare() == s) && !o->isOccupied()){ // checking if top left square is occupied
fm = true;
}
if ((d2->getSquare() == s1) && !o1->isOccupied()){ // checking if top right square is occupied
fm = true;
}
if (current->isKing()){
if ((d2->getSquare() == s2) && !o2->isOccupied()){ // checking if bottom left square is occupied
fm = true;
}
}
if (current->isKing()){
if ((d2->getSquare() == s3) && !o3->isOccupied()){ // checking if bottom right square is occupied
fm = true;
}
}
}
}
if (fm) {
forcedMovesp2.push_back(i);
}
}
if (fm){
for (move = forcedMovesp2.begin(); move != forcedMovesp2.end(); ++move){
std::cout << "move" << move<<endl;
if (sq1->getDraught() == move) {
if (sq1->getX()!=dest->getX()+2) {}
else if ((sq1->getY()!=dest->getY()+2) && (sq1->getY()!=dest->getY()-2)) {} // check if move made by player is valid
else if (current->isKing()){
if(sq1->getX()!=dest->getX()-2){}
else
{valid = true;}
}
else {
valid = true;
}
}
}
}
/* END OF FORCED MOVE CHECK
START STANDARD MOVE CHECK*/
if(fm == false){
if (sq1->getX()!=dest->getX()+1){} // Checking condition for P2
else if ((sq1->getY()!=dest->getY()-1) && (sq1->getY()!=dest->getY()+1)){}
else if (current->isKing()){
if (sq1->getX()!=dest->getX()-1){}
else
{valid = true;}
}
else {
valid = true;
}
}
}
if (valid){
Square * s = current->getSquare();
s->setDraught(NULL);
current->setSquare(dest); //Making the move
dest->setDraught(current);
if (cp == 1) //Changing players after the move
{cp = 2;}
else
{cp = 1;}
std::cout << "cp =" << cp<<endl;
std::cout << "fm =" << fm<<endl;
std::cout << "val =" << valid<<endl;
}
else {std::cout << "cp =" << cp<<endl;
std::cout << "fm =" << fm<<endl;
std::cout << "val =" << valid<<endl;
std::cout<<"Illegal Move"<<endl;}
return valid;