View difference between Paste ID: eZwifVAF and gjG6MXHq
SHOW: | | - or go back to the newest paste.
1
-- Original by Vilsol in pastebin gjG6MXHq
2
--
3
-- Added initializing screen with 8 gliders to form a glider gun by Forgotten_Boy.
4
board = {}
5
tArgs = { ... }
6
generation = 0
7
sleeptime = 0.5
8
9
if(tArgs[1] == "left" or tArgs[1] == "right" or tArgs[1] == "top" or tArgs[1] == "bottom" or tArgs[1] == "front" or tArgs[1] == "back")then
10
	mon = peripheral.wrap(tArgs[1])
11
else
12
	mon = term
13
end
14
15
if(mon.isColor() or mon.isColor)then
16
	colored = true
17
else
18
	colored = false
19
end
20
21
w, h = mon.getSize()
22
23
for x = 1, w do
24
	board[x] = {}
25
	for y = 1, h do
26
		board[x][y] = 0
27
	end
28
end
29
30
function drawScreen()
31
	w, h = mon.getSize()
32
	for x = 1, w do
33
		for y = 1, h do
34
			nei = getNeighbours(x, y)
35
			if(board[x][y] == 1)then
36
				if colored then
37
					if(nei < 2 or nei > 3)then
38
						mon.setBackgroundColor(colors.red)
39
					else
40
						mon.setBackgroundColor(colors.green)
41
					end
42
				else
43
					mon.setBackgroundColor(colors.white)
44
				end
45
			else
46
				if colored then
47
					if(nei == 3)then
48
						mon.setBackgroundColor(colors.yellow)
49
					else
50
						mon.setBackgroundColor(colors.black)
51
					end
52
				else
53
					mon.setBackgroundColor(colors.black)
54
				end
55
			end
56
			mon.setCursorPos(x, y)
57
			mon.write(" ")
58
		end
59
	end
60
	mon.setCursorPos(1,1)
61
	if colored then
62
		mon.setTextColor(colors.blue)
63
	end
64
	mon.write(generation)
65
end
66
67
function getNeighbours(x, y)
68
	w, h = mon.getSize()
69
	total = 0
70
	if(x > 1 and y > 1)then if(board[x-1][y-1] == 1)then total = total + 1 end end
71
	if(y > 1)then if(board[x][y-1] == 1)then total = total + 1 end end
72
	if(x < w and y > 1)then if(board[x+1][y-1] == 1)then total = total + 1 end end
73
	if(x > 1)then if(board[x-1][y] == 1)then total = total + 1 end end
74
	if(x < w)then if(board[x+1][y] == 1)then total = total + 1 end end
75
	if(x > 1 and y < h)then if(board[x-1][y+1] == 1)then total = total + 1 end end
76
	if(y < h)then if(board[x][y+1] == 1)then total = total + 1 end end
77
	if(x < w and y < h)then if(board[x+1][y+1] == 1)then total = total + 1 end end
78
	return total
79
end
80
81
function compute()
82
	w, h = mon.getSize()
83
	while true do
84
		newBoard = {}
85
		for x = 1, w do
86
			newBoard[x] = {}
87
			for y = 1, h do
88
				nei = getNeighbours(x, y)
89
				if(board[x][y] == 1)then
90
					if(nei < 2)then
91
						newBoard[x][y] = 0
92
					elseif(nei > 3)then
93
						newBoard[x][y] = 0
94
					else
95
						newBoard[x][y] = 1
96
					end
97
				else
98
					if(nei == 3)then
99
						newBoard[x][y] = 1
100
					end
101
				end
102
			end
103
		end
104
		board = newBoard
105
		generation = generation + 1
106
		sleep(sleeptime)
107
	end
108
end
109
110
function loop()
111
	while true do
112
		event, variable, xPos, yPos = os.pullEvent()
113
		if event == "mouse_click" or event == "monitor_touch" or event == "mouse_drag" then
