Практикум по программированию: игра "Жизнь"
Ключевые слова: программирование, язык программирования, практикум, классика, игра, жизнь, клеточный автомат, клетка, visual basic for applications, vba, doc, пример, скачать
Автор: Приходько Максим Александрович
Игра «Жизнь» - классическая задача программирования, которую однажды решает, наверное, любой программист. Насколько игра проста, настолько же потрясающие результаты можно получить с ее помощью.
Игра "Жизнь" - пример клеточного автомата. Правила классической игры просты: конечное прямоугольное поле разбито на квадратные ячейки. Каждая из таких ячеек может быть либо пуста, либо содержать "жизнь" - клетку. В начальный момент времени имеется набор n клеток, размещенных по полю тем или иным образом. Каждое следующее размещение клеток определяется пошагово на основании нескольких правил, учитывающих число соседей клетки (максимально возможное число соседей - 8, т.е. учитываются и соседи по диагонали):
- если у живой клетки 2 или 3 соседа, она продолжает жить
- если у пустой ячейки ровно 3 соседа, то в ней зарождается жизнь (появляется клетка)
- если у любой клетки меньше 2 или больше 3 соседей, то она остается пустой или "умирает"
- сначала определяются оживающие клетки
- потом - "умирающие", при этом "оживающие" на этом шаге клетки не учитываются
- "переразмещение" клеток происходит одновременно, чтобы исключить ошибки, возникающие в случае последовательного размещения клеток
В некоторых версиях MS Word может возникнутьпроблема с компиляцией кода. Для ее решения
необходимо внести следующие изменения:
1. Shading.BackgroundPatternColor заменить на
Shading.BackgroundPatternColorIndex (жирным
выделено изменение)
2. в определениях цветов wdColorBrightGreen
и wdColorWhite убрать слово Color, чтобы получилось
wdBrightGreen и wdWhite соответственно
(аттестация откроется в новом окне, не закрывайте текущее окно, так как вам понадобится приведенный далее текст программы)
1 | Sub xlife() |
2 | ' |
3 | ' draw Макрос |
4 | ' Макрос создан 19.05.2008 mprikhodko |
5 | ' |
6 | Dim i As Integer |
7 | Dim j As Integer |
8 | Dim n As Integer |
9 | Dim m As Integer |
10 | Dim x As Integer |
11 | Dim y As Integer |
12 | |
13 | Dim a As Integer |
14 | Dim b As Integer |
15 | |
16 | Dim t As Table |
17 | |
18 | Dim sosedi As Integer |
19 | |
20
|
Dim life(10, 10) As Integer
|
21
|
Dim born(10, 10) As Integer
|
22
|
Dim die(10, 10) As Integer
|
23
|
|
24
|
For a = 1 To 10
|
25
|
For b = 1 To 10
|
26
|
life(a - 1, b - 1) = 0
|
27
|
Next
|
28
|
Next
|
29
|
|
30
|
i = 10
|
31
|
j = 10
|
32
|
|
33
|
n = 50
|
34
|
m = 0
|
35
|
Do While (m < n)
|
36
|
Randomize
|
37
|
|
38
|
x = Int(10 * Rnd)
|
39
|
y = Int(10 * Rnd)
|
40
|
|
41
|
If (life(x, y) = 0) Then
|
42
|
life(x, y) = 1
|
43
|
m = m + 1
|
44
|
End If
|
45
|
Loop
|
46
|
|
47
|
Do While (ThisDocument.Tables.Count > 0)
|
48
|
Set t = ThisDocument.Tables(1)
|
49
|
t.Delete
|
50
|
Loop
|
51
|
|
52
|
Selection.Collapse
|
53
|
Set t = ThisDocument.Tables.Add(Selection.Range, 10, 10)
|
54
|
For a = 1 To 10
|
55
|
For b = 1 To 10
|
56
|
If life(a - 1, b - 1) = 1 Then
|
57
|
t.Cell(a, b).Shading.BackgroundPatternColorIndex = wdBrightGreen
|
58
|
Else
|
59
|
t.Cell(a, b).Shading.BackgroundPatternColorIndex = wdWhite
|
60
|
End If
|
61
|
Next
|
62
|
Next
|
63
|
|
64
|
Do While (n > 2)
|
65
|
For a = 1 To 10
|
66
|
For b = 1 To 10
|
67
|
|
68
|
sosedi = 0
|
69
|
If a > 1 And b > 1 Then
|
70
|
sosedi = sosedi + life(a - 2, b - 2)
|
71
|
End If
|
72
|
If a < 10 And b < 10 Then
|
73
|
sosedi = sosedi + life(a, b)
|
74
|
End If
|
75
|
If a > 1 Then
|
76
|
sosedi = sosedi + life(a - 2, b - 1) + life(a - 2, b)
|
77
|
End If
|
78
|
If b > 1 Then
|
79
|
sosedi = sosedi + life(a - 1, b - 2) + life(a, b - 2)
|
80
|
End If
|
81
|
sosedi = sosedi + life(a, b - 1) + life(a - 1, b)
|
82
|
|
83
|
If sosedi = 3 Then
|
84
|
born(a - 1, b - 1) = 1
|
85
|
Else
|
86
|
born(a - 1, b - 1) = 0
|
87
|
End If
|
88
|
Next
|
89
|
Next
|
90
|
|
91
|
For a = 1 To 10
|
92
|
For b = 1 To 10
|
93
|
sosedi = 0
|
94
|
If a > 1 And b > 1 Then
|
95
|
sosedi = sosedi + life(a - 2, b - 2)
|
96
|
End If
|
97
|
If a < 10 And b < 10 Then
|
98
|
sosedi = sosedi + life(a, b)
|
99
|
End If
|
100
|
If a > 1 Then
|
101
|
sosedi = sosedi + life(a - 2, b - 1) + life(a - 2, b)
|
102
|
End If
|
103
|
If b > 1 Then
|
104
|
sosedi = sosedi + life(a - 1, b - 2) + life(a, b - 2)
|
105
|
End If
|
106
|
sosedi = sosedi + life(a, b - 1) + life(a - 1, b)
|
107
|
|
108
|
If sosedi <> 3 Then
|
109
|
die(a - 1, b - 1) = 1
|
110
|
Else
|
111
|
die(a - 1, b - 1) = 0
|
112
|
End If
|
113
|
Next
|
114
|
Next
|
115
|
|
116
|
For a = 1 To 10
|
117
|
For b = 1 To 10
|
118
|
If born(a - 1, b - 1) = 1 Then
|
119
|
life(a - 1, b - 1) = 1
|
120
|
End If
|
121
|
Next
|
122
|
Next
|
123
|
|
124
|
For a = 1 To 10
|
125
|
For b = 1 To 10
|
126
|
If die(a - 1, b - 1) = 1 Then
|
127
|
life(a - 1, b - 1) = 0
|
128
|
End If
|
129
|
Next
|
130
|
Next
|
131
|
|
132
|
n = 0
|
133
|
For a = 1 To 10
|
134
|
For b = 1 To 10
|
135
|
If (life(a - 1, b - 1) = 1) Then
|
136
|
n = n + 1
|
137
|
End If
|
138
|
Next
|
139
|
Next
|
140
|
|
141
|
Do While (ThisDocument.Tables.Count > 0)
|
142
|
Set t = ThisDocument.Tables(1)
|
143
|
t.Delete
|
144 | Loop |
145 | |
146 | Selection.Collapse |
147 | Set t = ThisDocument.Tables.Add(Selection.Range, 10, 10) |
148 | For a = 1 To 10 |
149 | For b = 1 To 10 |
150 | If life(a - 1, b - 1) = 1 Then |
151 | t.Cell(a, b).Shading.BackgroundPatternColorIndex = wdBrightGreen |
152 | Else |
153 | t.Cell(a, b).Shading.BackgroundPatternColorIndex = wdWhite |
154 | End If |
155 | Next |
156 | Next |
157 | |
158 | MsgBox ("step") |
159 | |
160 | |
161 | Loop |
162 | |
163 | End Sub |
Добавить комментарий