This repository has been archived by the owner on May 11, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSnake.bas
446 lines (425 loc) · 14.1 KB
/
Snake.bas
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
Attribute VB_Name = "Snake"
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Dim GameOver As Boolean
Dim Right As Boolean
Dim Left As Boolean
Dim Up As Boolean
Dim Down As Boolean
Dim DropSpawned As Boolean
Dim RemoveEnd As Boolean
Dim ClearSnake As Boolean
Dim DropX As Integer
Dim DropY As Integer
Dim Height As Integer
Dim Width As Integer
Dim SnakeBody(1 To 100, 1 To 2) As Integer
Dim TempSnake(1 To 100, 1 To 2) As Integer
Public Sub Game()
Call CreateField
If Worksheets("Settings").Cells(14, 3) = True Then
Call StartAnim
End If
Call InitalizeSnake
Do While (Not GameOver)
If Worksheets("Settings").Cells(11, 3) = True Then
DoEvents
End If
If Worksheets("Settings").Cells(11, 3) = False Then
Call CheckKeys
End If
Call Move
Call IsGameOver
Call RandomDrop
If (Not GameOver) Then
Call DrawSnake
Sleep Worksheets("Settings").Cells(12, 3)
End If
Loop
End Sub
Public Sub KIGame()
Call CreateField
If Worksheets("Settings").Cells(14, 3) = True Then
Call StartAnim
End If
Call InitalizeSnake
Do While (Not GameOver)
DoEvents
Call WhatWouldTheKIDo
Call Move
Call IsGameOver
Call RandomDrop
If (Not GameOver) Then
Call DrawSnake
Sleep Worksheets("Settings").Cells(12, 3)
End If
Loop
End Sub
Private Sub WhatWouldTheKIDo()
If DropSpawned = True Then
If SnakeBody(1, 1) < DropX And Left = False And Right = False Then
Call RightButton
ElseIf SnakeBody(1, 1) > DropX And Right = False And Left = False Then
Call LeftButton
ElseIf SnakeBody(1, 2) < DropY And Up = False And Down = False Then
Call DownButton
ElseIf SnakeBody(1, 2) > DropY And Down = False And Up = False Then
Call UpButton
End If
Call CrashCheck
End If
End Sub
Private Sub CrashCheck()
On Error Resume Next
If Right = True Then
If (SnakeBody(1, 1) + 1 = Width + 2) Then
Call UpButton
Call CrashCheck
End If
For i = LBound(SnakeBody) + 1 To UBound(SnakeBody) - 1
If SnakeBody(i, 1) = 0 Then
Exit For
End If
If (SnakeBody(i, 1) = SnakeBody(1, 1) + 1 And SnakeBody(i, 2) = SnakeBody(1, 2)) Then
Call UpButton
Call CrashCheck
End If
Next i
ElseIf Left = True Then
If (SnakeBody(1, 1) - 1 = 1) Then
Call DownButton
Call CrashCheck
End If
For i = LBound(SnakeBody) + 1 To UBound(SnakeBody) - 1
If SnakeBody(i, 1) = 0 Then
Exit For
End If
If (SnakeBody(i, 1) = SnakeBody(1, 1) - 1 And SnakeBody(i, 2) = SnakeBody(1, 2)) Then
Call DownButton
Call CrashCheck
End If
Next i
ElseIf Up = True Then
If (SnakeBody(1, 2) - 1 = 1) Then
Call LeftButton
Call CrashCheck
End If
For i = LBound(SnakeBody) + 1 To UBound(SnakeBody) - 1
If SnakeBody(i, 1) = 0 Then
Exit For
End If
If (SnakeBody(i, 1) = SnakeBody(1, 1) And SnakeBody(i, 2) = SnakeBody(1, 2) - 1) Then
Call LeftButton
Call CrashCheck
End If
Next i
Else
If (SnakeBody(1, 2) + 1 = Height + 2) Then
Call RightButton
Call CrashCheck
End If
For i = LBound(SnakeBody) + 1 To UBound(SnakeBody) - 1
If SnakeBody(i, 1) = 0 Then
Exit For
End If
If (SnakeBody(i, 1) = SnakeBody(1, 1) And SnakeBody(i, 2) = SnakeBody(1, 2) + 1) Then
Call RightButton
Call CrashCheck
End If
Next i
End If
End Sub
Private Sub CreateField()
LastScore = Worksheets("Settings").Cells(9, 6)
HighScore = Worksheets("Settings").Cells(10, 6)
Worksheets("Game").Cells.Clear
Height = Worksheets("Settings").Cells(9, 3)
Width = Worksheets("Settings").Cells(10, 3)
ActiveWindow.DisplayGridlines = False
Worksheets("Settings").Cells(9, 6) = 0
If LastScore > HighScore Then
Worksheets("Settings").Cells(10, 6) = LastScore
Else
Worksheets("Settings").Cells(10, 6) = HighScore
End If
Columns("A:" & ColLetter(Width + 2)).ColumnWidth = 1.5
Rows("1:" & Height + 2).RowHeight = 10.5
With Worksheets("Game").Range("A1:" & ColLetter(Width + 2) & "1").Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Worksheets("Game").Range("A1:A" & Height + 2).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Worksheets("Game").Range("A" & Height + 2 & ":" & ColLetter(Width + 2) & Height + 2).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Worksheets("Game").Range(ColLetter(Width + 2) & "1:" & ColLetter(Width + 2) & Height + 2).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Private Sub RandomDrop()
If DropSpawned = False Then
PermittedPosition = False
Do While (Not PermittedPosition)
PermittedPosition = True
DropY = CInt((Height - 1) * Rnd() + 2)
DropX = CInt((Width - 1) * Rnd() + 2)
For i = LBound(SnakeBody) + 1 To UBound(SnakeBody)
If SnakeBody(i, 1) = 0 Then
Exit For
End If
If (SnakeBody(i, 1) = DropX And SnakeBody(i, 2) = DropY) Then
PermittedPosition = False
Exit For
End If
Next i
Loop
DropSpawned = True
With Worksheets("Game").Range(ColLetter(DropX) & DropY).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark2
.TintAndShade = -0.249977111117893
.PatternTintAndShade = 0
End With
End If
End Sub
Private Sub CheckKeys()
If GetAsyncKeyState(vbKeyUp) Then
Call UpButton
ElseIf GetAsyncKeyState(vbKeyRight) Then
Call RightButton
ElseIf GetAsyncKeyState(vbKeyLeft) Then
Call LeftButton
ElseIf GetAsyncKeyState(vbKeyDown) Then
Call DownButton
End If
End Sub
Private Sub DrawSnake()
For i = LBound(SnakeBody) To UBound(SnakeBody)
If SnakeBody(i, 1) = 0 Then
Exit For
End If
If ClearSnake = True Then
With Worksheets("Game").Range(ColLetter(SnakeBody(i, 1)) & SnakeBody(i, 2)).Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
ElseIf Worksheets("Settings").Cells(13, 3) = "Purple" Then
With Worksheets("Game").Range(ColLetter(SnakeBody(i, 1)) & SnakeBody(i, 2)).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 10498160
.TintAndShade = 0
.PatternTintAndShade = 0
End With
ElseIf Worksheets("Settings").Cells(13, 3) = "Green" Then
With Worksheets("Game").Range(ColLetter(SnakeBody(i, 1)) & SnakeBody(i, 2)).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 5296274
.TintAndShade = 0
.PatternTintAndShade = 0
End With
ElseIf Worksheets("Settings").Cells(13, 3) = "Blue" Then
With Worksheets("Game").Range(ColLetter(SnakeBody(i, 1)) & SnakeBody(i, 2)).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
ElseIf Worksheets("Settings").Cells(13, 3) = "Red" Then
With Worksheets("Game").Range(ColLetter(SnakeBody(i, 1)) & SnakeBody(i, 2)).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 192
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End If
Next i
End Sub
Private Sub Move()
TempX = SnakeBody(1, 1)
TempY = SnakeBody(1, 2)
If Up = True Then
TempSnake(1, 1) = TempX
TempSnake(1, 2) = TempY - 1
ElseIf Right = True Then
TempSnake(1, 1) = TempX + 1
TempSnake(1, 2) = TempY
ElseIf Down = True Then
TempSnake(1, 1) = TempX
TempSnake(1, 2) = TempY + 1
ElseIf Left = True Then
TempSnake(1, 1) = TempX - 1
TempSnake(1, 2) = TempY
End If
For i = LBound(SnakeBody) + 1 To UBound(SnakeBody)
If SnakeBody(i - 1, 1) = 0 Then
Exit For
End If
TempSnake(i, 1) = SnakeBody(i - 1, 1)
TempSnake(i, 2) = SnakeBody(i - 1, 2)
Next i
Call CopyArray
End Sub
Private Sub IsGameOver()
For i = LBound(SnakeBody) + 1 To UBound(SnakeBody)
If SnakeBody(i, 1) = 0 Then
Exit For
End If
If (SnakeBody(i, 1) = SnakeBody(1, 1) And SnakeBody(i, 2) = SnakeBody(1, 2)) Then
Call GameIsOver
End If
If (SnakeBody(i, 1) = 1 Or SnakeBody(i, 1) = Width + 2 Or SnakeBody(i, 2) = 1 Or SnakeBody(i, 2) = Height + 2) Then
Call GameIsOver
End If
Next i
If SnakeBody(1, 1) = DropX And SnakeBody(1, 2) = DropY Then
RemoveEnd = False
DropSpawned = False
Worksheets("Settings").Cells(9, 6) = Worksheets("Settings").Cells(9, 6) + 1
End If
End Sub
Private Sub CopyArray()
For i = LBound(TempSnake) To UBound(TempSnake)
If TempSnake(i, 1) = 0 Then
If i = 1 Then
Call GameIsOver
Exit Sub
Else
If RemoveEnd = True Then
With Worksheets("Game").Cells(SnakeBody(i - 1, 2), SnakeBody(i - 1, 1)).Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
SnakeBody(i - 1, 1) = 0
SnakeBody(i - 1, 2) = 0
TempSnake(i - 1, 1) = 0
TempSnake(i - 1, 2) = 0
End If
RemoveEnd = True
Exit For
End If
End If
SnakeBody(i, 1) = TempSnake(i, 1)
SnakeBody(i, 2) = TempSnake(i, 2)
Next i
End Sub
Private Sub GameIsOver()
GameOver = True
MsgBox "Game Over! Score: " & Worksheets("Settings").Cells(9, 6) & "."
End Sub
Private Sub InitalizeSnake()
GameOver = False
Left = False
Call RightButton
DropSpawned = False
RemoveEnd = True
DropX = 0
DropY = 0
For i = LBound(SnakeBody) + 1 To UBound(SnakeBody)
SnakeBody(i, 1) = 0
SnakeBody(i, 2) = 0
TempSnake(i, 1) = 0
TempSnake(i, 2) = 0
Next i
SnakeBody(1, 1) = Round(Width / 2, 0) + 3
SnakeBody(1, 2) = Round(Height / 2, 0)
SnakeBody(2, 1) = Round(Width / 2, 0) + 2
SnakeBody(2, 2) = Round(Height / 2, 0)
SnakeBody(3, 1) = Round(Width / 2, 0) + 1
SnakeBody(3, 2) = Round(Height / 2, 0)
SnakeBody(4, 1) = Round(Width / 2, 0)
SnakeBody(4, 2) = Round(Height / 2, 0)
SnakeBody(5, 1) = Round(Width / 2, 0) - 1
SnakeBody(5, 2) = Round(Height / 2, 0)
SnakeBody(6, 1) = Round(Width / 2, 0) - 2
SnakeBody(6, 2) = Round(Height / 2, 0)
Call DrawSnake
End Sub
Public Sub UpButton()
If Down <> True Then
Up = True
Down = False
Right = False
Left = False
End If
End Sub
Public Sub RightButton()
If Left <> True Then
Up = False
Down = False
Right = True
Left = False
End If
End Sub
Public Sub DownButton()
If Up <> True Then
Up = False
Down = True
Right = False
Left = False
End If
End Sub
Public Sub LeftButton()
If Right <> True Then
Up = False
Down = False
Right = False
Left = True
End If
End Sub
Private Sub StartAnim()
For i = LBound(SnakeBody) + 1 To UBound(SnakeBody)
SnakeBody(i, 1) = 0
SnakeBody(i, 2) = 0
TempSnake(i, 1) = 0
TempSnake(i, 2) = 0
Next i
For i = 0 To 20
ClearSnake = False
SnakeBody(1, 1) = CInt((Width - 1) * Rnd() + 2)
SnakeBody(1, 2) = CInt((Height - 1) * Rnd() + 2)
SnakeBody(2, 1) = CInt((Width - 1) * Rnd() + 2)
SnakeBody(2, 2) = CInt((Height - 1) * Rnd() + 2)
SnakeBody(3, 1) = CInt((Width - 1) * Rnd() + 2)
SnakeBody(3, 2) = CInt((Height - 1) * Rnd() + 2)
SnakeBody(4, 1) = CInt((Width - 1) * Rnd() + 2)
SnakeBody(4, 2) = CInt((Height - 1) * Rnd() + 2)
SnakeBody(5, 1) = CInt((Width - 1) * Rnd() + 2)
SnakeBody(5, 2) = CInt((Height - 1) * Rnd() + 2)
SnakeBody(6, 1) = CInt((Width - 1) * Rnd() + 2)
SnakeBody(6, 2) = CInt((Height - 1) * Rnd() + 2)
Call DrawSnake
Sleep 50
ClearSnake = True
Call DrawSnake
Next i
ClearSnake = False
End Sub
Function ColLetter(lngCol As Integer) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
ColLetter = vArr(0)
End Function