Когда я впервые программировал "Жизнь" на своём
первом компьютере Размер обрабатываемой колонии я тогда задал 40х30 с запасом, а размер экрана был 32х24 клетки. И сносно работало лишь на ассемблере. Но даже в таком малом поле можно было ставить эксперименты исследуя "жизнь".
Сейчас я буду использовать разрешение 1024х768, а клетки буду отображать кружками. Радиус крога 8 пикселей,и два пикселя отступ - на экран поместится 126х94 клеток. Массива 150х150 пока хватит с лихвой.
dim shared life(0 to 151, 0 to 151) as byte
в массиве будут хранится значения: 0-пустая клетка, 1-занята.
Константы для размеров клетки:
const R as integer =4
const K as integer =2
Нам ещё понадобится функция которая находит количество соседей у конкретной клетки.
function s(x as integer, y as integer) as integer
return 2
end function
пока что это функция-заглушка, т.е. она есть, её вызывать можно, но делает она... вернее ничего не делает. При написании программ это часто используют.
В данном случае я быстро хотел получить результат - колонию на экране - подобрать размер клетки и всей колонии.
А теперь можно и написать саму функцию подсчёта. s-соседи, количество соседей.
координаты соседей клетки в (x,y) это уже было в "Морском бое".
А так как в массиве только нули да единицы - значения элементов массива нужно просуммировать.
что же делать если мы нашли пустую клетку у которой трое соседей - нужно эту пустую клетку заселить..., но ведь это повлияет на последующие подсчёты...
Тогда я использовал два массива: один обрабатывался(текущее поколение), а в втором строилось следующее поколение, которое пока никак не влияет на текущее.
Нужно до начала обработки текущего поколения перекопировать предыдущий массив(ранее построенное поколение) в текущий массив(обрабатываемый)
for x=0 to XX+1
for y=0 to YY+1
life(x,y)=lifenew(x,y)
next y
next x
for x=0 to XX+1
for y=0 to YY+1
if s(x,y)=3 and life(x,y)=0 then lifenew(x,y)=1
if (life(x,y)<2 or life(x,y)>3) and life(x,y)=1 then lifenew(x,y)=0
next y
next x
одно поколение прошло, теперь поставим небольшую паузу и перейдём к следующей итерации.(цикл)
dim shared life(0 to 151, 0 to 151) as byte
dim shared lifenew(0 to 151, 0 to 151) as byte
dim as integer x,y,i
const R as integer =4
const K as integer =2
const XX as integer = 126
const YY as integer = 94
function s(x as integer, y as integer) as integer
return life(x-1,y-1)+life(x,y-1)+life(x+1,y-1)+_
life(x-1,y)+life(x+1,y)+_
life(x-1,y+1)+life(x,y+1)+life(x+1,y+1)
end function
screenres 1024,768
lifenew(10,10)=1:lifenew(10,11)=1:lifenew(10,12)=1
lifenew(40,20)=1:lifenew(40,21)=1:lifenew(40,22)=1
do
for x=0 to XX+1
for y=0 to YY+1
life(x,y)=lifenew(x,y)
next y
next x
for x=0 to XX+1
for y=0 to YY+1
if s(x,y)=3 and life(x,y)=0 then lifenew(x,y)=1
if (s(x,y)<2 or s(x,y)>3) and life(x,y)=1 then lifenew(x,y)=0
next y
next x
sleep 500
cls
for x=0 to XX+1
for y=0 to YY+1
if life(x,y)=1 then circle(2*R*x+K,2*R*y+K),R*0.7,2:paint(2*R*x+K,2*R*y+K),2,2
next y
next x
loop while asc(inkey())<>27
программа завершит работу при нажатии ESC
Введём в программу ещё две переменные: поколение(ход) и размер популяции(количество клеток)
do
rpop=0: pok+=1
for x=0 to XX+1
for y=0 to YY+1
life(x,y)=lifenew(x,y)
rpop=rpop+life(x,y)
next y
next x
.....
.....
locate 1,1: print using "pokolenie ###"; pok
locate 2,1: print using "size ###"; rpop
if rpop=0 then print "the end": exit do
loop while asc(inkey())<>27
Можно ли такую программу в умном контракте воплотить?
В Waves выделен пул наград для разработчиков игр. Не хотите поучаствовать?
@sergiy, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующих категориях:
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
spinner, littleboo, ianboil, francisgrey, strecoza, mishka, sergiy, neo, vako, rbrown, gildar, ovchinnikov, andrvik, max-max, zoss, dikaniovs, dimarss, la-bella-vita, tristamoff, kilobucks, ohlamoon, maksina, yurgent71, zlody, dr-boo, amikphoto, arsar, volv, nefer, borodaus, turkish-r, renat242, oceanotechnic, markvial, nikalaich, gans91, gromozeka, drim, gryph0n, voltash, ladynazgool, ladykosha, rubin, francesco, exan, retoldname, stranniksenya, alikssandra, gapel, polyakov, acidgarry, kvg, oagalakova, borisss, candy777, sterh, olga-fink, virt, dobryj.kit, kondratij, optimist, yurchello, dayver, bammbuss, dmitrijv, seagull15, bombo, manavendra, mr-nikola, ondantr, nerengot, dim447, vladsm, mirgais, varja, upper, prifix, ili, mp42b, abloud, dignityinside, process, atvalevsky, nikulinsb, d0z4t0r, kanalex, tulencha, amalinavia, kito-boy, nikitosuna, sansey, izbushka, astramar, onur1s, cryptovisitor, zelivsky, html, vredinka2345, fxmonster, kash47, ezavarov, makcl, marina-spring, azarovskiy, funt33, brainmechanic, sinilga, samael27, kalter, valen-tina, mister-omortson, apnigrich, siddxa, cryptobandera, photofreediver, maryatekun, lologom, delectat, prezza, yroslav94, akva22, worthless-man, tyi-ra, elcpa, dobrotanya, boliwar, veta-less, irkinmick, wmforum, jpigeon84, svetozarhobbot, archual, automedia, alexxela, fatima, burger-knig, zirodin, cryptenthusiast, veterperemen, flint
Поэтому я тоже проголосовал за него!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
spinner, littleboo, ianboil, francisgrey, strecoza, mishka, sergiy, neo, vako, rbrown, gildar, ovchinnikov, andrvik, max-max, zoss, dikaniovs, dimarss, la-bella-vita, tristamoff, kilobucks, ohlamoon, maksina, yurgent71, zlody, dr-boo, amikphoto, arsar, volv, nefer, borodaus, turkish-r, renat242, oceanotechnic, markvial, nikalaich, gans91, gromozeka, drim, gryph0n, voltash, ladynazgool, ladykosha, rubin, francesco, exan, retoldname, stranniksenya, alikssandra, gapel, polyakov, acidgarry, kvg, oagalakova, borisss, candy777, sterh, olga-fink, virt, kondratij, optimist, yurchello, dayver, bammbuss, dmitrijv, seagull15, bombo, manavendra, mr-nikola, ondantr, nerengot, dim447, vladsm, mirgais, varja, upper, prifix, ili, mp42b, abloud, dignityinside, process, atvalevsky, nikulinsb, d0z4t0r, kanalex, tulencha, amalinavia, kito-boy, nikitosuna, sansey, izbushka, astramar, onur1s, cryptovisitor, zelivsky, html, vredinka2345, fxmonster, kash47, ezavarov, makcl, marina-spring, azarovskiy, funt33, brainmechanic, sinilga, samael27, kalter, valen-tina, mister-omortson, apnigrich, siddxa, cryptobandera, photofreediver, maryatekun, lologom, delectat, prezza, yroslav94, akva22, worthless-man, tyi-ra, elcpa, dobrotanya, boliwar, veta-less, irkinmick, wmforum, jpigeon84, svetozarhobbot, archual, automedia, alexxela, fatima, burger-knig, zirodin, cryptenthusiast, veterperemen, flint
Поэтому я тоже проголосовал за него!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
✅
Сюда приплывал Моби Дик