N = 100;
figure;

itnum=150;
dieAfter = 10;%200;%
initialInfection = 0.001;
infectionRate=0.9;
healRate=0.1;
immunityLoss=0.0;
%0.9; 0.1; 0.0: gyenge járvány, immunis marad: járvány hullámfront
%0.9; 0.1; 0.01: gyenge járvány, immunitás lassanként múlik: járvány hullámfront
%0.9; 0.1; 0.1: gyenge járvány, immunitás múlik: járvány hullámfront + hátramaradó gócok
%0.99; 0.1; 0.1: nagyon gyenge járvány, immunitás múlik: járvány hullámfront + immunitás hullámfront, mögötte fertõzhetõk megint
%0.1; 0.1; 0.0: erõs járvány, gyorsan terjed egyenes szögletes frontokban
%0.1; 0.5; 0.0: erõs járvány, gyorsan terjed egyenes szögletes frontokban, de gyorsan fel is gyógyulnak belõle
%0.1; 0.5; 0.1: erõs járvány, gyorsan terjed, gyógyultak immunitást vesztenek, állandóan vannak fertõzöttek
%0.5; 0.1; 0.1: erõs járvány, immunitás elveszhet, a front mögött is van még a betegség
%0.5; 0.1; 0.9: erõs járvány, gyorsan terjed, gyógyultak újra fertõzõdnek, sokat irt ki
%0.5; 0.0; 0.1: nem gyógyulnak, mindenki meghal

%everyone on the boundary is immune
pop = zeros(N+2); 

%más határfeltétel:


%for starters, set everyone to healthy, and infect a few
pop(2:N+1,2:N+1) = ones(N) + (rand(N) < initialInfection); 
%pop(1:N+2,1:N+2) = ones(N+2) + (rand(N+2) < initialInfection); %periódikus határnál

%create a temporary array
newpop  = pop;

%create colourmap
%you can be immune, healty or at different stages of the disease (up to being dead)
map = zeros(dieAfter+2,3);
map(1,:) = [0 1 0]; % zero is immune, colour green
map(2,:) = [1 1 1]; % one is healthy, colour white
map(3:end, 1) = flipud(linspace(1,0,size(map(3:end, 1),1))); % shades of red (up to black)

%statisztikák:
s=zeros(1,itnum);
b=zeros(1,itnum);
r=zeros(1,itnum);
d=zeros(1,itnum);

for t= 1:itnum
    %show current state
    imagesc(pop,[0 dieAfter+2]);
    colormap(map);
   for i=2:N+1
       for j=2:N+1
   %for i=1:N+2 %periódikus határnál
   %    for j=1:N+2 %periódikus határnál
          guy=pop(i, j);
          newguy=newpop(i, j);
          
          %viselkedési szabályok:
          if guy>=dieAfter %ha halott, úgy marad
              
          elseif guy==0 %ha immunis, az is marad
              if rand<immunityLoss %az immunitást itt el is vesztheti a sejt
                 newguy=1; 
              end
          elseif guy==1 %fertõzhetõ
              korny=0;
              for i1=-1:1  %megszámolom, hogy az 1 sugarú környezetében kik az élõ fertõzöttek
                  for j1=-1:1
                      i_korny=i+i1;
                      j_korny=j+j1;
            
          %
          %periódikus peremek:
            if i_korny==0
               i_korny=N+2;
            elseif i_korny==N+3
               i_korny=1;
            end
            
            if j_korny==0
               j_korny=N+2;
            elseif j_korny==N+3
               j_korny=1;
            end
          %}
                      
                      if pop(i_korny, j_korny)>1 && pop(i_korny, j_korny)<dieAfter
                          korny=korny+1;
                      end
                  end
              end
              if korny*rand>infectionRate %megfertõzõdhet az õt körbevevõ fertõzöttek számától függõen
                  newguy=2;
              end
              
          elseif guy>1 % ha beteg:
              if rand<healRate % bizonyos valószínûséggel meggyógyul és immunis lesz
                  newguy=0; %1;
              else
                  newguy=guy+1; %ha nem gyógyult meg, még betegebb lesz
              end
          end
          
          newpop(i,j)=newguy;
       end
   end
    
    %waitforbuttonpress;
    pause(0.2);
    %update population with the temporary array
    pop = newpop;
    
    %statisztikák:
    s(1,t)=length(find(pop==1));
    b(1,t)=length(find(pop<dieAfter & pop>1));
    r(1,t)=length(find(pop==0));
    d(1,t)=length(find(pop==dieAfter));
end

figure;
t=1:itnum;
plot(t, s/(N^2), t, b/(N^2), t, r/(N^2), t, d/(N^2));
xlabel('lépés');
ylabel('állapot aránya');
legend('fertõzhetõ', 'beteg', 'immunis', 'halott');