Zasymuluj zarazenie liszajem stosujac tablice NxN komorek skóry

0

Witam.

Mam takie zadanie i nie wiem jak sie za nie zabrac. Pomoglby ktos?

Zasymuluj zarazenie liszajem stosujac tablice NxN komorek skóry. Rozpocznij
od zarazenia srodkowej komórki. Po upływie kolejnej jednostki czasu (np. nacisniecie klawisza) zarazona
komórka ma p (np. 50%) szans zarazenia kazdej ze zdrowych komórek (p - prawdopodobienstwo,
ustalony parametr). Po szesciu jednostkach czasu zarazona komórka
staje sie na cztery jednostki czasu odporna i nastepnie zdrowa.

0

Proste, 2 wymiarowa tablica intów i np. 0 - zdrowa komórka, 6-1 zarażona, przy czym liczba oznacza liczbę dni do ozdrowienia, i (-4,-1) ile dni komórka pozostanie odporna, jeżeli komórka jest zarażona to każdego dnia odejmujemy 1 aż do osiągnięcia szóstego dnia choroby, jeżeli kom jest odporna to dodajemy aż do 0. Wszystko. Można to jeszcze jakoś graficznie elegancko przedstawić.

0

Ok, spróbuje coś napisać chociaż kiepsko to widzę :D Jak coś to jeszcze będę pisał.

0

Google: automat komórkowy

0

Ok, po godzinie z pomocą internetu udało mi się spłodzić coś takiego:

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include "windows.h"
using namespace std;

//----------------------------------------------------
// PROCEDURY I FUNKCJE POMOCNICZE
//----------------------------------------------------

const int BLACK        = 0;
const int BLUE         = 1;
const int GREEN        = 2;
const int CYAN         = 3;
const int RED          = 4;
const int MAGENTA      = 5;
const int BROWN        = 6;
const int LIGHTGRAY    = 7;
const int DARKGRAY     = 8;
const int LIGHTBLUE    = 9;
const int LIGHTGREEN   = 10;
const int LIGHTCYAN    = 11;
const int LIGHTRED     = 12;
const int LIGHTMAGENTA = 13;
const int YELLOW       = 14;
const int WHITE        = 15;

static int __BACKGROUND = BLACK;
static int __FOREGROUND = LIGHTGRAY;

bool random(double prob)
{
    return rand() <  prob * (RAND_MAX + 1);
}


void textbackground(int color)
{
  __BACKGROUND = color;
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    __FOREGROUND + (color << 4));
}

void textcolor(int color)
{
  __FOREGROUND = color;
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    color + (__BACKGROUND << 4));
}

void gotoxy(int x, int y)
{
  COORD c;
  c.X = x - 1;
  c.Y = y - 1;
  SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}

