SCREEN 19
DIM x AS INTEGER = 99, y AS INTEGER = 36
DIM SHARED AS INTEGER grid(0 TO 100,0 TO 37), _new_grid(0 TO 100, 0 TO 37)
DIM As Integer gen, n, nei, was
RANDOMIZE TIMER
FOR x AS INTEGER = 0 TO 100
FOR y AS INTEGER = 0 TO 37
grid(x,y) = INT(RND*2)
NEXT
NEXT
SUB game(arr() AS INTEGER, was AS INTEGER, nei AS INTEGER, arr2() AS INTEGER)
DIM n AS INTEGER
FOR x AS INTEGER =1 TO 99
FOR y AS INTEGER = 1 TO 36
'IF x-1 < 1 THEN x = 1
'IF x +1 > 99 THEN x = 99
'IF y-1 < 1 THEN y = 1
'IF y +1> 36 THEN y = 36
nei = arr( x - 1, y - 1) +arr( x , y - 1)
nei = nei + arr( x + 1, y -1)
nei = nei + arr( x - 1, y) + arr( x + 1, y)
nei = nei + arr( x - 1, y + 1)
nei = nei + arr( x, y + 1) +arr( x + 1, y + 1)
was =arr( x, y)
If was =0 Then
If nei =3 Then n =1 Else n =0
Else
If nei =3 Or nei =2 Then n =1 Else n =0
End IF
arr2(x,y) = n
NEXT
NEXT
END SUB
SUB swap_grid(arr1() AS INTEGER, arr2() AS INTEGER)
FOR x AS INTEGER = 0 TO 100
FOR y AS INTEGER = 0 TO 37
arr1(x,y) = arr2(x,y)
NEXT
NEXT
END SUB
SUB PRINT_TO_SCREEN(x AS INTEGER, y AS INTEGER, arr()AS integer)
IF (arr(x,y)) = 1 THEN
LOCATE y, x : PRINT CHR(219);
ELSEIF (arr(x,y)) = 0 THEN
LOCATE y, x : PRINT " ";
ENDIF
END SUB
SUB print_grid(grid() AS INTEGER)
FOR x AS INTEGER = 0 TO 100
FOR y AS INTEGER = 0 TO 37
PRINT_TO_SCREEN(x,y,grid())
NEXT
NEXT
END SUB
DIM s AS STRING = "in memory of JOHN HORTON CONWAY 1937 - 2020"
DIM t AS STRING = "CONWAY'S GAME OF LIFE"
LOCATE 15, (LOWORD(WIDTH) - LEN(s)) SHR 1 : PRINT s
LOCATE 18, (LOWORD(WIDTH) - LEN(t)) SHR 1 : PRINT t
SLEEP
CLS
DO
GAME(grid(),was,nei, _new_grid())
sleep 100
SWAP_GRID(grid(),_new_grid())
SLEEP 100
PRINT_GRID(grid())
LOOP UNTIL INKEY = CHR(27)
SLEEP
Hi...
No, you need two arrays. It won't work with one array
At least, that is what I know you are welcome to prove me wrong
hi, aural :)
Take a look at these freebasic examples from FB main forum: https://www.freebasic.net/forum/viewtopic.php?t=29177 (https://www.freebasic.net/forum/viewtopic.php?t=29177)
Quote from: stigma on Jan 14, 2023, 03:47 PMNo, you need two arrays. It won't work with one array
It's absolutely possible to do it with a single one-dimensional array. An example in D (the language I use the most nowadays):
import raylib;
Color rgba(int re, int gr, int bl, int al) {
return Color(cast(ubyte)re, cast(ubyte)gr, cast(ubyte)bl, cast(ubyte)al);
}
void main() {
int x2, y2, l;
uint[1000] tablica;
for (auto x = 0; x < 399; x++) {
l = GetRandomValue(1, 30);
if (l == 1 && (x < 50 || x > 350)) {
tablica[x] = 1;
}
else {
tablica[x] = 0;
}
}
InitWindow(420, 420, "Game of Life");
SetTargetFPS(5);
while (!WindowShouldClose()){
BeginDrawing();
ClearBackground(Color(0, 0, 0, 255));
for (auto x = 0; x < 400; x += 20) {
for (auto y = 0; y < 20; y += 1) {
if (tablica[x + y] == 1) {
DrawCircle(x + 10, y * 20 + 10, 10, rgba(255, 0, 0, 255));
}
else {
DrawCircle(x + 10, y * 20 + 10, 10, rgba(0, 0, 0, 255));
}
}
}
EndDrawing();
for (auto x = 0 ; x < 400; x += 20) {
for (auto y = 0; y < 20; y += 1) {
if (tablica[x + y] == 1) {
l = 0;
x2 = x + 20;
y2 = y + 1;
if (x2 <= 400 && y2 <= 20) {
if (tablica[x2 + y] == 1) {
l++;
}
if (tablica[x + y2] == 1) {
l++;
}
}
x2 = x - 20;
y2 = y - 1;
if (x2 >= 0 && y2 >= 0) {
if (tablica[x2 + y] == 1) {
l++;
}
if (tablica[x + y2] == 1) {
l++;
}
}
if (l == 3 || l ==2) {
tablica[x + 400 + y] = 1;
}
else {
tablica[x + 400 + y] = 0;
}
}
else {
l = 0;
x2 = x + 20;
y2 = y + 1;
if (x2 <= 400 && y2 <= 20) {
if (tablica[x2 + y] == 0) {
l++;
}
if (tablica[x + y2] == 0) {
l++;
}
}
x2 = x - 20;
y2 = y - 1;
if (x2 >= 0 && y2 >= 0) {
if (tablica[x2 + y] == 0) {
l++;
}
if (tablica[x + y2] == 0) {
l++;
}
}
if (l == 3) {
tablica[x + 400 + y] = 1;
}
else {
tablica[x + 400 + y] = 0;
}
}
}
}
for (auto x = 400; x < 799; x++) {
tablica[x - 400] = tablica[x];
}
}
}
@Tomaaz: Well that's cheating. You are simply storing two arrays in one array. At the expense of code readability. And that's even unnecessary because you could have used one array with three dimensions. One dimension each for X, Y, and "generation" for two generations. That would make it possible to make the program even more efficient. Instead of copying the new generation to the old one, it would be possible just to switch the generation index then.