%Hledání min

clear all

close all

clc



%info

disp('Hledání min')

disp(' ') % odřádkování

disp('Jedná se o klasickou hru Hledání min, zde v textovém provedení.')

disp('Před samotnou hrou je potřeba vygenerovat minové pole, postupujte posím dle instrukcí dále.')

disp(' ') % odřádkování





%% generování minového pole



%tvorba pole



r = input('Zadejte počet řádků minového pole na hledání min: ');



while (r < 2)

    if (r >= 0)

        disp('Pole je příliš malé, zadejte prosím větší jak jedna.')

        r = input('Zadejte počet řádků minového pole na hledání min: ');

    else

        disp('Pole nelze vytvořit, protože jste zadal zápornou velikost. Zadejte kladnou a větší jak jedna.')

        r = input('Zadejte počet řádků minového pole na hledání min: ');

    end

end



s = input('Zadejte počet sloupců minového pole na hledání min: ');



while (s < 2)

    if (s >= 0)

        disp('Pole je příliš malé, zadejte prosím větší jak jedna.')

        s = input('Zadejte počet sloupců minového pole na hledání min: ');

    else

        disp('Pole nelze vytvořit, protože jste zadal zápornou velikost. Zadejte kladnou a větší jak jedna.')

        s = input('Zadejte počet sloupců minového pole na hledání min: ');

    end

end



M = zeros(r,s);    % vytvoření minového pole, zatím bez min



%zadání počtu min



disp(' ') % odřádkování

pocet_min = input('Zadejte počet min: ');



while (((r*s) <= pocet_min) || (pocet_min < 1)) %kontrola zda není chybně zadaný počet min

    if (pocet_min < 1) %min je méně jak jedna

        fprintf('Zadal jste méně jak jednu minu. Zadejte číslo větší než %d menší než %d.\n\n', 0, a^2) %pokyny pro zadávání

        pocet_min = input('Zadejte počet min: ');

    else

        if ((r*s) == pocet_min) %min je stejně jako polí

            disp('Zadal jste stejný počet min, jako je počet políček v poli.')

            disp('Tzn.: celé pole je naplněno jen minami.')

            fprintf('Toto by bylo příliš lehké. Zadejte číslo větší než %d menší než %d.\n\n', 0, r*s) %pokyny pro zadávání

            pocet_min = input('Zadejte počet min: ');

        else %min je více jak polí

            fprintf('Zadal jste více min, než se vleze do pole. Zadejte číslo větší než %d menší než %d.\n\n', 0, r*s) %pokyny pro zadávání

            pocet_min = input('Zadejte počet min: ');

        end

    end

end %min je méně jak polí a to je v pořádku



%rozmístění min

for i=1:pocet_min

    p = randi(r);

    q = randi(s);

    while (M(p,q) == -1)

       p = randi(r);

       q = randi(s);

    end

    M(p,q) = -1;

end



%doplnění hodnot ohrožení

for i=2:(r-1) %vyplnění druhého až předposledního řádku

    for j=2:(s-1) %vyplnění druhého až předposledního sloupce

        if (M(i,j) ~= -1)

            h = 0;

            if (M(i-1,j-1) == -1)

                h = h+1;

            end

            if (M(i-1,j) == -1)

                h = h+1;

            end

            if (M(i-1,j+1) == -1)

                h = h+1;

            end

            if (M(i,j-1) == -1)

                h = h+1;

            end

            if (M(i,j+1) == -1)

                h = h+1;

            end

            if (M(i+1,j-1) == -1)

                h = h+1;

            end

            if (M(i+1,j) == -1)

                h = h+1;

            end

            if (M(i+1,j+1) == -1)

                h = h+1;

            end

            M(i,j) = h;

        end

    end

    

    %doplnění prvního sloupce

    if (M(i,1) ~= -1)  

         h = 0;

         if (M(i-1,1) == -1)

             h = h+1;

         end

         if (M(i-1,2) == -1)

             h = h+1;

         end

         if (M(i,2) == -1)

             h = h+1;

         end

         if (M(i+1,1) == -1)

             h = h+1;

         end

         if (M(i+1,2) == -1)

             h = h+1;

         end

         M(i,1) = h;

    end

    

    %doplnění posledního sloupce

    if (M(i,s) ~= -1)

    h = 0;

    if (M(i-1,s-1) == -1)

        h = h+1;

    end

    if (M(i-1,s) == -1)

        h = h+1;

    end

    if (M(i,s-1) == -1)

        h = h+1;

    end

    if (M(i+1,s-1) == -1)

        h = h+1;

    end

    if (M(i+1,s) == -1)

        h = h+1;

    end

    M(i,s) = h;

    end

end



%doplnění prvního řádku



for j=2:(s-1)

    if (M(1,j) ~= -1)

        h = 0;

        if (M(1,j-1) == -1)

            h = h+1;

        end

        if (M(1,j+1) == -1)

            h = h+1;

        end

        if (M(2,j-1) == -1)

            h = h+1;

        end

        if (M(2,j) == -1)

            h = h+1;

        end

        if (M(2,j+1) == -1)

            h = h+1;

        end

        M(1,j) = h;

    end

end



%doplnění posledního řádku