114
			if variable == 1 then
115
				board[xPos][yPos] = 1
116
			else
117
				board[xPos][yPos] = 0
118
			end
119
		end
120
		if event == "key" then
121
			if tostring(variable) == "28" then
122
				return true
123
			elseif tostring(variable) == "57" then
124
				if(mon.isColor() or mon.isColor)then
125
					colored = not colored
126
				end
127
			elseif tostring(variable) == "200" then
128
				if sleeptime > 0.1 then
129
					sleeptime = sleeptime - 0.1
130
				end
131
			elseif tostring(variable) == "208" then
132
				if sleeptime < 1 then
133
					sleeptime = sleeptime + 0.1
134
				end
135
			end
136
		end
137
		drawScreen()
138
	end
139
end
140
141
function intro()
142
	mon.setBackgroundColor(colors.black)
143
	mon.clear()
144
	mon.setCursorPos(1,1)
145
	mon.write("Conway's Game Of Life")
146
	mon.setCursorPos(1,2)
147
	mon.write("It is a game which represents life.")
148
	mon.setCursorPos(1,3)
149
	mon.write("The game runs by 4 basic rules:")
150
	mon.setCursorPos(1,4)
151
	mon.write("1. If a cell has less than 2 neighbours, it dies.")
152
	mon.setCursorPos(1,5)
153
	mon.write("2. If a cell has 2 or 3 neightbours, it lives.")
154
	mon.setCursorPos(1,6)
155
	mon.write("3. If a cell has more than 3 neighbours, it dies.")
156
	mon.setCursorPos(1,7)
157
	mon.write("4. If a cell has exactly 3 neighbours it is born.")
158
	mon.setCursorPos(1,9)
159
	mon.write("At the top left is the generation count.")
160
	mon.setCursorPos(1,10)
161
	mon.write("Press spacebar to switch between color modes")
162
	mon.setCursorPos(1,11)
163
	mon.write("Press enter to start  the game")
164
	mon.setCursorPos(1,13)
165
	mon.write("Colors:")
166
	mon.setCursorPos(1,14)
167
	mon.write("Red - Cell will die in next generation")
168
	mon.setCursorPos(1,15)
169
	mon.write("Green - Cell will live in next generation")
170
	mon.setCursorPos(1,16)
171
	mon.write("Yellow - Cell will be born in next generation")
172
	mon.setCursorPos(1,18)
173
	mon.write("Press any key to continue!")
174
	event, variable, xPos, yPos = os.pullEvent("key")
175
end
176
177
178
if (w >=47) then
179
-- initialize the screen with 8 gliders to synthesize a glider gun
180
	print(" Gosper Gun initializing...")
181
	x = 1
182
	y = 1
183
	data = "16bo30b$16bobo16bo11b$16b2o17bobo9b$obo10bo21b2o10b$b2o11b2o31b$bo11b2o32b3$10b2o20b2o13b$11b2o19bobo9b3o$10bo21bo11bo2b$27bo17bob$27b2o18b$26bobo!"
184
	for one in string.gmatch(data, "%d*[%w$!]") do
185
		count = 1
186
		start, fin = string.find(one, "%d*")
187
		token  = string.sub(one, start, fin)
188
		kind = string.sub(string.reverse(one), 1, 1)
189
		if (token) then
190
			count = tonumber(token)
191
		end
192
		for counter = 1, count or 1 do
193
			if(kind == "!") then
194
				--eof, begin the show
195
				break
196
			elseif (kind == "$") then
197
				y = y + 1
198
				x = 1
199
			elseif (kind == "b") then
200
				x = x + 1
201
			elseif (kind == "o") then
202
				board[x][y] = 1
203
				x = x + 1
204
			end
205
		end
206
	end
207
	sleep(1)
208
	sleeptime = 0.1
209
end
210
211
intro()
212
drawScreen()
213
while true do
214
	loop()
215
	parallel.waitForAny(loop, compute)
216
end