:: Игры Разума
Игра "Жизнь"
AnatolyS
Автор

Сообщений: 4565
Откуда: Санкт-Петербург
Дата регистрации: 21.01.2002
Правила (ru.wikipedia.org):
1) Соседями клетки считаются все клетки, находящиеся в восьми ячейках, располженных рядом с данной по горизонтали, вертикали или диагонали
2) Если у некоторой клетки меньше двух соседей, она погибает от одиночества. Если клетка имеет больше трех соседей, она погибает от тесноты
3) Если рядом с пустой ячейкой окажется ровно три соседние клетки жизни, то в этой ячейке рождается новая клетка
4) Гибель и рождение происходят в момент смены поколений. Таким образом, гибнущая клетка может способствовать рождению новой, но рождающаяся клетка, уменьшив локальную плотность населения, не может предотвратить гибель другой

Есть предложение провести конкурс на самое элегантное решение на фоксе. Думаю, графика не обязательна, хотя не запрещается.


------------------
Мы будем ждать пока не кончится время
И встретимся после конца (с) A




Исправлено 1 раз(а). Последнее : AnatolyS, 05.02.08 12:10
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
Prudivus

Сообщений: 4283
Откуда: Кишинев
Дата регистрации: 14.12.2006
Лет двадцать назад издавалась книжка Гарднера (одна из), где описывалась в том числе и эта игра. При определенных условиях там может действительно возникнуть что-то жизнеобразное: самодвижущиеся структуры, поглощающие другие, более мелкие или статичные структуры...
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Все равно в условия не въехал - и плодится и тут же умирает
Это как в анекдоте
- Вовчка что делают амебы после того как делятся ?
- Одна из них поворачивается на бок и храпит

Объясните ТЗ на пальцах а посмотрим - если то что я сразу представил в голове, будет жизнеспособным и элегантным - то покажу, если нет - тогда просто промолчу


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
AnatolyS
Автор

Сообщений: 4565
Откуда: Санкт-Петербург
Дата регистрации: 21.01.2002
piva
Все равно в условия не въехал - и плодится и тут же умирает Это как в анекдоте
- Вовчка что делают амебы после того как делятся ?
- Одна из них поворачивается на бок и храпит

Объясните ТЗ на пальцах а посмотрим - если то что я сразу представил в голове, будет жизнеспособным и элегантным - то покажу, если нет - тогда просто промолчу

Демонстрация как это должно работать: www.math.com


------------------
Мы будем ждать пока не кончится время
И встретимся после конца (с) A
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
На фоксе главная трудность будет - бесконечный размер доски. Предлагаю его ограничить, скажем 50 х 50. А чтобы было интересней, зациклить доску, т.е. считать самую левую точку в строке и самую правую соседями, а также самую верхнюю и самую нижнюю. Тогда эту игру можно будет назвать "Жизнь на торе".
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
AnatolyS
Автор

Сообщений: 4565
Откуда: Санкт-Петербург
Дата регистрации: 21.01.2002
leonid
На фоксе главная трудность будет - бесконечный размер доски. Предлагаю его ограничить, скажем 50 х 50. А чтобы было интересней, зациклить доску, т.е. считать самую левую точку в строке и самую правую соседями, а также самую верхнюю и самую нижнюю. Тогда эту игру можно будет назвать "Жизнь на торе".

Давайте условно беспонечный - размерность integer. 50x50 - очень маленькое поле.


------------------
Мы будем ждать пока не кончится время
И встретимся после конца (с) A




Исправлено 1 раз(а). Последнее : AnatolyS, 05.02.08 13:57
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Вообще-то размер доски в фоксе будет ограничем размером DBF или размером оперативки, в зависимости от алгоритма


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Если держать поле в массивах, то ничего фоксовского в таком алгоритме не будет - в точности то же, что и в других языках. А это не интересно, поскольку алгоритмы давно опубликованы. Интересно, если поле запихнуть в dbf-ник. Тогда можно будет использовать фоксовский SQL. Но для этого поле не должно быть очень большим. А зацикливание создает эмуляцию бесконечного поля.
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Можне перебирать несколько табл одного формата - тогда скока места на диске хватит

Цитата:
Если держать поле в массивах, то ничего фоксовского в таком алгоритме не будет
Как раз сперва я подумал об коллекции объектов - а не о массиве


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
AnatolyS
Автор

Сообщений: 4565
Откуда: Санкт-Петербург
Дата регистрации: 21.01.2002
leonid
Если держать поле в массивах, то ничего фоксовского в таком алгоритме не будет - в точности то же, что и в других языках. А это не интересно, поскольку алгоритмы давно опубликованы. Интересно, если поле запихнуть в dbf-ник. Тогда можно будет использовать фоксовский SQL. Но для этого поле не должно быть очень большим. А зацикливание создает эмуляцию бесконечного поля.

Задача не запрограммировать уже опубликованный аглоритм, а решить эту задачу средствами фокса, не читая опубликованных алгоритмов. А запрограммировать то, что кто-то написал - это как-то не по джентельменски.


------------------
Мы будем ждать пока не кончится время
И встретимся после конца (с) A
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Лисапед изобретать? Не интересно. Вот если почитать опубликованное (ну хотя-бы то что на первой странице гугла находится) и сделать КАРДИНАЛЬНО отличающийся алгоритм (не модификацию типа - у них по строкам и столбцам а у меня по столбцам и строкам - вот и всё новизна - тогда да, может быть какой-то интерес...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
piva

Сообщений: 18655
Откуда: Курган
Дата регистрации: 24.03.2004
Это не интересно тем кто этот алгоритм знает, а я например нет.
Хотел построить модель "жизни" на объектах с использованием неявных циклов, при этом в программе хранится только инфа о "живых" клетах, остальное нас не интересует. Но встали подводные камни, в виде полной деградации скорости. Вот код примерный без логики игры, но использования неявного цикла SetAll
o=CreateObject("Form1")
timer=Seconds()
For i=1 to 2000
o.Add(i,i)
Next
? o.Count,'objects added',Seconds()-timer
timer=Seconds()
o.All()
? 'SetAll loop', Seconds()-timer
timer=Seconds()
For each o in o.aCol
o.Draw()
Next
? 'For each loop',Seconds()-timer
timer=Seconds()
Release o
? 'Release objects',Seconds()-timer
Define Class form1 as Form
Dimension aCol[1]
count=0
Procedure Add(x,y)
With this
.Count=.Count+1
Dimension .aCol[.Count]
this.AddObject(".aCol[.Count]","xx",x,y)
EndWith
Procedure All
With this
.SetAll("Drawing",.T.)
EndWith
EndDefine
Define Class xx as Shape
x=0
y=0
Drawing=.F.
Procedure init(x,y)
With this
.x=x
.y=y
EndWith
Procedure Drawing_Assign(lVal)
this.Draw()
Procedure Draw(l)
this.x=this.x
EndDefine

Вариант №2 - когда все инфа по "живым" клеткам хранится в курсоре, быстро, но мне менее интересно


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
У меня такой вариант получился
(В зависимости от версии фокса надо Doevents или Doeventd force использовать)
SET ESCAPE ON
LOCAL m.i, m.cc, oForm
CREATE CURSOR n1 (n i)
FOR i=-200 TO 200
INSERT INTO n1 VALUES (i)
NEXT
CREATE CURSOR p1 (x i, y i)
*!* * variant 1
*!* INSERT INTO p1 VALUES (0,1)
*!* INSERT INTO p1 VALUES (0,0)
*!* INSERT INTO p1 VALUES (0,-1)
*!* * variant 2
*!* INSERT INTO p1 VALUES (0,0)
*!* INSERT INTO p1 VALUES (0,1)
*!* INSERT INTO p1 VALUES (0,2)
*!* INSERT INTO p1 VALUES (1,2)
*!* INSERT INTO p1 VALUES (2,1)
* variant 3
RAND(-1)
FOR i=1 TO 70
INSERT INTO p1 VALUES (rnd(-5,5), rnd(-5,5))
NEXT
SELECT distinct x, y FROM p1 INTO CURSOR p2
m.cc=0
oForm=CREATEOBJECT("MyForm")
oForm.redraw()
oForm.Show(0)
DECLARE Sleep IN WIN32API Integer
DO WHILE _tally>0
m.cc=m.cc+1
WAIT WINDOW ALLTRIM(STR(m.cc)) NOWAIT
DO move
oForm.redraw()
DOEVENTS force
* DOEVENTS
ENDDO
PROCEDURE move
SELECT MIN(x) as x1, MAX(x) as x2, MIN(y) as y1, MAX(y) as y2 FROM p2 INTO CURSOR m1
SELECT n1.n as x, n2.n as y FROM n1, n1 n2 ;
WHERE n1.n between m1.x1-1 AND m1.x2+1 AND n2.n between m1.y1-1 AND m1.y2+1 INTO CURSOR nk
SELECT nk.x, nk.y FROM nk, p2 ;
WHERE ABS(p2.x-nk.x)=1 AND ABS(p2.y-nk.y)=1 OR ABS(p2.x-nk.x)+ABS(p2.y-nk.y)=1 ;
GROUP BY 1,2 HAVING COUNT(*)=3 INTO CURSOR nkc
SELECT p2.x, p2.y FROM p2, p2 p3;
WHERE ABS(p2.x-p3.x)=1 AND ABS(p2.y-p3.y)=1 OR ABS(p2.x-p3.x)+ABS(p2.y-p3.y)=1 ;
GROUP BY 1,2 HAVING COUNT(*) in (2,3) INTO CURSOR pc
SELECT * FROM nkc UNION select * FROM pc INTO CURSOR p2
RETURN
FUNCTION rnd
lparameter m.n1, m.n2
local m.n3, m.n4, m.it, m.rn
m.n3=int(m.n1)
m.n4=int(m.n2)
if m.n3>m.n4
return -1
endif
if m.n3=m.n4
return m.n3
endif
m.it=m.n4-m.n3+1
m.rn=m.n4+1
do while m.rn>m.n4
m.rn=m.n3+int(rand()*m.it)
enddo
return m.rn
DEFINE CLASS MyForm as Form
width=600
height=600
forecolor=0
backcolor=RGB(128,128,128)
fillcolor=0
fillstyle=0
scalemode=3
caption="Ostanavlivatj escape-om"
PROCEDURE clear_box
This.fillcolor=RGB(128,128,128)
This.Box(0,0,600,600)
This.FillColor=0
PROCEDURE draw_point
LPARAMETERS x,y
This.circle(3,300+x*6,300+y*6)
PROCEDURE redraw
This.LockScreen=.t.
This.clear_box
SELECT p2
SCAN
This.draw_point(p2.x,p2.y)
ENDSCAN
This.LockScreen=.f.
ENDDEFINE
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
AnatolyS
Автор

Сообщений: 4565
Откуда: Санкт-Петербург
Дата регистрации: 21.01.2002
Хорошое решение, но все равно вы привязались к конкретному размеру поля [-200, 200]x[-200, 200].

Если ввести вспомогательную таблицу:

create cursor nb (int dx, int dy)
insert into nb values (-1, -1)
insert into nb values (-1, 0)
insert into nb values (-1, 1)
insert into nb values ( 0, 1)
insert into nb values ( 0, -1)
insert into nb values ( 1, 1)
insert into nb values ( 1, 0)
insert into nb values ( 1, -1)

Можно обойтись без поиска максимумов и без таблицы n1.

Например, все соседи существующих клеток (включая и ныне живущих):

select distinct p2.x + n.dx as x, p2.y + n.dy as y ;
from p2, nb

Ну, а дальше без труда можно завершить начатое

Спасибо!


------------------
Мы будем ждать пока не кончится время
И встретимся после конца (с) A




Исправлено 3 раз(а). Последнее : AnatolyS, 08.02.08 14:07
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
leonid

Сообщений: 3202
Откуда: Рига
Дата регистрации: 03.02.2006
Да, так действительно получше будет. Вот новый вариант
SET ESCAPE ON
LOCAL m.i, m.cc, oForm
create cursor nb (dx i, dy i)
insert into nb values (-1, -1)
insert into nb values (-1, 0)
insert into nb values (-1, 1)
insert into nb values ( 0, 1)
insert into nb values ( 0, -1)
insert into nb values ( 1, 1)
insert into nb values ( 1, 0)
insert into nb values ( 1, -1)
CREATE CURSOR p1 (x i, y i)
*!* * variant 1
*!* INSERT INTO p1 VALUES (0,1)
*!* INSERT INTO p1 VALUES (0,0)
*!* INSERT INTO p1 VALUES (0,-1)
*!* * variant 2
*!* INSERT INTO p1 VALUES (0,0)
*!* INSERT INTO p1 VALUES (0,1)
*!* INSERT INTO p1 VALUES (0,2)
*!* INSERT INTO p1 VALUES (1,2)
*!* INSERT INTO p1 VALUES (2,1)
* variant 3
RAND(-1)
FOR i=1 TO 70
INSERT INTO p1 VALUES (rnd(-5,5), rnd(-5,5))
NEXT
SELECT distinct x, y FROM p1 INTO CURSOR p2
m.cc=0
*SET STEP ON
oForm=CREATEOBJECT("MyForm")
oForm.redraw()
oForm.Show(0)
DECLARE Sleep IN WIN32API Integer
DO WHILE _tally>0
m.cc=m.cc+1
WAIT WINDOW ALLTRIM(STR(m.cc)) NOWAIT
DO move
oForm.redraw()
DOEVENTS force
* DOEVENTS
ENDDO
PROCEDURE move
select distinct p2.x + nb.dx as x, p2.y + nb.dy as y ;
from p2, nb into cursor nk
SELECT nk.x, nk.y FROM nk, p2 ;
WHERE ABS(p2.x-nk.x)=1 AND ABS(p2.y-nk.y)=1 OR ABS(p2.x-nk.x)+ABS(p2.y-nk.y)=1 ;
GROUP BY 1,2 HAVING COUNT(*)=3 INTO CURSOR nkc
SELECT p2.x, p2.y FROM p2, p2 p3;
WHERE ABS(p2.x-p3.x)=1 AND ABS(p2.y-p3.y)=1 OR ABS(p2.x-p3.x)+ABS(p2.y-p3.y)=1 ;
GROUP BY 1,2 HAVING COUNT(*) in (2,3) INTO CURSOR pc
SELECT * FROM nkc UNION select * FROM pc INTO CURSOR p2
RETURN
FUNCTION rnd
lparameter m.n1, m.n2
local m.n3, m.n4, m.it, m.rn
m.n3=int(m.n1)
m.n4=int(m.n2)
if m.n3>m.n4
return -1
endif
if m.n3=m.n4
return m.n3
endif
m.it=m.n4-m.n3+1
m.rn=m.n4+1
do while m.rn>m.n4
m.rn=m.n3+int(rand()*m.it)
enddo
return m.rn
DEFINE CLASS MyForm as Form
width=600
height=600
forecolor=0
backcolor=RGB(128,128,128)
fillcolor=0
fillstyle=0
scalemode=3
caption="Ostanavlivatj escape-om"
PROCEDURE clear_box
This.fillcolor=RGB(128,128,128)
This.Box(0,0,600,600)
This.FillColor=0
PROCEDURE draw_point
LPARAMETERS x,y
This.circle(3,300+x*6,300+y*6)
PROCEDURE redraw
This.LockScreen=.t.
This.clear_box
SELECT p2
SCAN
This.draw_point(p2.x,p2.y)
ENDSCAN
This.LockScreen=.f.
ENDDEFINE
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
Sergio

Сообщений: 438
Откуда: Донецк
Дата регистрации: 16.06.2005
А я эту игру запрограммировал ещё на БК 0010-01 в школе ))))) Я круто писал на Бейсик_Вильнюс )))))
Полем для точек были пиксели монитора - телевизор Электроника 404 вроде )))
Хаааарошая машина была - БК 0010-01 ))) Бейсик_Вильнюс Вроде занимал 28 Кб ПЗУ. А ОЗУ вроде был 16 Кб. В общем, память как у Буратино.
Может, помнит кто этот суперкомпьютер? ))) Ну не могу удержаться от улыбки. )))

ДА! А ещё до БК-шки у меня был другой суперкомпьютер - ПМК - МК-61 )))



Исправлено 3 раз(а). Последнее : Sergio, 06.06.08 14:25
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Полет на Луну на МК-61 программировал? Или что-то подобное... :beer2:


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Игра "Жизнь"
Sergio

Сообщений: 438
Откуда: Донецк
Дата регистрации: 16.06.2005
sphinx
Полет на Луну на МК-61 программировал? Или что-то подобное... :beer2:
Да, и вообще все игры из "Техника-Молодёжи" и "Наука и жизнь" ))) Типа "Охота на лис", лабиринт ...
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 2 (Гостей: 2)

© 2000-2024 Fox Club 
Яндекс.Метрика