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;
    }
}