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.