Wszystko działa tak jak powinno z małym wyjątkiem. Czyli właściwie nie wszystko. ;-)
Odpaliłem program docelowy, który rysuje węża na zadeklarowanej dynamicznej podwójnej tablicy .
Program, podczas rysowania może korzystać z dowolnych znaków, które podaje się na początku.
printf("Wpisz dowolny znak z klawiatury dla węża= ");
jedynka = getc(stdin); //zamiana numeru znaku klawiatury na znak klawiatury
getchar();
printf("jedynka= %c\n",jedynka);
printf("Wpisz dowolny znak z klawiatury dla pola wokół węża= ");
zero = getc(stdin);
getchar();
printf("zero= %c\n", zero);
Potem program pyta o ilość wierszy i kolumn i zaczyna działać.
Na końcu, po narysowaniu węża pada pytanie czy powtórzyć operację.
Jak T to wracamy do pierwszego pytania o dowolny znak z klawiatury dla węża.
I tu pojawia się problem bo po wpisaniu znaku, zmienna jedynka jest pusta, tak samo zmienna zero.
Robiłem testy zapętlając tylko te pytania i wszystko śmigało.
Myślałem, że może czyszczenie pamięci coś mąci ale po wyłaczeniu tego fragmentu kodu jest ciągle źle.
No i znowu proszę o radę...:-)
Tu cały program:
//Wąż ver 1.1
#include <stdio.h>
#include <malloc.h>
#include <locale.h>
#include <conio.h>
#include <stdlib.h>
int i = 0, j = 0, a=0;
int main(void)
{
// Deklaracja zmiennych
int wiersze;
int kolumny;
int** tab;
char jedynka;
char zero ;
char key;
setlocale(LC_ALL, "polish");// polskie znaki
poczatek:
i = 0, j = 0;
printf("Wpisz dowolny znak z klawiatury dla węża= ");
jedynka = getc(stdin); //zamiana numeru znaku klawiatury na znak klawiatury
getchar();
printf("jedynka= %c\n",jedynka);
printf("Wpisz dowolny znak z klawiatury dla pola wokół węża= ");
zero = getc(stdin);
getchar();
printf("zero= %c\n", zero);
// Pobranie danych
printf("Podaj ilość wierszy: ");
scanf(" %d", &wiersze);
printf("Podaj ilość kolumn: ");
scanf(" %d", &kolumny);
printf("\n");
// Alokacja pamięci dla tablicy dwuwymiarowej
tab = (int**)malloc(wiersze * sizeof(int*)); // alokacja pamięci dla wierszy
for (int i = 0; i < wiersze; i++)
tab[i] = (int*)malloc(kolumny * sizeof(int)); // alokacja pamięci dla kolumn
for (i = 0; i < wiersze; i++) // wypełnienie tablicy znakiem pierwszym (0) - początek
for (j = 0; j < kolumny; j++)
tab[i][j] = zero; // wypełnienie tablicy znakiem pierwszym (0) - koniec
i = 0;
j = 0;
printf("i= %d, j= %d kolumny= %d wiersze= %d tab[0][0]= %c", i, j, kolumny, wiersze, tab[0][0]);
system("pause");
///////////////////////////// w prawo ////////////////////////////
for (j; j < kolumny && tab[i][j] == zero ; j++)
{
//printf("W petli w prawo_1 i= %d j= %d tab= %d\n", i, j, tab[i][j]);
tab[i][j] = jedynka;
}
//printf("Po wyjsciu z petli w prawo i= %d j= %d \n", i, j) ;
j = j - 1;
tab[i][j] = zero;
//printf("Koniec bloku w prawo_1 i= %d j= %d\n", i, j);
//printf("\n");
/////////////////////////// w dół ////////////////////////////////
for (i; i < wiersze && tab[i][j] == zero ; i++)
{
//printf("W petli w dol_1 i= %d j= %d tab= %d\n", i, j, tab[i][j]);
tab[i][j] = jedynka;
}
//printf("Po wyjsciu z petli w dol_1 i= %d j= %d \n", i, j );
i = i - 1;
tab[i][j] = zero;
//printf("Koniec bloku w dol_1 i= %d j= %d\n", i, j);
//printf("\n");
/////////////////////////// w lewo ////////////////////////////////
for (j; j >= 0 && tab[i][j] == zero; j--)
{
//printf("W petli w lewo_1 i= %d j= %d tab= %d\n", i, j, tab[i][j]);
tab[i][j] = jedynka;
}
//printf("Po wyjsciu z petli w lewo_1 i= %d j= %d \n", i, j);
j = j + 1;
tab[i][j] = zero;
//printf("Koniec bloku w lewo_1 i= %d j= %d\n", i, j);
//printf("\n");
while (a==a) //pętlna nieskończona
{
a++;
//printf("a= %d wiersze= %d kolumny= %d\n", a, wiersze, kolumny);
/////////////////////////// w gore_2 ////////////////////////////////
if (tab[i][j] == zero && tab[i - 1][j] == zero && tab[i - 2][j] == jedynka)
goto skok;
int g = i;
for (i; tab[i][j] == zero && i >= 0; i--)
if (tab[i - 1][j] == jedynka)
{
//printf("W petli w gore_1 i= %d j= %d tab= %d\n", i, j, tab[i][j]);
tab[i][j] = zero;
}
else
{
tab[i][j] = jedynka;
}
i = i + 2;
tab[i][j] = zero;
if (g - i == 1)
goto skok;
//printf("Po wyjsciu z petli w gore_2 i= %d j= %d \n", i, j);
//printf("\n");
/////////////////////////// w prawo2 ////////////////////////////////
if (tab[i][j] == zero && tab[i][j + 1] == zero && tab[i][j + 2] == jedynka)
goto skok;
int p = j;
for (j; tab[i][j] == zero && j < kolumny; j++)
if (tab[i][j + 1] == jedynka)
{
// printf("W petli w prawo_2 i= %d j= %d tab= %d\n", i, j, tab[i][j]);
tab[i][j] = zero;
}
else
{
tab[i][j] = jedynka;
}
j = j - 2;
tab[i][j] = zero;
if (j - p == 1)
goto skok;
//printf("Po wyjsciu z petli w prawo_2 i= %d j= %d \n", i, j);
//printf("\n");
//////////////////////////// w dol_2 //////////////////////////////////////////////////
if (tab[i][j] == zero && tab[i + 1][j] == zero && tab[i + 2][j] == jedynka)
goto skok;
int d = i;
for (i; tab[i][j] == zero && i <= wiersze; i++)
if (tab[i + 1][j] == jedynka)
{
// printf("W petli w dol_2 i= %d j= %d tab= %d\n", i, j, tab[i][j]);
tab[i][j] = zero;
}
else
{
tab[i][j] = jedynka;
}
i = i - 2;
tab[i][j] = zero;
if (i - d == 1)
goto skok;
//printf("Po wyjsciu z petli w dol_2 i= %d j= %d \n", i, j);
//printf("\n");
/////////////////////////// w lewo_2 ////////////////////////////////
if (tab[i][j] == zero && tab[i][j - 1] == zero && tab[i][j - 2] == jedynka)
goto skok;
int l = j;
for (j; tab[i][j] == zero && j > 0; j--)
if (tab[i][j - 1] == jedynka)
{
//printf("W petli w prawo_2 i= %d j= %d tab= %d\n", i, j, tab[i][j]);
tab[i][j] = zero;
}
else
{
tab[i][j] = jedynka;
}
j = j + 2;
tab[i][j] = zero;
if (l - j == 1)
goto skok;
//printf("Po wyjsciu z petli w lewo_2 i= %d j= %d \n", i, j);
//printf("\n");
}
skok:
tab[i][j] = jedynka;
// Wypisywanie wartości
for (int i = 0; i < wiersze; i++)
{
for (int j = 0; j < kolumny; j++)
{
printf("%1c", tab[i][j]);
}
printf("\n");
}
// Czyszczenie pamięci
for (int i = 0; i < wiersze; i++)
free(tab[i]);
free(tab);
printf("\n");
printf("Chcesz powtórzyć? (T/N)\n");
key = _getch();
if (key == 't')
{
system("cls");
goto poczatek;
}
if (key == 'n');
{
system("cls");
printf("Program zokończył działanie\n");
}
return 0;
}