help in rook movement in chess

Discussion in 'C++' started by learner guy, Dec 4, 2011.

  1. learner guy

    learner guy New Member

    Joined:
    Aug 2, 2011
    Messages:
    8
    Likes Received:
    0
    Trophy Points:
    0
    hi i am making my rook move with the help of validRook() and rookMove() functions..
    i have placed validRook inside rookMove so that it is only executed when validRook return s true..

    plz see if my validRook algorithm is correct(Note: this is phase 1 of my game and i just wand the rook to move if and only if all vertical path is clear (no killing yet and no horizontal movement yet ))
    plz ask questions to clarify yourself and also ignore the other functions for movement of other pieces ,they are commented


    Code:
    #include <iostream>
    #include <stdlib.h>
    #include <cmath>
    #include <sstream>
    
    
    using namespace std;
    
    
    void printBoard(char board[8][8],int a[],int i,int j);
    bool getMove(int arr[],char sr,int sc,char dr,int dc);
    bool emptySource(char a[][8],int arr[],int & i,int & j);
    bool emptyDestiny(char a[][8],int arr[],int & i,int & j);
    //movements
    void rookMove(char board[8][8],int a[],bool rook);
    void nightMove(char board[8][8],int a[]);
    void bishopMove(char board[8][8],int a[]);
    void kingMove(char board[8][8],int a[]);
    void queenMove(char board[8][8],int a[]);
    void pawnMove(char board[8][8],int a[]);
    //cheks on movements
    bool validRook(char board[][8],int a[],int i);
    
    
    void main (){
    
        char sr='0',dr='0';
    	int sc=0,dc=0;
    	int n=4;
    	char again;
    	int move[4]={sr,sc,dr,dc};
    	bool ok =false;
    	int row=0;int col=0;
        char board[8][8]={
    	{'R','N','B','Q','K','B','N','R' },
        {'P','P','P','P','R','P','P','R' },
    	{' ','R',' ',' ',' ',' ',' ',' ' },
    	{' ',' ',' ',' ',' ',' ',' ',' ' },
        {' ',' ',' ',' ',' ',' ',' ',' ' },
        {' ','R',' ',' ',' ',' ',' ',' ' },
    	{'p','p','p','p','p','p','p','p' },
    	{'r','n','b','q','k','b','n','r' } 
        };
    
    	
    	printBoard(board,move,row,col);
    	cout << endl;
    
    	do{
        tryAgain: 
    	cout << endl;
    	cout <<"Enter source coordinates      :"  ;
    	cin >> sr;
    	cout << "&   ";
    	cin >> sc;
    
    	cout <<"Enter destination coordinates :" ;
    	cin >> dr;
    	cout << "&   ";
    	cin >> dc;
    	
    	getMove( move, sr, sc, dr, dc);
    	emptySource(board,move,row,col);
    	emptyDestiny(board,move,row,col);
    	bool hi = getMove( move, sr, sc, dr, dc);
    	bool bi = emptySource(board,move,row,col);
    	bool di = emptyDestiny(board,move,row,col);
    	
    	cout << endl;
    	if(hi == true && bi == true && di == true ){
    	ok = true;
    	}else{
    	ok=false;
    	}
    
    	if(ok==true){
    		int k=move[0];
    		bool rook = validRook(board,move,k);
    		 rookMove(board,move,rook);	
    		 // nightMove( board,move);
    		 //bishopMove(board,move);
    		 //kingMove(board,move);
    		 //queenMove(board,move);
    		 //pawnMove(board,move);
    		 cout << "\n\n";
       printBoard(board,move,row,col);
       cout << "\n";
        
    	
    	goto tryAgain; 
    	
    	}else if(ok==false) {
    	cout << "Oops u messed that up !Input r to retry:";
    	cin>>again;
    	//system("cls");
    	}
    	cout << endl;
    	}while(again=='r' || again=='R');	
    	
    }	
    	 
    
    
    
    void printBoard(char board[8][8],int a[],int i,int j){
    
    	char l;
    	cout << "   ";
    	for(int n=1;n<9;n++){
    	
    	cout <<" " << n<< "  ";
    
    	}
    	cout << endl;cout << endl;
    	for( i=0,l=65 ;i<8,l<=72;i++,l++){
    		cout << l << ":" << " ";
    	  for( j=0;j<8;j++){
    		 cout << " " << board[i][j]  << '|' << " ";
    		 
    
    	  }
    	  cout << endl ;
    	   cout << "   _______________________________";
    	   cout << endl ;
    	}
    
    	 
    }
    
    bool getMove(int arr[],char sr,int sc,char dr,int dc){
    
    
    	sr=toupper((unsigned char)sr);//capitalize char coordinates
    	dr=toupper((unsigned char)dr);
    	
    	 if ((sr < 'A' || sr > 'H') ||//source is in range
            (sc < 1 || sc > 8))
        {
            cout << "source out of range\n";
    		return false;
    	 }
    	 if((dr < 'A' || dr > 'H') ||//destiny is in range
            (dc < 1 || dc > 8)){
    	 
    	 cout << "destiny out of range\n";
    		return false;
    	 
    	 }
    	 int x=sr-'A';
    	 int z=dr-'A';
    	arr[0]=x;//get ascii of rows 
    	arr[1]=sc-1;//get index started from 0
    	arr[2]=z;
    	arr[3]=dc-1;
    	
    	if (arr[0]==arr[2] && arr[1]==arr[3]){//sourcebox and destinationbox are same
    	
    	 cout << "source and destiantion are same\n";
    		return false;
    	
    	}
    	return true;
    
    }
    
    bool  emptySource(char a[][8],int arr[],int & i,int & j){
    	
     
    	 i=arr[0];  
    	j=arr[1] ;  
    
    	if (a[i][j] != ' ') 
    	{//source must be filled
    		return true;
    	
    	}else if (a[i][j] == ' ')
    	{
    	 cout << "Source must be filled \n";
    	 return false;
    	}else  {
    	return false;}
    	
    	     
    
    }
    bool  emptyDestiny(char a[][8],int arr[],int & i,int & j){
    	
     
    	 i=arr[2];  
    	j=arr[3] ;  
    
    	if (a[i][j] == ' ') 
    	
    {//source must be filled
    		return true;
    	
    	}else if (a[i][j] != ' ')
    	{
    	 cout << "Destiny must be empty\n";
    	 return false;
    	}else {
    	return false;
    	}
    	
    }
    
    
    void rookMove(char board[8][8],int a[],bool rook){
    	
    	
    	if(board[a[0]][a[1]] =='R' &&   rook == true){
        board[a[0]][a[1]] =' ';
    	 board[a[2]][a[3]] ='R';
    	}
    	
    
    }
    
    
    void nightMove(char board[8][8],int a[]){
    
    	if(board[a[0]][a[1]] =='N'){
        board[a[0]][a[1]] =' ';
    	 board[a[2]][a[3]] ='N';
    	}
    	
    
    }
    
    
    void bishopMove(char board[8][8],int a[]){
    
    	if(board[a[0]][a[1]] =='B'){
        board[a[0]][a[1]] =' ';
    	 board[a[2]][a[3]] ='B';
    	}
    	
    
    }
    
    void kingMove(char board[8][8],int a[]){
    
    	if(board[a[0]][a[1]] =='K'){
        board[a[0]][a[1]] =' ';
    	 board[a[2]][a[3]] ='K';
    	}
    	
    
    }
    
    void queenMove(char board[8][8],int a[]){
    
    	if(board[a[0]][a[1]] =='Q'){
        board[a[0]][a[1]] =' ';
    	 board[a[2]][a[3]] ='Q';
    	}
    	
    
    }
    
    
    void pawnMove(char board[8][8],int a[]){
    
    	if(board[a[0]][a[1]] =='P'){
        board[a[0]][a[1]] =' ';
    	 board[a[2]][a[3]] ='P';
    	}
    	
    
    }
    
    bool validRook(char board[][8],int a[],int i){
    
    	if(a[0]<a[2]){
    
            for( i=a[0];i<a[2]; i++){
    	
    		    if(board[i][a[1]] != ' '){
    		    return false;
    		    }else{
    		    return true;
    		    }
           }
    	}else if (a[0]>=a[2]){
    		for( i=a[0];i>a[2]; i--){
    	    if(board[i][a[1]] != ' '){
    		return false;
    		}else
    		{
    			cout << "destiny is biggerrrrrrrrrrrrrrrrrrrrrr";
    		return true;
    		}
            }
    	}else{
    		cout << "source is biggerrrrrrrrrrrrrrrrrrrrrr";
    	return false;
    	}
    	
    
    	
    }
     
  2. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,009
    Likes Received:
    203
    Trophy Points:
    63
    Occupation:
    Senior Support Engineer
    Location:
    England
    300 lines is rather a lot of code to look through just to "see if my validRook algorithm is correct".

    Does it return the correct values in all scenarios you've tested? If so then it's correct (as far as the testing goes). If not then it isn't.

    So what, if any, problems are there with your code?
     
  3. learner guy

    learner guy New Member

    Joined:
    Aug 2, 2011
    Messages:
    8
    Likes Received:
    0
    Trophy Points:
    0
    Now i have removed all unnecessary functions ..plz check validRook() and rookMove() funciton..my algorithm is that i have put validRook() inside rookMove() ...rookMove() will work only when it gets a "true" return from validRook()..
    so majorly plz check validRook()
    the idea i have tried to implement is that i have created an array of size 4 which stores source and destination coordinates..
    now as far as the board is empty going upward or downward the function should return true
    (Note: this is phase 1 of my game and i just wand the rook to move if and only if all vertical path is clear (no killing yet and no horizontal movement yet ))

    Code:
    #include <iostream>
    #include <stdlib.h>
    #include <cmath>
    #include <sstream>
    
    
    using namespace std;
    
    
    void printBoard(char board[8][8],int a[],int i,int j);
    bool getMove(int arr[],char sr,int sc,char dr,int dc);
    bool emptySource(char a[][8],int arr[],int & i,int & j);
    bool emptyDestiny(char a[][8],int arr[],int & i,int & j);
    //movements
    void rookMove(char board[8][8],int a[],bool rook);
    
    //cheks on movements
    bool validRook(char board[][8],int a[],int i);
    
    
    void main (){
    
        char sr='0',dr='0';
    	int sc=0,dc=0;
    	int n=4;
    	char again;
    	int move[4]={sr,sc,dr,dc};
    	bool ok =false;
    	int row=0;int col=0;
        char board[8][8]={
    	{'R','N','B','Q','K','B','N','R' },
        {'P','P','P','P','R','P','P','R' },
    	{' ','R',' ',' ',' ',' ',' ',' ' },
    	{' ',' ',' ',' ',' ',' ',' ',' ' },
        {' ',' ',' ',' ',' ',' ',' ',' ' },
        {' ','R',' ',' ',' ',' ',' ',' ' },
    	{'p','p','p','p','p','p','p','p' },
    	{'r','n','b','q','k','b','n','r' } 
        };
    
    	
    	printBoard(board,move,row,col);
    	cout << endl;
    
    	do{
        tryAgain: 
    	cout << endl;
    	cout <<"Enter source coordinates      :"  ;
    	cin >> sr;
    	cout << "&   ";
    	cin >> sc;
    
    	cout <<"Enter destination coordinates :" ;
    	cin >> dr;
    	cout << "&   ";
    	cin >> dc;
    	
    	getMove( move, sr, sc, dr, dc);
    	emptySource(board,move,row,col);
    	emptyDestiny(board,move,row,col);
    	bool hi = getMove( move, sr, sc, dr, dc);
    	bool bi = emptySource(board,move,row,col);
    	bool di = emptyDestiny(board,move,row,col);
    	
    	cout << endl;
    	if(hi == true && bi == true && di == true ){
    	ok = true;
    	}else{
    	ok=false;
    	}
    
    	if(ok==true){
    		int k=move[0];
    		bool rook = validRook(board,move,k);
    		rookMove(board,move,rook);	
    		 
    		 cout << "\n\n";
       printBoard(board,move,row,col);
       cout << "\n";
        
    	
    	goto tryAgain; 
    	
    	}else if(ok==false) {
    	cout << "Oops u messed that up !Input r to retry:";
    	cin>>again;
    	//system("cls");
    	}
    	cout << endl;
    	}while(again=='r' || again=='R');	
    	
    }	
    	 
    
    
    
    void printBoard(char board[8][8],int a[],int i,int j){
    
    	char l;
    	cout << "   ";
    	for(int n=1;n<9;n++){
    	
    	cout <<" " << n<< "  ";
    
    	}
    	cout << endl;cout << endl;
    	for( i=0,l=65 ;i<8,l<=72;i++,l++){
    		cout << l << ":" << " ";
    	  for( j=0;j<8;j++){
    		 cout << " " << board[i][j]  << '|' << " ";
    		 
    
    	  }
    	  cout << endl ;
    	   cout << "   _______________________________";
    	   cout << endl ;
    	}
    
    	 
    }
    
    bool getMove(int arr[],char sr,int sc,char dr,int dc){
    
    
    	sr=toupper((unsigned char)sr);//capitalize char coordinates
    	dr=toupper((unsigned char)dr);
    	
    	 if ((sr < 'A' || sr > 'H') ||//source is in range
            (sc < 1 || sc > 8))
        {
            cout << "source out of range\n";
    		return false;
    	 }
    	 if((dr < 'A' || dr > 'H') ||//destiny is in range
            (dc < 1 || dc > 8)){
    	 
    	 cout << "destiny out of range\n";
    		return false;
    	 
    	 }
    	 int x=sr-'A';
    	 int z=dr-'A';
    	arr[0]=x;//get ascii of rows 
    	arr[1]=sc-1;//get index started from 0
    	arr[2]=z;
    	arr[3]=dc-1;
    	
    	if (arr[0]==arr[2] && arr[1]==arr[3]){//sourcebox and destinationbox are same
    	
    	 cout << "source and destiantion are same\n";
    		return false;
    	
    	}
    	return true;
    
    }
    
    
    
    
    void rookMove(char board[8][8],int a[],bool rook){
    	
    	
    	if(board[a[0]][a[1]] =='R' &&   rook == true){
        board[a[0]][a[1]] =' ';
    	 board[a[2]][a[3]] ='R';
    	}
    	
    
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    bool validRook(char board[][8],int a[],int i){
    
    	if(a[0]<a[2]){
    
            for( i=a[0];i<a[2]; i++){
    	
    		    if(board[i][a[1]] != ' '){
    		    return false;
    		    }else{
    		    return true;
    		    }
           }
    	}else if (a[0]>=a[2]){
    		for( i=a[0];i>a[2]; i--){
    	    if(board[i][a[1]] != ' '){
    		return false;
    		}else
    		{
    			cout << "destiny is biggerrrrrrrrrrrrrrrrrrrrrr";
    		return true;
    		}
            }
    	}else{
    		cout << "source is biggerrrrrrrrrrrrrrrrrrrrrr";
    	return false;
    	}
    	
    
    	
    }
     
  4. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,009
    Likes Received:
    203
    Trophy Points:
    63
    Occupation:
    Senior Support Engineer
    Location:
    England
    Your code would be a lot easier to understand if it was indented correctly. Sure, YOU know what's going on, but nobody else does. So write your code like this in future:

    Code:
    bool validRook(char board[][8],int a[],int i)
    {
    	if(a[0]<a[2])
    	{
    		for( i=a[0];i<a[2]; i++) // really from a[0]?
    		{
    			if(board[i][a[1]] != ' ') // a[1]????
    			{
    				return false;
    			}
    			else
    			{
    				return true; // Are you sure this should be here?
    			}
    		}
    	}
    	else if (a[0]>=a[2])
    	{
    		for( i=a[0];i>a[2]; i--)
    		{
    			if(board[i][a[1]] != ' ') // a[1]????
    			{
    				return false;
    			}
    			else
    			{
    				// Why is this here?  Seems like the "wrong message" - the error should be*
    				cout << "destiny is biggerrrrrrrrrrrrrrrrrrrrrr";
    				return true;
    			}
    		}
    	}
    	else
    	{
    		cout << "source is biggerrrrrrrrrrrrrrrrrrrrrr";
    		return false;
    	}
    }
    
    *something like "can't make that move - there's a piece in the way".

    Since all you're checking for is spaces between a[0] and a[2], to avoid duplication you could loop from the smaller of those two, to the larger. Then you don't need to duplicate code.

    The "return true" commented on will return true at the first space you encounter. So "R N x" where x is the destination will return TRUE because of the space just after the R.

    Do not substitute posting your code on a forum and asking "plz check it" for testing. You could have discovered the obvious errors in the code with just a small amount of testing.
     
    learner guy likes this.
  5. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,009
    Likes Received:
    203
    Trophy Points:
    63
    Occupation:
    Senior Support Engineer
    Location:
    England
    note tabs don't need to be 8 columns; that's the site's choice. 4 spaces is my preference (either use spaces, or set your editor's tab width to 4)., but you could use 3 or 2. I find indenting tends to get undecipherable at 2 though.
     
  6. xpi0t0s

    xpi0t0s Mentor

    Joined:
    Aug 6, 2004
    Messages:
    3,009
    Likes Received:
    203
    Trophy Points:
    63
    Occupation:
    Senior Support Engineer
    Location:
    England
    Code:
    // a[1]????
    
    On second thoughts that could be correct. Try using m v n i o a s l - and if you don't have a clue what I'm saying there, that's the point. Meaningful variable names instead of a single letter.
     
  7. learner guy

    learner guy New Member

    Joined:
    Aug 2, 2011
    Messages:
    8
    Likes Received:
    0
    Trophy Points:
    0
    thanks a lot for ur reply :)
    your suggestion works
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice