opis_programu.pdf

(147 KB) Pobierz
Dariusz Mikołajczuk
Opis programu labirynt
NAJWAŻNIEJSZE ZMIENNE
W funkcji main zadeklarowane są następujące istotne struktury danych:
flist *first – wskaźnik do pierwszego elementu listy jednokierunkowej przechowującej
listę plików schematów labiryntów (znajdujących się w folderze data\ ).
struct flist {
usint num; numer danej planszy odpowiadający pozycji w pliku .
data\file_list.txt zawiera się w przedziale 1 … file_count.
uchar tab[56]; ścieżka do pliku ze schematem wraz z prefiksem „data\”.
struct flist *next;
wskaźnik do kolejnego elementu listy.
};
unsigned short int file_count – liczba istniejących plików ze schematami labiryntów.
FILE *plik_z_plansza – aktualnie używany plik z planszą. Wykorzystywany tylko
podczas ładowania danych do następującej tablicy.
pos_data **tab – dynamiczna tablica dwuwymiarowa następujących struktur:
struct pos_data {
bool now; - określa czy aktualnie znajdujemy się w tym punkcie (podczas gry).
bool checked; - określa czy wykonano już przejście przez dany punkt
(wykorzystywane podczas sprawdzania czy istnieje przejście przez labirynt).
bool iso; - jeśli przez dany punkt istnieje przejście (dotyczy to też korytarzy
na zewnątrz labiryntu dany parametr ustawiony jest na true, w innym
wypadku na false.
struct kierunki{ - określają kierunki, w które można przejść z danego punktu.
bool up;
bool down;
bool right;
bool left;
};};
pos a – przechowuje rozmiary labiryntu.
struct pos {
unsigned short int x;
unsigned short int y;
};
1
Przykładowa zawartość tablicy labiryntu wraz z rozmiarami.
0
1
2
3
4
5
6
7
8
9
10
11
12
0
1
X
X
X
X
O
O
O
X
X
X
X
2
O
O
O
X
X
X
X
O
O
X
X
3
X
X
O
O
O
O
X
X
X
X
X
4
X
X
X
X
X
O
O
O
O
O
X
5
X
X
X
X
X
X
X
X
X
O
X
6
O
O
O
O
X
X
X
X
X
O
X
7
O
O
O
O
O
O
O
O
X
O
X
8
X
X
X
X
X
X
X
O
X
O
X
9
O
O
O
O
O
O
O
O
X
O
O
Kolor jasnoszary reprezentuje korytarze na zewnątrz labiryntu, ciemnoszary – dane
pochodzące z pliku schematu. X – oznacza ścianę, O – korytarz.
W danym przypadku rozmiary labiryntu przechowywane przez zmienną a wynoszą:
a.x = 11;
a.y = 9;
Do poszczególnych elementów tablicy odwołujemy się najpierw poprzez podanie
numeru wiersza, potem kolumny np.:
pos b;
b.x = 5;
b.y = 6;
tab[b.y][b.x].iso;
2
910738707.551.png 910738707.644.png 910738707.655.png 910738707.666.png 910738707.001.png 910738707.012.png 910738707.023.png 910738707.034.png 910738707.045.png 910738707.056.png 910738707.067.png 910738707.078.png 910738707.089.png 910738707.100.png 910738707.111.png 910738707.122.png 910738707.133.png 910738707.144.png 910738707.155.png 910738707.166.png 910738707.177.png 910738707.188.png 910738707.199.png 910738707.210.png 910738707.221.png 910738707.232.png 910738707.243.png 910738707.254.png 910738707.265.png 910738707.276.png 910738707.287.png 910738707.298.png 910738707.309.png 910738707.320.png 910738707.331.png 910738707.342.png 910738707.353.png 910738707.364.png 910738707.375.png 910738707.386.png 910738707.397.png 910738707.408.png 910738707.419.png 910738707.430.png 910738707.441.png 910738707.452.png 910738707.463.png 910738707.474.png 910738707.485.png 910738707.496.png 910738707.507.png 910738707.518.png 910738707.529.png 910738707.540.png 910738707.552.png 910738707.563.png 910738707.574.png 910738707.585.png 910738707.596.png 910738707.607.png 910738707.618.png 910738707.629.png 910738707.640.png 910738707.643.png 910738707.645.png 910738707.646.png 910738707.647.png 910738707.648.png 910738707.649.png 910738707.650.png 910738707.651.png 910738707.652.png 910738707.653.png 910738707.654.png 910738707.656.png 910738707.657.png 910738707.658.png 910738707.659.png 910738707.660.png 910738707.661.png 910738707.662.png 910738707.663.png 910738707.664.png 910738707.665.png 910738707.667.png 910738707.668.png 910738707.669.png 910738707.670.png 910738707.671.png 910738707.672.png 910738707.673.png 910738707.674.png 910738707.675.png 910738707.676.png 910738707.002.png 910738707.003.png 910738707.004.png 910738707.005.png 910738707.006.png 910738707.007.png 910738707.008.png 910738707.009.png 910738707.010.png 910738707.011.png 910738707.013.png 910738707.014.png 910738707.015.png 910738707.016.png 910738707.017.png 910738707.018.png 910738707.019.png 910738707.020.png 910738707.021.png 910738707.022.png 910738707.024.png 910738707.025.png 910738707.026.png 910738707.027.png 910738707.028.png 910738707.029.png 910738707.030.png 910738707.031.png 910738707.032.png 910738707.033.png 910738707.035.png 910738707.036.png 910738707.037.png 910738707.038.png 910738707.039.png 910738707.040.png 910738707.041.png 910738707.042.png 910738707.043.png 910738707.044.png 910738707.046.png 910738707.047.png 910738707.048.png 910738707.049.png 910738707.050.png 910738707.051.png 910738707.052.png 910738707.053.png 910738707.054.png 910738707.055.png 910738707.057.png 910738707.058.png 910738707.059.png 910738707.060.png 910738707.061.png 910738707.062.png 910738707.063.png 910738707.064.png 910738707.065.png 910738707.066.png 910738707.068.png 910738707.069.png 910738707.070.png 910738707.071.png 910738707.072.png 910738707.073.png 910738707.074.png 910738707.075.png 910738707.076.png 910738707.077.png 910738707.079.png 910738707.080.png 910738707.081.png 910738707.082.png 910738707.083.png 910738707.084.png 910738707.085.png 910738707.086.png 910738707.087.png 910738707.088.png 910738707.090.png 910738707.091.png 910738707.092.png 910738707.093.png 910738707.094.png 910738707.095.png 910738707.096.png 910738707.097.png 910738707.098.png 910738707.099.png 910738707.101.png 910738707.102.png 910738707.103.png 910738707.104.png 910738707.105.png 910738707.106.png 910738707.107.png 910738707.108.png 910738707.109.png 910738707.110.png 910738707.112.png 910738707.113.png 910738707.114.png 910738707.115.png 910738707.116.png 910738707.117.png 910738707.118.png 910738707.119.png 910738707.120.png 910738707.121.png 910738707.123.png 910738707.124.png 910738707.125.png 910738707.126.png 910738707.127.png 910738707.128.png 910738707.129.png 910738707.130.png 910738707.131.png 910738707.132.png 910738707.134.png 910738707.135.png 910738707.136.png 910738707.137.png 910738707.138.png 910738707.139.png 910738707.140.png 910738707.141.png 910738707.142.png 910738707.143.png 910738707.145.png 910738707.146.png 910738707.147.png 910738707.148.png 910738707.149.png 910738707.150.png 910738707.151.png 910738707.152.png 910738707.153.png 910738707.154.png 910738707.156.png 910738707.157.png 910738707.158.png 910738707.159.png 910738707.160.png 910738707.161.png 910738707.162.png 910738707.163.png 910738707.164.png 910738707.165.png 910738707.167.png 910738707.168.png 910738707.169.png 910738707.170.png 910738707.171.png 910738707.172.png 910738707.173.png 910738707.174.png 910738707.175.png 910738707.176.png 910738707.178.png 910738707.179.png 910738707.180.png 910738707.181.png 910738707.182.png 910738707.183.png 910738707.184.png 910738707.185.png 910738707.186.png 910738707.187.png 910738707.189.png 910738707.190.png 910738707.191.png 910738707.192.png 910738707.193.png 910738707.194.png 910738707.195.png 910738707.196.png 910738707.197.png 910738707.198.png 910738707.200.png 910738707.201.png 910738707.202.png 910738707.203.png 910738707.204.png 910738707.205.png 910738707.206.png 910738707.207.png 910738707.208.png 910738707.209.png 910738707.211.png 910738707.212.png 910738707.213.png 910738707.214.png 910738707.215.png 910738707.216.png 910738707.217.png 910738707.218.png 910738707.219.png 910738707.220.png 910738707.222.png 910738707.223.png 910738707.224.png 910738707.225.png 910738707.226.png 910738707.227.png 910738707.228.png 910738707.229.png 910738707.230.png 910738707.231.png 910738707.233.png 910738707.234.png 910738707.235.png 910738707.236.png 910738707.237.png 910738707.238.png 910738707.239.png 910738707.240.png 910738707.241.png 910738707.242.png 910738707.244.png 910738707.245.png 910738707.246.png 910738707.247.png 910738707.248.png 910738707.249.png 910738707.250.png 910738707.251.png 910738707.252.png 910738707.253.png 910738707.255.png 910738707.256.png 910738707.257.png 910738707.258.png 910738707.259.png 910738707.260.png 910738707.261.png 910738707.262.png 910738707.263.png 910738707.264.png 910738707.266.png 910738707.267.png 910738707.268.png 910738707.269.png 910738707.270.png 910738707.271.png 910738707.272.png 910738707.273.png 910738707.274.png 910738707.275.png 910738707.277.png 910738707.278.png 910738707.279.png 910738707.280.png 910738707.281.png 910738707.282.png 910738707.283.png 910738707.284.png 910738707.285.png 910738707.286.png 910738707.288.png 910738707.289.png 910738707.290.png 910738707.291.png 910738707.292.png 910738707.293.png 910738707.294.png 910738707.295.png 910738707.296.png 910738707.297.png 910738707.299.png 910738707.300.png 910738707.301.png 910738707.302.png 910738707.303.png 910738707.304.png 910738707.305.png 910738707.306.png 910738707.307.png 910738707.308.png 910738707.310.png 910738707.311.png 910738707.312.png 910738707.313.png 910738707.314.png 910738707.315.png 910738707.316.png 910738707.317.png 910738707.318.png 910738707.319.png 910738707.321.png 910738707.322.png 910738707.323.png 910738707.324.png 910738707.325.png 910738707.326.png 910738707.327.png 910738707.328.png 910738707.329.png 910738707.330.png 910738707.332.png 910738707.333.png 910738707.334.png 910738707.335.png 910738707.336.png 910738707.337.png 910738707.338.png 910738707.339.png 910738707.340.png 910738707.341.png 910738707.343.png 910738707.344.png 910738707.345.png 910738707.346.png 910738707.347.png 910738707.348.png 910738707.349.png 910738707.350.png 910738707.351.png 910738707.352.png 910738707.354.png 910738707.355.png 910738707.356.png 910738707.357.png 910738707.358.png 910738707.359.png 910738707.360.png 910738707.361.png 910738707.362.png 910738707.363.png 910738707.365.png 910738707.366.png 910738707.367.png 910738707.368.png 910738707.369.png 910738707.370.png 910738707.371.png 910738707.372.png 910738707.373.png 910738707.374.png 910738707.376.png 910738707.377.png 910738707.378.png 910738707.379.png 910738707.380.png 910738707.381.png 910738707.382.png 910738707.383.png 910738707.384.png 910738707.385.png 910738707.387.png 910738707.388.png 910738707.389.png 910738707.390.png 910738707.391.png 910738707.392.png 910738707.393.png 910738707.394.png 910738707.395.png 910738707.396.png 910738707.398.png 910738707.399.png 910738707.400.png 910738707.401.png 910738707.402.png 910738707.403.png 910738707.404.png 910738707.405.png 910738707.406.png 910738707.407.png 910738707.409.png 910738707.410.png 910738707.411.png 910738707.412.png 910738707.413.png 910738707.414.png 910738707.415.png 910738707.416.png 910738707.417.png 910738707.418.png 910738707.420.png 910738707.421.png 910738707.422.png 910738707.423.png 910738707.424.png 910738707.425.png 910738707.426.png 910738707.427.png 910738707.428.png 910738707.429.png 910738707.431.png 910738707.432.png 910738707.433.png 910738707.434.png 910738707.435.png 910738707.436.png 910738707.437.png 910738707.438.png 910738707.439.png 910738707.440.png 910738707.442.png 910738707.443.png 910738707.444.png 910738707.445.png 910738707.446.png 910738707.447.png 910738707.448.png 910738707.449.png 910738707.450.png 910738707.451.png 910738707.453.png 910738707.454.png 910738707.455.png 910738707.456.png 910738707.457.png 910738707.458.png 910738707.459.png 910738707.460.png 910738707.461.png 910738707.462.png 910738707.464.png 910738707.465.png 910738707.466.png 910738707.467.png 910738707.468.png 910738707.469.png 910738707.470.png 910738707.471.png 910738707.472.png 910738707.473.png 910738707.475.png 910738707.476.png 910738707.477.png 910738707.478.png 910738707.479.png 910738707.480.png 910738707.481.png 910738707.482.png 910738707.483.png 910738707.484.png 910738707.486.png 910738707.487.png 910738707.488.png 910738707.489.png 910738707.490.png 910738707.491.png 910738707.492.png 910738707.493.png 910738707.494.png 910738707.495.png 910738707.497.png 910738707.498.png 910738707.499.png 910738707.500.png 910738707.501.png 910738707.502.png 910738707.503.png 910738707.504.png 910738707.505.png 910738707.506.png 910738707.508.png 910738707.509.png 910738707.510.png 910738707.511.png 910738707.512.png 910738707.513.png 910738707.514.png 910738707.515.png 910738707.516.png 910738707.517.png 910738707.519.png 910738707.520.png 910738707.521.png 910738707.522.png 910738707.523.png 910738707.524.png 910738707.525.png 910738707.526.png 910738707.527.png 910738707.528.png 910738707.530.png 910738707.531.png 910738707.532.png 910738707.533.png 910738707.534.png 910738707.535.png 910738707.536.png 910738707.537.png 910738707.538.png 910738707.539.png 910738707.541.png 910738707.542.png 910738707.543.png 910738707.544.png 910738707.545.png 910738707.546.png 910738707.547.png 910738707.548.png 910738707.549.png 910738707.550.png 910738707.553.png 910738707.554.png 910738707.555.png 910738707.556.png 910738707.557.png 910738707.558.png 910738707.559.png 910738707.560.png 910738707.561.png 910738707.562.png 910738707.564.png 910738707.565.png 910738707.566.png 910738707.567.png 910738707.568.png 910738707.569.png 910738707.570.png 910738707.571.png 910738707.572.png 910738707.573.png 910738707.575.png 910738707.576.png 910738707.577.png 910738707.578.png 910738707.579.png 910738707.580.png 910738707.581.png 910738707.582.png 910738707.583.png 910738707.584.png 910738707.586.png 910738707.587.png 910738707.588.png 910738707.589.png 910738707.590.png 910738707.591.png 910738707.592.png 910738707.593.png 910738707.594.png 910738707.595.png 910738707.597.png 910738707.598.png 910738707.599.png 910738707.600.png 910738707.601.png 910738707.602.png 910738707.603.png 910738707.604.png 910738707.605.png 910738707.606.png 910738707.608.png 910738707.609.png 910738707.610.png 910738707.611.png 910738707.612.png 910738707.613.png 910738707.614.png 910738707.615.png 910738707.616.png 910738707.617.png 910738707.619.png 910738707.620.png 910738707.621.png 910738707.622.png 910738707.623.png 910738707.624.png 910738707.625.png 910738707.626.png 910738707.627.png 910738707.628.png 910738707.630.png 910738707.631.png 910738707.632.png 910738707.633.png 910738707.634.png 910738707.635.png 910738707.636.png 910738707.637.png 910738707.638.png 910738707.639.png 910738707.641.png 910738707.642.png
DZIAŁANIE PROGRAMU (streszczenie)
Funkcja główna main wykonuje następujące działania:
Wczytanie listy plików schematów:
file_list_load(&first, &file_count);
Wykonywane jednorazowo, wczytanie ścieżek wszystkich (istniejących) plików
wymienionych w pliku data\file_list.txt do listy jednokierunkowej.
Funkcja file_list_load obsługuję takie błędy jak nieistnienie pliku file_list.txt
oraz brak zawartości tego pliku. Pomija puste linie tegoż pliku oraz nieistniejące pliki
wymienione w nim.
Przyjmowane jest, że pojedyncza linia zawiera pojedynczą nazwę pliku w folderze
data\ (bez ścieżki). Nazwa pliku oraz rozszerzenie nie są odróżniane, w obydwu mogą
pojawiać się spacje.
W file_count zapisywana jest ilość plików (tzn. numer ostatniego pliku).
Następnie zostaje uruchomiona nieskończona pętla główna, która:
1. Znajduje w liście plansz, tę o danym numerze num (początkowo num = 1) oraz pobiera
z niej ścieżkę do pliku schematu labiryntu.
2. Otwiera plik spod pobranej ścieżki.
3. Wykonuje pierwszy odczyt pliku mający na celu ustalenie rozmiarów labiryntu.
Polega to na sprawdzeniu ilości znaków w pierwszym niepustym wierszu oraz ilości
wierszy pliku. Wszelkie błędy w zapisie pliku: nieprawidłowe białe znaki oraz
nieprawidłowe znaki; są rozpoznawane (wspólnie z kolejną funkcją odczytującą).
Błędy są zgłaszane, po czym następuje przejście do kolejnego kroku pętli i wczytanie
kolejnej losowej planszy.
4. Przydzielenie pamięci dla tablicy przechowującej labirynt na podstawie odczytanych
rozmiarów labiryntu.
5. Kolejny odczyt pliku ze schematem labiryntu. Ostatecznie wczytywane są dane do
tablicy labiryntu. Przy czym przetwarzane tu są tylko obszary tablicy odpowiadające
wnętrzu labiryntu. Określane są tu parametry iso oraz now dla każdego z punktów
labiryntu .
6. Po pomyślnym wczytaniu labiryntu plik ze schematem jest zamykany. Uruchamiana
jest funkcja okresl_strzalki(tab, a) , która dla każdego z punktów labiryntu
(włącznie z zewnętrznymi korytarzami) określa parametry umożliwiające łatwe
sprawdzenie możliwych kierunków poruszania.
Ustalane są też parametry iso, now, checked dla zewnętrznych korytarzy.
3
7. Uruchamiana jest funkcja sprawdzająca czy istnieje przejście przez labirynt. Po kolei
sprawdzane są wszystkie wejścia do labiryntu. Dla każdego wejścia:
◦Analizowany jest aktualny punkt w jakim się znajdujemy na podstawie strzałek
oraz parametrów iso, checked oraz współrzędnych aktualnej pozycji, jest to
zadaniem funkcji otoczenie(pos_data **tab, pos_act *act, pos a).
◦Jeżeli z danego punktu istnieje tylko jedno wyjście (korytarz) oznacza aktualny
punkt jako sprawdzony checked i przechodzi do kolejnego punktu.
◦Jeżeli aktualny punkt jest punktem węzłowym (maksymalnie trzy wyjścia)
wykonuje:
▪wybiera jedno, którym aktualnie podąży np. up.
▪ustawia pozycje aktualnego punktu tablicy jako sprawdzoną: checked.
▪na szczycie stosu zapisuje aktualną pozycję, wraz ze wszystkimi możliwymi
wyjściami z niej, oczywiście w naszym przypadku parametr up jest
zanegowany (użyte przejście zawsze jest negowane).
▪przechodzi do kolejnego, uprzednio wybranego punktu ( up).
◦Jeżeli aktualnie napotkano ślepy zaułek (drogę bez wyjścia) przechodzi do
pozycji węzłowej znajdującej się na szczycie stosu, usuwa ją ze stosu i powraca
do początku algorytmu.
◦Jeżeli napotka ślepy zaułek, a stos jest pusty, próbuje wejść kolejnym wejściem
labiryntu. O ile jakieś zostały, jeśli nie oznacza to, że przejście nie istnieje.
◦Kiedy po wykonaniu aktualnego przejścia znajdujemy się w prawej krawędzi
labiryntu (przy wyjściu) oznacza to, że przejście istnieje.
8. Kiedy wiadomo czy istnieje przejście przez daną planszę uruchamiany jest interfejs,
czyli funkcja graj() . Która:
◦Wyświetla informacje jeśli przejście nie istnieje, wówczas przechodzi do kolejnej
planszy.
◦Jeśli labirynt jest za duży do wyświetlenia w standardowym oknie konsoli wyświetla
odpowiedni komunikat i przechodzi do kolejnej planszy.
◦Jeśli wszystko poszło pomyślnie wyświetla prosty interfejs umożliwiający
poruszanie się po labiryncie. Sterowanie:
kursory – poruszanie się po labiryncie.
spacja – przejście do kolejnej (losowej) planszy, poprzedzone pytaniem.
q – wyjście z programu, poprzedzone pytaniem.
◦Po przejściu przez labirynt wyświetlane jest pytanie co robić dalej:
spacja – zmienia planszę na kolejną losową.
n – ta sama plansza.
q – wyjście z programu.
Opuszczenie funkcji graj() , gdy wybrano przejście do kolejnej planszy lub napotkano
błąd, powoduje wylosowanie nowego numeru planszy oraz przejście do kolejnego kroku
głównej pętli.
4
OBSŁUGA BŁĘDÓW
Kody błędów:
0 sukces , brak błędu.
1 błąd niekrytyczny:
◦niektóre pliki z file_list.txt nie zostały wczytane (z powodu ich braku).
◦niepoprawny plik ze schematem labiryntu.
◦labirynt zbyt duży aby go wyświetlić.
◦brak przejścia przez daną planszę.
Błąd niekrytyczny powoduje wyświetlenie komunikatu o błędzie, jeśli to konieczne –
przejście do kolejnej losowej planszy oraz kontynuowanie pracy programu.
2 błąd krytyczny:
◦plik data\file_list.txt nie istnieje.
◦plik powyższy jest pusty lub nie zawiera żadnej poprawnej nazwy pliku.
◦nie odnaleziono w liście jednokierunkowej planszy o poszukiwanym numerze num
(błąd praktycznie niemożliwy).
◦błąd przy otwarciu pliku (który znajduje się już w liście), na wypadek gdyby plik
został usunięty podczas pracy programu.
Błąd krytyczny powoduje wyświetlenie komunikatu błędu i zakończenie pracy
programu.
99 błąd krytyczny , spowodowany niemożliwością przydzielenia pamięci na
dynamiczne struktury danych. Powoduje wyświetlenie komunikatu o braku pamięci oraz
zakończenie pracy programu.
5
Zgłoś jeśli naruszono regulamin