Я пытаюсь написать функцию, которая проверяет, находится ли черный король под шахом белой ладьей. Проблема возникает, когда я пытаюсь найти фигуры между ладьей и королем.
void rook_white(piece A[]) // does WR check BK
{
cout << "Found White Rook ";
int k_x; // BK'S x coordinate
int k_y; // BK's y coordinate
bool check = false;
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if(A[t_i].field[m_x-x][m_y] == 'k') // Moving Left
{
k_x=m_x;
k_y=m_y;
goto al_1;
}
}
}
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if(A[t_i].field[m_x+x][m_y] == 'k') // Moving Right
{
k_x=m_x;
k_y=m_y;
goto al_2;
}
}
}
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if(A[t_i].field[m_x][m_y-y] == 'k') // Moving Up
{
k_x=m_x;
k_y=m_y;
goto al_3;
}
}
}
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if(A[t_i].field[m_x][m_y+y] == 'k') // Moving Down
{
k_x=m_x;
k_y=m_y;
goto al_4;
}
}
}
al_1:
for(int x=0; x<k_x; x++)
{
for(int y=0; y<k_y; y++)
{
if(!A[t_i].field[m_x-x][m_y] == '*') // Checking left
{
goto loop_exit;
}
}
}
al_2:
for(int x=0; x<k_x; x++)
{
for(int y=0; y<k_y; y++)
{
if(!A[t_i].field[m_x+x][m_y] == '*') // Checking Right
{
goto loop_exit;
}
}
}
al_3:
for(int x=0; x<k_x; x++)
{
for(int y=0; y<k_y; y++)
{
if(!A[t_i].field[m_x][m_y-y] == '*') // Checking Up
{
goto loop_exit;
}
}
}
al_4:
for(int x=0; x<k_x; x++)
{
for(int y=0; y<k_y; y++)
{
if(!A[t_i].field[m_x][m_y+y] == '*') // Checking Down
{
goto loop_exit;
}
}
}
loop_exit:
check = false;
if (check == true)
{
ofstream fr(FVR,ios::app);
fr << "Black is in check by rook " << t_i << endl;
}
}
Функция ищет, где находится король по осям x и y. Затем он переходит к определенному алгоритму (al_1, al_2, ...), в котором он ищет, есть ли что-то между королем и ладьей.
Входной файл что-то вроде этого:
********
***k****
********
***q****
********
********
***R****
********
это не должно ничего выводить, а
********
***k****
********
********
********
********
***R****
********
должен вывести "Черные под шахом ладьей". (t_i — номер доски, на которой он проверяется)
A[t_i] представляет собой массив структур, части структуры состоят из char field[8][8].
Я использую структуру, потому что мне нужно изучить неограниченное количество досок.
k_x и k_y — координаты короля. m_x и m_y — глобальные переменные, которые передаются из функции поиска, в которой найден кусок
вот сама программа с int main()
#include <iostream>
#include <fstream> // chess
#include <cstdlib>
using namespace std; // PROGRAM CHECKS FOR CHESS CHEKS
const char FVD[]="5_input.txt"; // **************************************************
const char FVR[]="5_output.txt"; // P - white pawn (WP) p - black pawn (BP)
//--- // R - white rook (WR) r - black rook (BR)
//--- // B - white bishop (WB) b - black bishop (BB)
int m_i=0; // max i // N - white knight (WN) n - black knight (BN)
int m_x=0; // // Q - white queen (WQ) q - black queen (BQ)
int m_y=0; // // K - white king (WK) k - black king (BK)
int t_i=0; // // **************************************************
struct piece
{
char field[8][8];
};
void read(piece A[])
{
ifstream fd(FVD);
int i=0;
m_i=0;
while(!fd.eof())
{
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
fd >> A[i].field[x][y];
}
}
fd.ignore();
i++;
m_i=i;
}
fd.close();
}
/// ----------------------------------------------BLACK KING IS IN CHECK--------------------------------------------------------------
void rook_white(piece A[]) // does WR check BK
{
cout << "Found White Rook ";
int k_x; // BK'S x coordinate
int k_y; // BK's y coordinate
bool check = false;
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if(A[t_i].field[m_x-x][m_y] == 'k') // Moving Left
{
k_x=m_x;
k_y=m_y;
goto al_1;
}
}
}
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if(A[t_i].field[m_x+x][m_y] == 'k') // Moving Right
{
k_x=m_x;
k_y=m_y;
goto al_2;
}
}
}
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if(A[t_i].field[m_x][m_y-y] == 'k') // Moving Up
{
k_x=m_x;
k_y=m_y;
goto al_3;
}
}
}
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if(A[t_i].field[m_x][m_y+y] == 'k') // Moving Down
{
k_x=m_x;
k_y=m_y;
goto al_4;
}
}
}
al_1:
for(int x=0; x<k_x; x++)
{
for(int y=0; y<k_y; y++)
{
if(!A[t_i].field[m_x-x][m_y] == '*') // Checking left
{
goto loop_exit;
}
}
}
al_2:
for(int x=0; x<k_x; x++)
{
for(int y=0; y<k_y; y++)
{
if(!A[t_i].field[m_x+x][m_y] == '*') // Checking Right
{
goto loop_exit;
}
}
}
al_3:
for(int x=0; x<k_x; x++)
{
for(int y=0; y<k_y; y++)
{
if(!A[t_i].field[m_x][m_y-y] == '*') // Checking Up
{
goto loop_exit;
}
}
}
al_4:
for(int x=0; x<k_x; x++)
{
for(int y=0; y<k_y; y++)
{
if(!A[t_i].field[m_x][m_y+y] == '*') // Checking Down
{
goto loop_exit;
}
}
}
loop_exit:
check = false;
if (check == true)
{
ofstream fr(FVR,ios::app);
fr << "Black is in check by rook " << t_i << endl;
}
}
///-----------------------------------------SEARCHING FOR THE CHECKS // CALLING FUNCTIONS --------------------------------------------
void search(piece A[]) // searches for piece and calls a function related to it
{
for(int i=0; i<m_i-1; i++)
{
for(int x=0; x<8; x++)
{
for(int y=0; y<8; y++)
{
if (A[i].field[x][y]=='R')
{
t_i=i;
m_x=x;
m_y=y;
rook_white(A);
}
}
}
}
}
int main()
{
piece A[10];
remove(FVR); // clears the output before inputting new data because of ios::app
read(A);
search(A);
ofstream fr(FVR);
fr << "Done";
return 0;
}
goto
... почему? Кроме того, эта функция не компилируется (не объявленыt_i
,m_x
,m_y
и, возможно, больше), и в ней отсутствуетmain()
, поэтому мы не можем воспроизвести проблему. Вы даже не сказали нам, что такое наблюдаемый результат, только ожидаемый результат. Я не вижу там никакого отладочного вывода, который мог бы помочь вам определить, где фактическая обработка отличается от того, что вы ожидаете. - person DevSolar   schedule 22.10.2015int main()
, пытаясь понять, как заполнитьpiece A[]
, чтобы посмотреть, что происходит. Если вы разместили минимальный, полный, проверяемый пример (который является проверенным временем методом отладки при попытке самостоятельно выяснить проблему ), я бы, наверное, уже написал ответ... - person DevSolar   schedule 22.10.2015int main()
как вы запросили - person   schedule 22.10.2015+x
или-x
в индексе. Однако, если вы не найдете кусок в этом направлении (поэтому нет перехода к loop_exit), вы провалитесь до следующего теста. - person Bo Persson   schedule 22.10.2015al_1:
и ниже это похоже наswitch
-оператор безbreak
. - person Bo Persson   schedule 22.10.2015switch
, но я просто не понимаю их и не могу понять, как написать их какswitch
. Что касается копий шахматной доски, я думаю, что да - доска не меняется между функциями при поиске K. Поэтому я использую глобальные переменныеm_x
,k_x
, ... - person   schedule 22.10.2015switch
-операторе вы используетеbreak
для выхода, чтобы он не переходил к следующей альтернативе. Для вас это означает, что еслиal_1:
ничего не находит, он продолжает сal_2
,al_3
иal_4
. Может быть, не то, что вы хотели? Еще одна важная вещь, которую я вижу сейчас, это то, что сразу послеloop_exit:
вы всегда устанавливаетеcheck = false
. - person Bo Persson   schedule 22.10.2015al_1
,al_2
и так далее. Итак, как мне обойтиloop_exit:
? Мне все еще нужно проверить, является лиcheck
true
илиfalse
, а затем вывести его. Прямо сейчас это даже ничего не значит, я думаю, учитывая, что оно всегда устанавливаетcheck = false
... как я могу обойти эту проблему? - person   schedule 22.10.2015goto al_
... - person   schedule 22.10.2015goto
в C++. (continue
попадает в ту же категорию, аbreak
не входит вcase
.) Если вы когда-либо делали NSD-диаграммы потока управления функцией, вы знаете почему. Я знаю, что есть и другие мнения, и я соглашусь сgoto
в руках настоящего эксперта, рассматривающего довольно частный случай, но обычно люди, использующиеgoto
, не являются ни тем, ни другим (экспертами или рассматривающими особый случай). ;-) - person DevSolar   schedule 22.10.2015