int main(int argc, char *argv[])
{   
    int x = 13;
    int y = 13;
    int n = 13;
    int m = 13;
    int p = 50;
    int licznik = 0;
    int liszaj[n][m];
    int tym[n][m];
    int i,j,wybor,liczba;
    
    //Zerowanie elementów tablicy
    
    for (i=0;i<n;i++)
    {
        for (j=0;j<m;j++)
        {
            liszaj[i][j]=0;
            tym[i][j]=0;
        }
    }
    
    //Menu programu
        textbackground(BLUE);
        for (i=0;i<2*x;i++)
                {
                for (j=0;j<y;j++)
                        {
                        gotoxy(i+30,j+3);
                        if (i==0 || i==2*x-1  || j==0 || j==y-1)
                        cout << ("*");
                        else
                        cout << (" ");
                        }
               }
    //Opcje menu
        gotoxy(33,5);
        cout << ("Symulacja Liszaja");
        gotoxy(33,8);
        cout << ("1.Start");
        gotoxy(33,9);
        cout << ("2.Wyjdz");
        gotoxy(33,11); 
        
    //Wybór opcji
    
    cin >> wybor;
    cout << endl << endl << endl;
    switch (wybor)
    {
           case 1:
                {
                  textbackground(BLACK);
                  liszaj[6][6]=1;
                  system("cls");
                  break;
                }
                
           case 2:
                {
                  return 0;
                  break;
                }
    }
                                    
                
    //Wyswietlenie pierwszej zarazonej komorki
        for (i=1;i<n-1;i++)
                {
                 for (j=1;j<m-1;j++)
                        {
                         textbackground(GREEN);
                         if (liszaj[i][j]==1)
                         textbackground(RED);
                         gotoxy(i+34,j+3);
                         cout << (" ");
                        }
                  textbackground(BLACK);
                }
        getch();
    {
    liszaj:
        system ("cls");
        licznik++;
        for (i=1;i<n-1;i++)
        {
                for (j=1;j<m-1;j++)
                {if (liszaj[i][j]>0 && liszaj[i][j]<7)
                        {
                        // warunki zarazenia sasiednich komorek
                        if (i!=0 && i!=n && j!=0 && j!=n)
                        {
                        if (liszaj[i-1][j]==0)
                        if (random(p)==1)
                        tym[i-1][j]=1;

                        if (liszaj[i][j-1]==0)
                        if (random(p)==1)
                        tym[i][j-1]=1;

                        if (liszaj[i][j+1]==0)
                        if (random(p)==1)
                        tym[i][j+1]=1;

                        if (liszaj[i+1][j]==0)
                        if (random(p)==1)
                        tym[i+1][j]=1;
                        }
                        tym[i][j]=++liszaj[i][j];}
                //komorka jest odporna i coraz blizsza uzdrowienia
                else
                if (liszaj[i][j]>6 && liszaj[i][j]<10)
                        tym[i][j]=++tym[i][j];
                //przejscie w stan uzdrowienia
                else
                if (liszaj[i][j]==10)
                liszaj[i][j]=0;}
        }

        //z tablicy tymczasowej do podstawowej
        for (i=1;i<n-1;i++)
                {
                for (j=1;j<m-1;j++)
                {liszaj[i][j]=tym[i][j];
                tym[i][j]=0;}
                }

        //wyswietlanie Liszaja
        for (i=1;i<n-1;i++)
                {
                for (j=1;j<m-1;j++)
                        {
                        if (liszaj[i][j]==0)
                        textbackground(GREEN);
                        if (liszaj[i][j]>0 && liszaj[i][j]<7)
                        textbackground(RED);
                        if (liszaj[i][j]>6 && liszaj[i][j]<11)
                        textbackground(YELLOW);
                        gotoxy(i+34,j+3);
                        cout << (" ");
                        }
                textbackground(BLACK);
                }
        getch();
        
        //sprawdzenie czy wszystkie komorki sa zdrowe
        int spr=0;
        for (i=1;i<n-1;i++)
                {
                for (j=1;j<m-1;j++)
                if (liszaj[i][j]==0)
                spr++;
                else
                break;
                }
        if (spr==121)
        {
        system ("cls");
        cout << "\n\n\n";
        cout << "    Liszaj zostal uzdrowiony po %d jednostkach czasu! Koniec symulacji" << licznik;
        getch();
        return EXIT_SUCCESS;
        }

        goto liszaj;
        }
        return 0;
}

Mógłby ktoś to przerobić tak aby działało poprawnie? Niby symuluje liszaja ale zapętla się w kółko (nie bierze pod uwagę prawdopodobieństwa zarażenia - 50%) i nigdy nie dochodzi do uzdrowienia.

0

bump

0

Pomoże ktoś? :(

2

Większość twojego kodu jest w jednym wielkim mainie, co gorsza używasz jeszcze goto. Podziel swój program na funkcje (jak nie wiesz jakiej wielkości to przyjmij że 20 linii to maks) to najprawdopodobniej sam znajdziesz błąd, a jak nie to innym będzie prościej Ci pomóc (szczerze nie chce mi się wczytywać dokładnie jak w tym wielkim bloku kodu dokładnie działa program).

0

poradziłem sobie sam

0

bump

1 użytkowników online, w tym zalogowanych: 0, gości: 1