for j=2:(s-1)

    if (M(r,j) ~= -1)

        h = 0;

        if (M(r-1,j-1) == -1)

            h = h+1;

        end

        if (M(r-1,j+1) == -1)

            h = h+1;

        end

        if (M(r,j-1) == -1)

            h = h+1;

        end

        if (M(r-1,j) == -1)

            h = h+1;

        end

        if (M(r,j+1) == -1)

            h = h+1;

        end

        M(r,j) = h;

    end

end



%doplnění bodu 1,1



if (M(1,1) ~= -1)

    h = 0;

    if (M(1,2) == -1)

        h = h+1;

    end

    if (M(2,2) == -1)

        h = h+1;

    end

    if (M(2,1) == -1)

        h = h+1;

    end

    M(1,1) = h;

end



%doplnění bodu 1,s



if (M(1,s) ~= -1)

    h = 0;

    if (M(1,s-1) == -1)

        h = h+1;

    end

    if (M(2,s-1) == -1)

        h = h+1;

    end

    if (M(2,s) == -1)

        h = h+1;

    end

    M(1,s) = h;

end



%doplnění bodu r,s



if (M(r,s) ~= -1)

    h = 0;

    if (M(r,s-1) == -1)

        h = h+1;

    end

    if (M(r-1,s-1) == -1)

        h = h+1;

    end

    if (M(r-1,s) == -1)

        h = h+1;

    end

    M(r,s) = h;

end



%doplnění bodu r,1



if (M(r,1) ~= -1)

    h = 0;

    if (M(r,2) == -1)

        h = h+1;

    end

    if (M(r-1,2) == -1)

        h = h+1;

    end

    if (M(r-1,1) == -1)

        h = h+1;

    end

    M(r,1) = h;

end





%% hra



%samotné hraní



disp(' ')

disp('Hra začíná!')

k = 0; %počet objevených míst bez miny

V = -1*ones(r,s); %matice dosavatních výsledků

disp('Matice V vám bude ukazovat co již máte objeveno. Hodnota "-1" znamená, že dané pole dosud nebylo prozkoumáno.') %výsledková matice prohledávání

disp('Pokud chcete hru ukončit, zadejte souřadnice [0,0]') %ukončovací příkaz

fprintf('Zadávajte řádkové souřadnice celočíselně od 1 do %d a zadávajte sloupcové souřadnice celočíselně od 1 do %d.\n\n', r, s) %pokyny pro zadávání

m = input('Zadejte řádkovou souřadnici prohledávaného pole: ');

n = input('Zadejte sloupcovou souřadnici prohledávaného pole: ');



if ((m ~= 0) && (n ~= 0)) %kontrola, že hra nebyla ručně ukončena před samotným začátkem prohledávání

    while ((m < 1) || (m > r) || (n < 1) || (n > s))

        disp('Chybané zadání. Zadali jste políčko mimo pole min.')

        m = input('Zadejte řádkovou souřadnici prohledávaného pole: ');

        n = input('Zadejte sloupcovou souřadnici prohledávaného pole: ');

        if ((m == 0) && (n == 0)) %kontrola možného ručního ukončení hry po zadání špatných souřadnic

            disp('Hra byla ukončena!')

            break; %ukončení cyklu po ručním ukončení hry

        end

    end

    

        while (M(m,n) ~= -1) %kontrola, zda hráč nestoupl na minu

            k = k+1; %zkontrolováno další místo, kde nebyla mina

            fprintf('\n V okolí je %d min.\n\n', M(m,n)) %vypíše počet min v okolí (celé číslo)

            V(m,n)= M(m,n); %vloží do matice výsledků prohledávání (V) odpovídající hodnotu z minového pole (M)

            V %vypíše matici výsledků prohledávání

            if (k == (r*s-pocet_min)) %kontrola pro případ, že by hráč prošel všemi místy, kdy miny nejsou (stejný význam by měla i podmínka (V == M))

                break; %ukončení cyklu po objevení všech míst bez min

            else

                m = input('Zadejte řádkovou souřadnici prohledávaného pole: ');

                n = input('Zadejte sloupcovou souřadnici prohledávaného pole: ');

                if ((m == 0) && (n == 0)) %ruční ukončení hry

                    break; %ukončení cyklu po ručním ukončení hry

                else

                    while ((m < 1) || (m > r) || (n < 1) || (n > s))

                        disp('Chybné zadání. Zadali jste políčko mimo pole min.')

                        m = input('Zadejte řádkovou souřadnici prohledávaného pole: ');

                        n = input('Zadejte sloupcovou souřadnici prohledávaného pole: ');

                        if ((m == 0) && (n == 0)) %kontrola možného ručního ukončení hry po zadání špatných souřadnic

                            break; %ukončení cyklu pro ruční ukončení hry

                        end

                    end

                end

            end

         end

        if (k == (r*s-pocet_min)) %kontrola, zda hráč nevyhrál

            disp('Gratuluji k přežití! Prošel jste všechna místa, kde nejsou miny.') 

            disp ('To znamená, že všude jinde miny jsou a tím jste je všechny objevil.')

        end

        if ((m ~= 0) && (n ~= 0) && (M(m,n) == -1)) %hráč vybuchl a tím ukončil hru   

            disp(' ') % odřádkování

            disp('Stoupl jste na minu a explodoval jste! Zkuste to v příštím životě...')

        end

end



disp(' ') % odřádkování

disp('Hra byla ukončena!')

disp('Minové pole vypadalo takto: ')

M % zobrazení minového pole

disp('Čísla udávají počet min v okolí, číslo "-1" znamená minu.')

