[c++] [Programming Challenges] Check The Check

0

Witam,

próbuję rozwiązać zadanie z wyzwań programistycznych i chciałbym was prosić o pomoc w znalezieniu błędu w moim kodzie, a najbardziej mi by zależało na znalezieniu takich danych wejściowych, żeby mój program się pomylił. Link do treści zadania http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110107&format=html

mój kod:

#include <iostream>

using namespace std;

char board[8][8];

enum winner {NO, WHITE, BLACK};

//czy `board` jest pusta?
bool empty()
{
	for (int i=0; i<8; i++)
		for (int j=0; j<8; j++)
			if (board[i][j] != '.')
				return false;

	return true;
}

//wczytuje planszę ze standardowego wejścia
void read()
{
	for (int i=0; i<8; i++)
		for (int j=0; j<8; j++)
			cin>>board[i][j];
}

//wyświetla planszę
void write()
{
	for (int i=0; i<8; i++)
	{
		for (int j=0; j<8; j++)
			cout<<board[i][j];

		cout<<endl;
	}
}

//czy wieża stojąca na 'i' oraz 'j' atakuje króla 'k'?
bool rook(int i, int j, char k)
{
	int x;
	//idę pionowo w dół
	for (x = i + 1; x<8; x++)
	{
		if (board[x][j] != '.')
		{
			if (board[x][j] == k)
				return true;
            else
				return false;
		}
	}


	//idę pionowo w górę
	for (x = i - 1; x>=0; x--)
		if (board[x][j] != '.')
		{
			if (board[x][j] == k)
				return true;
            else
				return false;
		}

	//poziomo w prawo
	for (x = j + 1; x<8; x++)
	{
		if (board[i][x] != '.')
		{
			if (board[i][x] == k)
				return true;
            else
				return false;
		}
	}

	//poziomo w lewo
	for (x = j - 1; x >= 0; x--)
		if (board[i][x] != '.')
		{
			if (board[i][x] == k)
				return true;
            else
				return false;
		}

	return false;
}

//goniec xD
bool bishop(int i, int j, char k)
{
	//w dół i prawo
	int x=1;

	while ((i+x != 8) && (j+x != 8))
	{
		if (board[i+x][j+x] != '.')
		{
			if (board[i+x][j+x] == k)
				return true;
            else
				return false;
		}
		x++;
	}

	//do góry i w lewo
	x = 1;

	while ((i-x >= 0) && (j-x >= 0))
	{
		if (board[i-x][j-x] != '.')
		{
			if (board[i-x][j-x] == k)
				return true;
            else
				return false;
		}
		x++;
	}

	//do góry i w prawo
	x = 1;

	while ((i+x != 8) && (j-x >= 0))
	{
		if (board[i+x][j-x] != '.')
		{
			if (board[i+x][j-x] == k)
				return true;
             else
				return false;
		}
		x++;
	}

	//w dół i w lewo
	x = 1;

	while ((i-x >= 0) && (j+x != 8))
	{
		if (board[i-x][j+x] != '.')
		{
			if (board[i-x][j+x] == k)
				return true;
            else
				return false;
		}
		x++;
	}

	return false;
}

//królowa xD
bool queen (int i, int j, char k)
{
	//połączenie wieży i gońca
	return bishop(i, j, k) || rook(i, j, k) ? true: false;
}

/*skoczek
 *........
 *........
 *..3.5...
 *.1...7..
 *...n....
 *.2...8..
 *..4.6...
 *........
 *
 */

