Форум программистов, компьютерный форум, киберфорум
Наши страницы
zink0000
Войти
Регистрация
Восстановить пароль
Сарай №XII
(Юрий Зинковский)

Мой блог.
Оценить эту запись

Игра "Жизнь"

Запись от zink0000 размещена 28.07.2016 в 11:24

Программа - игра "Жизнь" (Game of Life).

Алгоритм этой программы был изложен в журнале Scientific American (Martin Gardner - статья Mathematical games
- журнал Scientific American за октябрь 1970 года, страница 120).

Напомню правила расчёта следующего шага развития популяции, если кто забыл:

1. Обитатель ячейки выживает, если рядом есть две или три занятые соседние ячейки. Соседними считаются ячейки,
которые имеют общую сторону или общую вершину.

2. Обитатель ячейки погибает и ячейка становится незанятой, если она окружена четырьмя и более занятыми ячейками (перенаселение), а также если около неё имеется только одна соседняя обитаемая ячейка или вообще нет соседей (изоляция).

3. Рождение в незанятой ячейке происходит только в том случае, если около этой ячейки имеются ровно три соседние обитаемые ячейки.


Игра происходит на поверхности, которая условно считается бесконечной. На самом деле это конечная прямоугольная плоскость, верхняя граница которой соединяется с нижней, а левая граница - с правой. То есть на поверхности тора.

Генерируем случайную начальную популяцию. Занятые поля на экране обозначаются звёздочками, в то время как незанятые поля остаются тёмными. (По крайней мере, так было в оригинале.) Из начальной популяции развивается следующее поколение в соответствии с вышеназванными правилами.

Кстати, эта программа не так уж и бесполезна и может быть использована для решения научных задач (конечно, с другими правилами), к примеру для моделирования процессов фазовых превращений.

Движок игры, если в данном случае так можно выразится это:
Visual Basic
1
2
3
4
5
6
7
' Таблица выживания и гибели (заполнение)
For iI = 1 To 17
  iL(iI) = 0
Next iI
iL(3) = 1
iL(11) = 1
iL(12) = 1
- в Private Sub Form_Load()
и расчёт следующего поколения в таймере:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Private Sub tmrMain_Timer()
  Dim iI As Integer
  Dim iJ As Integer
  Dim iH As Integer
  '
  For iI = 1 To 20
    For iJ = 1 To 20
      iY(iI, iJ) = iX(iI, iJ)
    Next iJ
  Next iI
  For iI = 1 To 20
    iY(iI, 0) = iY(iI, 20)
    iY(iI, 21) = iY(iI, 1)
  Next iI
  For iJ = 0 To 21
    iY(0, iJ) = iY(20, iJ)
    iY(21, iJ) = iY(1, iJ)
  Next iJ
  For iI = 1 To 20
    For iJ = 1 To 20
      iH = 9 * iY(iI, iJ)
      iH = iH + iY(iI - 1, iJ - 1) + iY(iI - 1, iJ) + iY(iI - 1, iJ + 1) + iY(iI, iJ - 1)
      iH = iH + iY(iI, iJ + 1) + iY(iI + 1, iJ - 1) + iY(iI + 1, iJ) + iY(iI + 1, iJ + 1)
      iX(iI, iJ) = iL(iH)
    Next iJ
  Next iI
  lG = lG + 1
  lblG.Caption = "Поколение № " & Trim$(Str$(lG))
  picXY.Cls
  picXY.FillStyle = vbFSSolid
  picXY.FillColor = RGB(0, 255, 0)
  For iI = 1 To 20
    For iJ = 1 To 20
      If 1 = iX(iI, iJ) Then
        picXY.Circle ((CSng(iI) - 1) + 0.5, (CSng(iJ) - 1) + 0.5), 0.3, RGB(0, 255, 0)
      End If
    Next iJ
  Next iI
End Sub
Программа целиком здесь:
_Игра Жизнь 01.zip

А вот как это выглядит:
Нажмите на изображение для увеличения
Название: Game of Life.jpg
Просмотров: 407
Размер:	31.9 Кб
ID:	3926
Размещено в Без категории
Просмотров 496 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.