Cześć, mam problem z obsługą błędów w programie, gdzie użytkownik może sterować skoczkiem szachowym, aby rozwiązać tzw problem skoczka. Poza częścią sprawdzającą poprawność danych, algorytm działa poprawnie. Największy problem sprawia mi fragment, gdzie użytkownik wpisuje, na jakim polu skoczek powinien się pojawić w następnym ruchu. Mam tu na myśli zabezpieczenie przeciwko dowolnej liczbie znaków (nieważne czy są to cyfry czy litery). Ponadto, w przypadku błędnego ruchu (z powodu wpisania złej cyfry), program powinien wracać do poprzedniego poprawnie wykonanego punktu. Domyślam się, że problem można rozwiązać poprzez funkcję getchar, co też próbowałem, ale bez skutku. Proszę o pomoc w tej kwestii. Poniżej zamieszczam kod programu:
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#define N 8
#define NP N+1
int wyjscie(int, int, int[N][NP]);
void wyswietl(int[N][NP]);
void wypelnij(int [N][NP]);
int znajdz(int, int, int, int[N][NP], int[N], int[N]);
void nast_ruch(int, int, int, int [N], int [N], int, char);
int main()
{
char ch = '\0';
do
{
printf("1. Nowa gra.\n");
printf("2. Zamknij program\n");
printf(" \nWybierz opcje:\n");
scanf("%c", &ch);
switch (ch)
{
case '1':
skoczek();
case '2':
break;
default:
printf("Taka opcja nie istnieje!\n");
}
} while (ch != '2');
system("pause");
return 0;
}
void wypelnij(int tab[N][NP])
{
int i, j, k;
for (i = 0, k = N; i < N; i++, k--)
{
tab[i][0] = k; /* pionowe oznaczenie szachownicy */
for (j = 1; j < NP; j++)
{
tab[i][j] = 0; /* wypelnianie szachownicy cyfra 0 poza jej pierwszym wierszem i pierwsza kolumna */
}
}
}
int skoczek()
{
int tab[N][NP];
int i, j, k, a, b, m, n;
char s, c;
/* tablice zawierajace 8 mozliwych ruchow skoczka, osobno dla kierunku pionowego i poziomego */
int x_ruch[] = { 2, 1, -1, -2, -2, -1, 1, 2 };
int y_ruch[] = { 1, 2, 2, 1, -1, -2, -2, -1 };
wypelnij(tab);
wyswietl(tab);
printf("\nPodaj pole poczatkowe dla konika szachowego: \n");
scanf("%c%c", &s, &c);
printf("\n");
m = c - '0'; /* zamiana z char na int */
if (
(s >= 'a') &&
(s <= 'h')
) /* zamiana na duza litere, jesli wprowadzona zostala mala */
{
s = toupper(s);
}
if (s >= 'A' && s <= 'H' && m > 0 && m <= N)
{
/* zamienienie wartosci poczatkowej na odpowiedni indeks tablicy */
for (i = 0, j = N; i < N && j > 0; i++, j--)
{
if (m == i)
{
a = j;
}
if (s == 'A' + i)
{
b = i + 1;
}
}/* for */
tab[a][b] = 1; /* zainicjalizowanie pola poczatkowego wartoscia 1 */
/* szukanie rozwiazania problemu */
if (znajdz(a, b, 2, tab, x_ruch, y_ruch) == 0)
{
printf("\nBlad danych.\nNie znaleziono rozwiazania!\n");
return 0;
}
else
{
printf("Znaleziono rozwiazanie!\n");
wyswietl(tab);
}
}
else
{
printf("Nie wprowadzono prawidlowych danych.\n");
}
}
/*Sprawdza, czy skoczek nie wyjdzie poza szachownice w nastepnym ruchu*/
int wyjscie(int x, int y, int tab[N][NP])
{
if (
(x >= 0) &&
(x < N) &&
(y >= 1) &&
(y < NP) &&
(tab[x][y] == 0)
)
{
return 1;
}
else return 0;
}
void wyswietl(int tab[N][NP])
{
char ozn[] = { ' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' }; /* poziome oznaczenie szachownicy */
int i, j, k;
for (k = 0; k < NP; k++)
{
printf("%2c ", ozn[k]); /* wyswietlanie poziomego oznaczenia */
}
printf("\n");
for (i = 0; i < N; i++)
{
for (j = 0; j < NP; j++)
{
printf("%2d ", tab[i][j]); /* wyswietlanie szachownicy */
}
printf("\n");
}
}
/* Wyswietlenie mozliwych ruchow skoczka w nastepnym kroku */
void nast_ruch(int x, int y, int tab[N][NP], int x_ruch[N], int y_ruch[N], int wx, char wy)
{
int ax, ay, k;
for (k = 0; k < N; k++)
{
ax = x + x_ruch[k];
ay = y + y_ruch[k];
if (wyjscie(ax, ay, tab) == 1)
{
printf("Mozliwy ruch na %c%d, nacisnij %d\n", wy + y_ruch[k], wx - x_ruch[k], k + 1);
}
}
}
/* Funckja przedstawiajaca rekurencyjny algorytm poruszania sie skoczka */
int znajdz(int x, int y, int ruch, int tab[N][NP], int x_ruch[N], int y_ruch[N])
{
int ax, ay, i, j, k, m, w;
char s,c, znak = '\0';
if (ruch == (N*N)+1) /* sprawdzenie, czy dany ruch nie jest ostatnim, tzn. czy znaleziono roziazanie */
{
return 1;
}
/* zamiana danego indeksu tablicy na wartosc zgodna z oznaczeniem szachownicy */
for (i = 0, j = N; i < N && j > 0; i++, j--)
{
if (x == i)
{
m = j;
}
if (y == i + 1)
{
s = 'A' + i;
}
}
wyswietl(tab);
nast_ruch(x, y, tab, x_ruch, y_ruch, m, s);
printf("Podaj nastepny krok ruchu konika:\n");
if (((scanf("%c", &znak)) != 1) && (znak < '0' || znak > '8'))
{
printf("Blad danych, wpisz ponownie\n");
scanf("%c", &znak);
}
w = znak - '0';
for (k = 0; k <= w; k++)
{
if (k == w)
{ /* zamiana wartosci zgodnej z oznaczeniem tablicy na indeks tablicy */
for (i = 0, j = N; i < N && j >0; i++, j--)
{
if (m == i)
{
x = j;
}
if (s == 'A' + i)
{
y = i + 1;
}
}
ax = x + x_ruch[w - 1];
ay = y + y_ruch[w - 1];
}
}
if (wyjscie(ax, ay, tab) == 1) /* sprawdzenie, czy w danym ruchu skoczek nie wyskoczy poza szachownice */
{
tab[ax][ay] = ruch; /* numerowanie pol, w ktorych znajduje sie skoczek, zgodnie z iloscia wykonanych ruchow */
if (znajdz(ax, ay, ruch + 1, tab, x_ruch, y_ruch) == 1) /* sprawdzenie, nastepny ruch skoczka jest mozliwy */
{
return 1;
}
else
{
tab[ax][ay] = 0;
}
}
return 0;
}