上級159回のコード
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) #Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) #End If
Private Declare PtrSafe Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
Dim posi As Integer
Dim p1 As Range
Dim p2 As Range
Dim list() As Long
Const T As Integer = 1
Const R As Integer = 2
Const B As Integer = 3
Const L As Integer = 4
Sub test5()
Dim fg1 As Boolean
Dim fg2 As Boolean
Dim x As Integer
Dim y As Integer
Dim c As Collection
Dim color As Long
Dim rn As Range
y = 0
posi = T
Set p1 = Range("E2")
Set p2 = Range("E1")
fg1 = True
fg2 = True
ReDim list(1 To 15, 1 To 7)
Do While fg1 And fg2
Select Case posi
Case T
fg1 = p1.Offset(1, 0).Interior.ColorIndex = xlNone
y = -1
x = 0
Case R
fg1 = p1.Offset(1, 0).Interior.ColorIndex = xlNone
fg2 = p2.Offset(1, 0).Interior.ColorIndex = xlNone
y = 0
x = 1
Case B
fg2 = p2.Offset(1, 0).Interior.ColorIndex = xlNone
y = 1
x = 0
Case L
fg1 = p1.Offset(1, 0).Interior.ColorIndex = xlNone
fg2 = p2.Offset(1, 0).Interior.ColorIndex = xlNone
y = 0
x = -1
End Select
If fg1 And fg2 Then
If p1.Row > 1 Then
p1.Interior.ColorIndex = xlNone
End If
If p2.Row > 1 Then
p2.Interior.ColorIndex = xlNone
End If
Set p1 = p1.Offset(1, 0)
Set p2 = p1.Offset(y, x)
p1.Interior.color = RGB(255, 0, 0)
p2.Interior.color = RGB(0, 0, 255)
End If
Call keyInput
Sleep 500
DoEvents
Loop
y = 1
'浮いてる方を落とす
Do While fg1 Or fg2
fg1 = p1.Offset(y, 0).Interior.ColorIndex = xlNone
fg2 = p2.Offset(y, 0).Interior.ColorIndex = xlNone
If fg1 Then
p1.Offset(y, 0).Interior.color = RGB(255, 0, 0)
p1.Offset(y - 1, 0).Interior.ColorIndex = xlNone
ElseIf fg2 Then
p2.Offset(y, 0).Interior.color = RGB(0, 0, 255)
p2.Offset(y - 1, 0).Interior.ColorIndex = xlNone
End If
Sleep 250
DoEvents
y = y + 1
Loop
fg1 = True
Do While fg1
fg1 = False
'4個以上つながった所を消す
ReDim list(1 To 15, 1 To 7)
For y = 1 To 15
For x = 1 To 7
list(y, x) = 1
If Range("a1").Offset(y - 1, x).Interior.ColorIndex <> xlNone Then
color = Range("a1").Offset(y - 1, x).Interior.color
Set c = New Collection
c.Add Range("a1").Offset(y - 1, x)
Check c, y, x, color
If c.count >= 4 Then
fg1 = True
For Each rn In c
rn.Interior.ColorIndex = xlNone
Next
End If
End If
Next x
Next y
'新たに浮いたところを落とす
fg2 = True
Do While fg2
fg2 = False
For y = 14 To 1 Step -1
For x = 1 To 7
If Range("a1").Offset(y - 1, x).Interior.ColorIndex <> xlNone Then
If Range("a1").Offset(y, x).Interior.ColorIndex = xlNone Then
color = Range("a1").Offset(y - 1, x).Interior.color
Range("a1").Offset(y, x).Interior.color = color
Range("a1").Offset(y - 1, x).Interior.ColorIndex = xlNone
fg2 = True
End If
End If
Next x
Next y
DoEvents
Sleep 250
Loop
Loop
End Sub
Sub test6()
Dim fg1 As Boolean
Dim fg2 As Boolean
Dim x As Integer
Dim y As Integer
Dim c As Collection
Dim color As Long
Dim count As Long
Dim rn As Range
y = 0
posi = T
Set p1 = Range("E2")
Set p2 = Range("E1")
fg1 = True
fg2 = True
ReDim list(1 To 15, 1 To 7)
Do While fg1 And fg2
If count Mod 5 = 0 Then
Select Case posi
Case T
fg1 = p1.Offset(1, 0).Interior.ColorIndex = xlNone
y = -1
x = 0
Case R
fg1 = p1.Offset(1, 0).Interior.ColorIndex = xlNone
fg2 = p2.Offset(1, 0).Interior.ColorIndex = xlNone
y = 0
x = 1
Case B
fg2 = p2.Offset(1, 0).Interior.ColorIndex = xlNone
y = 1
x = 0
Case L
fg1 = p1.Offset(1, 0).Interior.ColorIndex = xlNone
fg2 = p2.Offset(1, 0).Interior.ColorIndex = xlNone
y = 0
x = -1
End Select
If fg1 And fg2 Then
If p1.Row > 1 Then
p1.Interior.ColorIndex = xlNone
End If
If p2.Row > 1 Then
p2.Interior.ColorIndex = xlNone
End If
Set p1 = p1.Offset(1, 0)
Set p2 = p1.Offset(y, x)
p1.Interior.color = RGB(255, 0, 0)
p2.Interior.color = RGB(0, 0, 255)
End If
End If
Call keyInput
Sleep 100
count = count + 1
DoEvents
Loop
y = 1
'浮いてる方を落とす
Do While fg1 Or fg2
fg1 = p1.Offset(y, 0).Interior.ColorIndex = xlNone
fg2 = p2.Offset(y, 0).Interior.ColorIndex = xlNone
If fg1 Then
p1.Offset(y, 0).Interior.color = RGB(255, 0, 0)
p1.Offset(y - 1, 0).Interior.ColorIndex = xlNone
ElseIf fg2 Then
p2.Offset(y, 0).Interior.color = RGB(0, 0, 255)
p2.Offset(y - 1, 0).Interior.ColorIndex = xlNone
End If
Sleep 250
DoEvents
y = y + 1
Loop
fg1 = True
Do While fg1
fg1 = False
'4個以上つながった所を消す
ReDim list(1 To 15, 1 To 7)
For y = 1 To 15
For x = 1 To 7
list(y, x) = 1
If Range("a1").Offset(y - 1, x).Interior.ColorIndex <> xlNone Then
color = Range("a1").Offset(y - 1, x).Interior.color
Set c = New Collection
c.Add Range("a1").Offset(y - 1, x)
Check c, y, x, color
If c.count >= 4 Then
fg1 = True
For Each rn In c
rn.Interior.ColorIndex = xlNone
Next
End If
End If
Next x
Next y
'新たに浮いたところを落とす
fg2 = True
Do While fg2
fg2 = False
For y = 14 To 1 Step -1
For x = 1 To 7
If Range("a1").Offset(y - 1, x).Interior.ColorIndex <> xlNone Then
If Range("a1").Offset(y, x).Interior.ColorIndex = xlNone Then
color = Range("a1").Offset(y - 1, x).Interior.color
Range("a1").Offset(y, x).Interior.color = color
Range("a1").Offset(y - 1, x).Interior.ColorIndex = xlNone
fg2 = True
End If
End If
Next x
Next y
DoEvents
Sleep 250
Loop
Loop
End Sub
Sub 回転()
Select Case posi
Case T
p2.Interior.ColorIndex = xlNone
Set p2 = p1.Offset(0, 1)
p2.Interior.color = RGB(0, 0, 255)
posi = R
Case R
p2.Interior.ColorIndex = xlNone
Set p2 = p1.Offset(1, 0)
p2.Interior.color = RGB(0, 0, 255)
posi = B
Case B
p2.Interior.ColorIndex = xlNone
Set p2 = p1.Offset(0, -1)
p2.Interior.color = RGB(0, 0, 255)
posi = L
Case L
p2.Interior.ColorIndex = xlNone
Set p2 = p1.Offset(-1, 0)
p2.Interior.color = RGB(0, 0, 255)
posi = T
End Select
End Sub
Sub keyInput()
If GetAsyncKeyState(vbKeyA) Then
Call 回転
End If
End Sub
Sub Check(c As Collection, y As Integer, x As Integer, color)
If y < 15 Then
If list(y + 1, x) = 0 Then
If Range("a1").Offset(y, x).Interior.color = color Then
list(y + 1, x) = 1
c.Add Range("a1").Offset(y, x)
Check c, y + 1, x, color
End If
End If
End If
If x > 1 Then
If list(y, x - 1) = 0 Then
If Range("a1").Offset(y - 1, x - 1).Interior.color = color Then
list(y, x - 1) = 1
c.Add Range("a1").Offset(y - 1, x - 1)
Check c, y, x - 1, color
End If
End If
End If
If x < 7 Then
If list(y, x + 1) = 0 Then
If Range("a1").Offset(y - 1, x + 1).Interior.color = color Then
list(y, x + 1) = 1
c.Add Range("a1").Offset(y - 1, x + 1)
Check c, y, x + 1, color
End If
End If
End If
End Sub
この記事が気に入ったらサポートをしてみませんか?