game of life
Posted: Mon Dec 29, 2008 2:12 am
в общем вот, решил накодить игру "жизнь".
из вики правила:
из вики правила:
прога пока альфа или по крайней мере ver. 0.1, т.к. сделан минимум: мышью или стилусом меняем состояние клеток, любая хард кнопка начинает / отрубает симуляцию. буду доделывать: хочу снизу панельку сделать типа вкл.\выкл., возможно запись в гиф, может еще подгрузка тайлов любых, посмотрим что сделаю...Место действия этой игры — «вселенная» — это размеченная на клетки поверхность, безграничная, ограниченная, или замкнутая. В компьютерных реализациях игры чаще всего используют поверхность тора. Каждая клетка на этой поверхности может находиться в двух состояниях: быть живой или быть мёртвой. Клетка имеет восемь соседей. Распределение живых клеток в начале игры называется первым поколением. Каждое следующее поколение рассчитывается на основе предыдущего по таким правилам:
пустая (мёртвая) клетка ровно с тремя живыми клетками-соседями оживает;
если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае (если соседок меньше двух или больше трёх) клетка умирает (от «одиночества» или от «перенаселённости»).
Игрок не принимает прямого участия в игре, а лишь расставляет «живые» клетки, которые взаимодействуют согласно правилам уже без его участия.
Эти простые правила приводят к огромному разнообразию форм, которые могут возникнуть в игре.
Code: Select all
//------------------------------------------------------------
// Conway's Game of Life
//------------------------------------------------------------
w = 240
h = 320
init_pics
init_vars
clear(#ffffff)
draw:
handle_pen_keys(st_down, 0, 0)
handle_hard_keys(hk_down, 0)
paint
if (active = 1)
{
next_matrix
}
frame(100)
goto draw
//------------------------------------------------------------
//запуск / стоп по кнопке
//------------------------------------------------------------
hk_down:
if (active = 0)
{
active = 1
}
else
{
active = 0
}
ret
//------------------------------------------------------------
//смена состояния клетки вручную
//------------------------------------------------------------
st_down:
j = (gpx + w / 2) / step
i = (gpy + h / 2) / step
if (i >= 0 & i < col_sz & j >= 0 & j < row_sz)
{
if (matrix[j + i * row_sz] = 1)
{
matrix[j + i * row_sz] = 0
}
else
{
matrix[j + i * row_sz] = 1
}
}
ret
//------------------------------------------------------------
//прорисовка
//------------------------------------------------------------
paint:
i = 0
while(i < col_sz)
{
j = 0
while(j < row_sz)
{
if (matrix[j + i * row_sz] = 0)
{
fpixi(cell, -w / 2 + step / 2 + j * step, -h / 2 + step / 2 + i * step, 1, 0, 0)
}
else
{
fpixi(cell, -w / 2 + step / 2 + j * step, -h / 2 + step / 2 + i * step, 1, 0, 1)
}
j + 1
}
i + 1
}
ret
//------------------------------------------------------------
//основное - получить из текущего поколения следующее
//------------------------------------------------------------
next_matrix:
i = 0
while(i < col_sz)
{
j = 0
while(j < row_sz)
{
sum = 0
k = 0
while(k < 8)
{
newj = j + off_matrix[2 * k]
newi = i + off_matrix[2 * k+1]
if (newi >=0 & newi < col_sz & newj >= 0 & newj < row_sz)
{
sum = sum + matrix[newi * row_sz + newj]
}
k + 1
}
if (sum = 3 | (sum = 2 & matrix[i * row_sz + j] = 1))
{
new_matrix[i * row_sz + j] = 1
}
else
{
new_matrix[i * row_sz + j] = 0
}
j + 1
}
i + 1
}
i = 0
while(i < col_sz)
{
j = 0
while(j < row_sz)
{
matrix[i * row_sz + j] = new_matrix[i * row_sz + j]
j + 1
}
i + 1
}
ret
//------------------------------------------------------------
//инициализация переменных
//------------------------------------------------------------
init_vars:
row_sz = w / step
col_sz = h / step
matrix = new_array(row_sz * col_sz)
new_matrix = new_array(row_sz * col_sz)
off_matrix = new_array(16)
i = 0
while(i < row_sz * col_sz)
{
matrix[i] = 0
i + 1
}
off_matrix[0] = -1 off_matrix[1] = -1 off_matrix[2] = 0 off_matrix[3] = -1 off_matrix[4] = 1 off_matrix[5] = -1
off_matrix[6] = -1 off_matrix[7] = 0 off_matrix[8] = 1 off_matrix[9] = 0
off_matrix[10] = -1 off_matrix[11] = 1 off_matrix[12] = 0 off_matrix[13] = 1 off_matrix[14] = 1 off_matrix[15] = 1
simulate = 0
ret
//------------------------------------------------------------
//инициализация спрайтов
//------------------------------------------------------------
init_pics:
b = #5050ff
s = #000000
d = #4030c0
l = #50d050
cell = "
.333333333333333333.
3dddddddddddddddddd3
3dddddddddddddddddd3
3dd0ddd0dddd0ddd0dd3
3ddd0d0dddddd0d0ddd3
3dddd0dddddddd0dddd3
3ddd0d0dddddd0d0ddd3
3dd0ddd0dddd0ddd0dd3
3dddddddddddddddddd3
3dddddddddddddddddd3
3dddddddddddddddddd3
3dddddddddddddddddd3
3dddddd000000dddddd3
3dddd00dd0b0b00dddd3
3ddd0dddd0b0b0d0ddd3
3dd0ddddd0bbb0dd0dd3
3dd0dddddd000ddd0dd3
3dddddddddddddddddd3
3dddddddddddddddddd3
.333333333333333333.
+
.333333333333333333.
3llllllllllllllllll3
3llllllllllllllllll3
3lll000llllll000lll3
3ll00050llll00050ll3
3ll00000llll00000ll3
3ll00000llll00000ll3
3lll000llllll000lll3
3llllllllllllllllll3
3llllllllllllllllll3
3llllllllllllllllll3
3llllllllllllllllll3
3ll0llllllllllll0ll3
3ll0llllllllllll0ll3
3lll0llllllllll0lll3
3llll00llllll00llll3
3llllll000000llllll3
3llllllllllllllllll3
3llllllllllllllllll3
.333333333333333333.
"
make_pixi(cell)
step = get_pixi_xsize(cell)
ret