bool Player:: checkWithRules(const int &index, const int &buttonX, const int &buttonY,const bool &playerNr,Pieces *gamePlane[][8]){ Rules regler; return regler.checkRulesForType(pieces ,index, buttonX, buttonY,playerNr,gamePlane); //sedan skall regler kolla regler för pjäsen om den får flytta till buttonX och buttonY //om den får göra det retunera true annars false }
bool Player:: CanIMoveKing(bool lose, Pieces *gamePlane[][8], const bool &playerNr){ int kingX = 0; int kingY = 0; int index = 0; Rules haveILost; getKingsXAndYPos(kingX,kingY); index = getPieceIndexWithValues(kingX,kingY); // om den är innanför spelplanen lose = true; if(kingX+1 < 8){ //kolla om han kan gå dit om if(haveILost.checkRulesForType(pieces,index,kingX+1,kingY,playerNr,gamePlane)){ lose = false; } } if(kingX-1 >= 0){ if(haveILost.checkRulesForType(pieces,index,kingX-1,kingY,playerNr,gamePlane)){ lose = false; } } if(kingY+1 < 8){ if(haveILost.checkRulesForType(pieces,index,kingX,kingY+1,playerNr,gamePlane)){ lose = false; } } if(kingY-1 >= 0){ if(haveILost.checkRulesForType(pieces,index,kingX,kingY-1,playerNr,gamePlane)){ lose = false; } } if(kingX+1 < 8 && kingY < 8){ if(haveILost.checkRulesForType(pieces,index,kingX+1,kingY+1,playerNr,gamePlane)){ lose = false; } } if(kingX+1 < 8 && kingY-1 >= 0){ if(haveILost.checkRulesForType(pieces,index,kingX+1,kingY-1,playerNr,gamePlane)){ lose = false; } } if(kingX-1 >= 0 && kingY+1 < 8){ if(haveILost.checkRulesForType(pieces,index,kingX-1,kingY+1,playerNr,gamePlane)){ lose = false; } } if(kingX-1 >= 0 && kingY-1 >= 0){ if(haveILost.checkRulesForType(pieces,index,kingX-1,kingY-1,playerNr,gamePlane)){ lose = false; } } return lose; }
bool Player:: CanISaveKing(bool lose, Pieces *gamePlane[][8], const bool &playerNr, Player &enemy){ int myKingX; int myKingY; getKingsXAndYPos(myKingX, myKingY); Rules lastTimeToCheck; //dags att kolla typeId på platsen i gamePlane så vi vet hur och vad vi ska kolla om det är ett torn //tex så kan man ta tornet eller ställa sig ivägen skippar att kolla om en bonde gjorde schack drag eftersom //Då kan kungen bara gå och ta den if(typeid(*gamePlane[this->schackedFromX][this->schackedFromY]) == typeid(Tower)){ //om det är ett torn kan någon gå till hans posetion eller någon posetion där imellan för att avbryta schack for(int i = 0; i<16; i++){ bool heCanLose = false; if(pieces[i] != NULL && typeid(pieces[i]) != typeid(King)){ if(lastTimeToCheck.checkRulesForType(pieces,i,this->schackedFromX,this->schackedFromY,playerNr,gamePlane)){ //om någon pjäs kan gå till pjäsens posetion som gjorde schackdraget så är det inte lose pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanLose = true; //return false; } else{ //annars kolla om någon pjäs kan gå imellan sin egen kung och andra spelarens torn if(myKingX < this->schackedFromX){ //så om min kungs x och y värde är mindre än enemy tornets x och y värden //Dvs att tornet går nerifrån och upp for(int j = myKingX+1; j<this->schackedFromX; j++){//kolar alla steg från kungens X+1 upp till tornets X-1 // om en pjäs kan gå mellan kungens x värde eller tornetsX värde så lose = false; if(lastTimeToCheck.checkRulesForType(pieces, i,j,myKingY,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanLose = true; //return false; } } } if(myKingX > this->schackedFromX){ for(int j = myKingX-1; j>this->schackedFromX; j--){//kolar alla steg från kungens X-1 upp till tornets X-1 // om en pjäs kan gå mellan kungens x värde eller tornetsX värde så lose = false; if(lastTimeToCheck.checkRulesForType(pieces, i,j,myKingY,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanLose = true; //return false; } } } if(myKingY < this->schackedFromY){ for(int j = myKingY+1; j<this->schackedFromY; j++){//kolar alla steg från kungens y+1 upp till tornets X-1 // om en pjäs kan gå mellan kungens x värde eller tornetsX värde så lose = false; if(lastTimeToCheck.checkRulesForType(pieces, i,myKingX,j,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanLose = true; //return false; } } } if(myKingY > this->schackedFromY){ for(int j = myKingY-1; j>this->schackedFromY; j--){//kolar alla steg från kungens y-1 upp till tornets X-1 // om en pjäs kan gå mellan kungens x värde eller tornetsX värde så lose = false; if(lastTimeToCheck.checkRulesForType(pieces, i,myKingX,j,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanLose = true; //return false; } } } if(heCanLose != true && typeid(pieces[i]) != typeid(King)){ lose = true;//om man inte lyckas rädda kungen om ett torn satte dig i shack lose = true pieces[i]->setRestrictMovment(false);//då kan denna pjäs röra på sig } } } else{ lose = true; } } for(int i=0; i<16; i++){ if(pieces[i] != NULL){ if(pieces[i]->isItRestrictedOrNot()){ return false; } } } return lose; } else if(typeid(*gamePlane[this->schackedFromX][this->schackedFromY]) == typeid(Horse)){ for(int i = 0; i<16; i++){ if(pieces[i] != NULL && typeid(pieces[i]) != typeid(King)){ if(lastTimeToCheck.checkRulesForType(pieces,i,this->schackedFromX,this->schackedFromY,playerNr,gamePlane)){ //om någon pjäs kan gå till pjäsens posetion som gjorde schackdraget så är det inte lose pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig //return false; } else{ lose = true; pieces[i]->setRestrictMovment(false);//då kan denna pjäs röra på sig } } else{ lose = true; } } for(int i=0; i<16; i++){ if(pieces[i] != NULL){ if(pieces[i]->isItRestrictedOrNot()){ return false; } } } return lose; } else if(typeid(*gamePlane[this->schackedFromX][this->schackedFromY]) == typeid(Bishop)){ for(int i = 0; i<16; i++){ bool heCanMove = false; if(pieces[i] != NULL && typeid(pieces[i]) != typeid(King)){ if(lastTimeToCheck.checkRulesForType(pieces,i,this->schackedFromX,this->schackedFromY,playerNr,gamePlane)){ //om någon pjäs kan gå till pjäsens posetion som gjorde schackdraget så är det inte lose pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } else{ if(myKingX > this->schackedFromX && myKingY > this->schackedFromY){ // <--------- och upp i spelplanen int y = myKingY-1; for(int j = myKingX-1; j>schackedFromX; j--){ if(lastTimeToCheck.checkRulesForType(pieces,i,j,y,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } y--; } } if(myKingX > this->schackedFromX && myKingY < this->schackedFromY){ //<---------- ner i spelplanen int y = myKingY+1; for(int j = myKingX-1; j>schackedFromX; j--){ if(lastTimeToCheck.checkRulesForType(pieces,i,j,y,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } y++; } } if(myKingX < this->schackedFromX && myKingY > this->schackedFromY){ //-----------> och upp i spelplanen int y = myKingY-1; for(int j = myKingX+1; j<schackedFromX; j++){ if(lastTimeToCheck.checkRulesForType(pieces,i,j,y,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } y--; } } if(myKingX < this->schackedFromX && myKingY < this->schackedFromY){ //-----------> och ner i spelplanen int y = myKingY+1; for(int j = myKingX+1; j<schackedFromX; j++){ if(lastTimeToCheck.checkRulesForType(pieces,i,j,y,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } y++; } } if(heCanMove != true && typeid(pieces[i]) != typeid(King)) lose = true; pieces[i]->setRestrictMovment(false);//då kan denna pjäs röra på sig } }//if NULL else{ lose = true; } }//for for(int i=0; i<16; i++){ if(pieces[i] != NULL){ if(pieces[i]->isItRestrictedOrNot()){ return false; } } } return lose; } else if(typeid(*gamePlane[this->schackedFromX][this->schackedFromY]) == typeid(Queen)){ for(int i = 0; i<16; i++){ bool heCanMove = false; if(pieces[i] != NULL && typeid(pieces[i]) != typeid(King)){ if(lastTimeToCheck.checkRulesForType(pieces,i,this->schackedFromX,this->schackedFromY,playerNr,gamePlane)){ //om någon pjäs kan gå till pjäsens posetion som gjorde schackdraget så är det inte lose pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } else{ if(myKingX < this->schackedFromX){ //så om min kungs x och y värde är mindre än enemy tornets x och y värden //Dvs att tornet går nerifrån och upp for(int j = myKingX+1; j<this->schackedFromX; j++){//kolar alla steg från kungens X+1 upp till tornets X-1 // om en pjäs kan gå mellan kungens x värde eller tornetsX värde så lose = false; if(lastTimeToCheck.checkRulesForType(pieces, i,j,myKingY,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } } } if(myKingX > this->schackedFromX){ for(int j = myKingX-1; j>this->schackedFromX; j--){//kolar alla steg från kungens X-1 upp till tornets X-1 // om en pjäs kan gå mellan kungens x värde eller tornetsX värde så lose = false; if(lastTimeToCheck.checkRulesForType(pieces, i,j,myKingY,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } } } if(myKingY < this->schackedFromY){ for(int j = myKingY+1; j<this->schackedFromY; j++){//kolar alla steg från kungens y+1 upp till tornets X-1 // om en pjäs kan gå mellan kungens x värde eller tornetsX värde så lose = false; if(lastTimeToCheck.checkRulesForType(pieces, i,myKingX,j,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } } } if(myKingY > this->schackedFromY){ for(int j = myKingY-1; j>this->schackedFromY; j--){//kolar alla steg från kungens y-1 upp till tornets X-1 // om en pjäs kan gå mellan kungens x värde eller tornetsX värde så lose = false; if(lastTimeToCheck.checkRulesForType(pieces, i,myKingX,j,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } } } if(myKingX > this->schackedFromX && myKingY > this->schackedFromY){ // <--------- och upp i spelplanen int y = myKingY-1; for(int j = myKingX-1; j>schackedFromX; j--){ if(lastTimeToCheck.checkRulesForType(pieces,i,j,y,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } y--; } } if(myKingX > this->schackedFromX && myKingY < this->schackedFromY){ //<---------- ner i spelplanen int y = myKingY+1; for(int j = myKingX-1; j>schackedFromX; j--){ if(lastTimeToCheck.checkRulesForType(pieces,i,j,y,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } y++; } } if(myKingX < this->schackedFromX && myKingY > this->schackedFromY){ //-----------> och upp i spelplanen int y = myKingY-1; for(int j = myKingX+1; j<schackedFromX; j++){ if(lastTimeToCheck.checkRulesForType(pieces,i,j,y,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } y--; } } if(myKingX < this->schackedFromX && myKingY < this->schackedFromY){ //-----------> och ner i spelplanen int y = myKingY+1; for(int j = myKingX+1; j<schackedFromX; j++){ if(lastTimeToCheck.checkRulesForType(pieces,i,j,y,playerNr,gamePlane)){ pieces[i]->setRestrictMovment(true);//då kan denna pjäs röra på sig heCanMove = true; //return false; } y++; } } if(heCanMove != true && typeid(pieces[i]) != typeid(King)){ pieces[i]->setRestrictMovment(false);//då kan denna pjäs röra på sig lose = true; } }//else } else{ lose = true; } }//for for(int i=0; i<16; i++){ if(pieces[i] != NULL){ if(pieces[i]->isItRestrictedOrNot()){ return false; } } } return lose; }//queen else{ for(int i=0; i<16; i++){ if(pieces[i] != NULL){ if(pieces[i]->isItRestrictedOrNot()){ return false; } } } lose = true; return lose; } }