bool knight (int x, int y, char k)
{
	//1
	if ((x-1 >= 0) && (y-2 >= 0))
	{
		if (board[x-1][y-2] == k)
			return true;

	}

	//2
	if ((x+1 < 8) && (y-2 >= 0))
	{
		if (board[x+1][y-2] == k)
			return true;

	}

	//3
	if ((x-2 >= 0) && (y-1 >= 0))
	{
		if (board[x-2][y-1] == k)
			return true;

	}

	//4
	if ((x + 2< 8) && (y-1 >= 0))
	{
		if (board[x+2][y-1] == k)
			return true;


	}

	//5
	if ((x-2 >= 0) && (y+1 < 8))
	{
		if (board[x-2][y+1] == k)
			return true;

	}

	//6
	if ((x+2 < 8) && (y+1 < 8))
	{
		if (board[x+2][y+1] == k)
			return true;

	}

	//7
	if ((x-1 >= 0) && (y+2 < 8))
	{
		if (board[x-1][y+2] == k)
			return true;

	}

	//8
	if ((x+1 < 8) && (y+2 < 8))
	{
		if (board[x+1][y+2] == k)
			return true;

	}

	return false;
}

//pionek
bool pawn (int i, int j, char k)
{
    if (k == 'K')    				//atakujemy w dół (białego króla)
    {
        if (i+1 < 8)
        {
            if (j-1 >= 0)            //atak w dół i lewo
                if (board[i+1][j-1] == k)
                    return true;

            if (j+1 < 8)            //atak w dół i prawo
                if (board[i+1][j+1] == k)
                    return true;

        }
    }
    else//if (k == 'K')              //atak czarnego króla
    {
        if (i-1 >= 0)
        {
            if (j-1 >= 0)            //atak do góry i w lewo
                if (board[i-1][j-1] == k)
                    return true;

            if (i+1 < 8)             //atak do góry i w prawo
                if (board[i-1][j+1] == k)
                    return true;

        }
    }

    return false;
}

//król (nie może być, bo by się równocześnie atakowały i byłyby 2 szachy na raz)
/*bool king(int x, int y, char k)
{

	return false;
}*/

int main()
{
	board[0][0] = 'D';

	winner w ;

	int game = 0;

	while (!empty())
	{
		read();						//wczytuję planszę
		game ++;					//inkrementuję liczbę gier
		w = NO;						//oznaczam, że jak na razie jest remis

		for (int i = 0; i<8; i++)
			for (int j=0; j<8; j++)
			{
				switch (board[i][j])
				{
					case 'p':		//pionek
						if (pawn (i, j, 'K'))
						{
							w = BLACK;
							break;
						}
						break;

					case 'P':
						if (pawn (i, j, 'k'))
						{
							w = WHITE;
							break;
						}
						break;

					case 'r':
						if(rook (i, j, 'K'))
						{
							w = BLACK;
							break;
						}
						break;

					case 'R':
						if (rook (i, j, 'k'))
						{
							w = WHITE;
							break;
						}
						break;

					case 'b':
						if (bishop (i, j, 'K'))
						{
							w = BLACK;
							break;
						}
						break;

					case 'B':
						if (bishop (i, j, 'k'))
						{
							w = WHITE;
							break;
						}
						break;

					case 'q':
						if (queen (i, j, 'K'))
						{
							w = BLACK;
							break;
						}
						break;

					case 'Q':
						if (queen (i, j, 'k'))
						{
							w = WHITE;
							break;
						}
						break;

					case 'n':
						if (knight (i, j, 'K'))
						{
							w = BLACK;
							break;
						}
						break;

					case 'N':
						if (knight (i, j, 'k'))
						{
							w = WHITE;
							break;
						}
						break;
				}
				
				if (w != NO)
					break;
			}

		switch (w)
		{
			case NO:
				if (!empty())
				{
					cout <<"Game #"<<game<<": no king is in check."<<endl;
				}
				break;

			case WHITE:
				cout <<"Game #"<<game<<": black king is in check."<<endl;
				break;

			case BLACK:
				cout <<"Game #"<<game<<": white king is in check."<<endl;
				break;
		}
		
	}//while
}

rozwiązałem już z tej strony kilka zadań, ale tutaj nie mogę znaleźć swojego błędu ;/

0

Hmm?

...k....
........
........
...R....
........
........
...K....
........

Game #4: no king is in check.

0

wielkie dzięki :) znalazłem jeszcze oprócz tego jeden błąd i w końcu otrzymałem upragnione "Solved" xD

1 użytkowników online, w tym zalogowanych: 0, gości: 1