No nie, to się wywali, tak robic nie możesz. Zrób osobną funkcje isMoveValid()
która zwraca 0 lub 1 w zależności od poprawności ruchu i wypisuje komunikat błędu i potem robisz:
do{
//wczytanie danych
while(!isMoveValid());
btw to: if (b=d)
jest błąd, i to if (a=c)
też, bo to nie jest porównanie tylko przypisanie nowej wartości! I tak samo to:
abs(65-int(x))==b; // Konwersja char na int o wartości odpowiadającej potrzebnemu indeksowi tablicy.
abs(65-int(y))==d;
nie ma żadnego sensu bo robisz porównanie a potem nigdzie tego nie zapisujesz. Nie chciałęś tam robić b = cośtam
?
No właśnie pętla do while, tylko co wpisać w środku odnośnie sprawdzenia warunku. Pętla wykona się raz bez sprawdzenia warunków, jak wziąć je pod uwagę w tym jednym przypadku? Na ten moment mam coś takiego:
void pola(){
char x, y;
int a, b, c, d;
do{
cout << "Wprowadz pole poczatkowe (A-H enter, 1-8 enter):" << endl;
cin >> x >> a;
cout << "Wprowadz pole koncowe (A-H enter, 1-8 enter)" << endl;
cin >> y >> c;
abs(65-int(x))=b; // Konwersja char na int o wartości odpowiadającej potrzebnemu indeksowi tablicy.
abs(65-int(y))=d;
a=abs(8-a); // Konwersja numeru rzędu na odpowiedni indeks tablicy.
c=abs(8-c);
poprawnosc();
}
while(!poprawnosc());
}
int poprawnosc(){
if (warunki()==1)
return 0;
return 1;
}
int warunki(int a, int b, int c, int d){
if (a!=c && b!=d){ //Sprawdza czy zostały zmienione jednoczesnie wartości indeksów pionowych i poziomych.
cout << "Ruch po ukosie! Wybierz inne pole." << endl;
return 1;
}
if (T[a][b].wartosc==0){
cout << "Pole z ktorego chcesz sie poruszyc jest puste! Wybierz inne pole." << endl;
return 1;
}
if (T[c][d].wartosc!=0){
cout << "Pole na ktore chcesz sie poruszyc jest zajete! Wybierz inne pole." << endl;
return 1;
}
return 0;
}