Я любитель Visual Basic. Я пытаюсь воссоздать игру Go, и я создал доску и умею размещать камни на пересечениях сетки.
Теперь я хочу начать снимать окруженные камни. Я поискал в Интернете и обнаружил, что заливка наводнения - лучший способ решить эту проблему. Однако я несколько дней искал в Интернете и не могу найти ничего, что можно было бы использовать или манипулировать, чтобы создать это. Я не понимаю никаких других языков программирования, поэтому я не могу использовать фрагменты кода Java и т. Д. И фрагменты информации для Visual Basic, которые я нашел, не имеют для меня особого смысла, поскольку я все еще новичок.
Я попытался начать это сам, начав с малого с ситуации «Если бы один камень был захвачен». У меня есть два представления для доски, одно объявлено как «сетка», а другое - как «place_stone».
«Сетка» - это настоящая доска, на которой пользователи нажимают, чтобы разместить свои камни. Place_stone - это копия этой доски, но я использовал «0», «1» и «2» для обозначения пустого, черного и белого соответственно. Я использую Windows Forms, чтобы воссоздать эту игру. Это фрагмент кода, который я написал для захвата камней:
Private Sub Panel1_Click(sender As Object, e As EventArgs) Handles Panel1.Click
Dim board As Panel = DirectCast(sender, Panel)
' Figure out where the user clicked: min = 0, max = (gridsize - 1)
Dim pt As Point = board.PointToClient(Cursor.Position)
Dim colWidth As Integer = (1 / (GridSize + 1)) * board.Size.Width
Dim rowHeight As Integer = (1 / (GridSize + 1)) * board.Size.Height
Dim gridPosition As New Point(Math.Min(Math.Max((pt.X / colWidth) - 1, 0), GridSize - 1), Math.Min(Math.Max((pt.Y / rowHeight) - 1, 0), GridSize - 1))
Dim newcoordsx As Integer
Dim newcoordsy As Integer
' Now do something with gridPosition:
If Not Grid(gridPosition.X)(gridPosition.Y).HasValue Then 'If gird(x,y) is empty
illegalmovelbl.Hide() ' Hides the "Illegal Move" Label
If cp = True Then ' If current player is Black
Это та часть, где я застрял и понял, что кодирование для каждой ситуации займет слишком много времени. Мне удалось написать код для одной ситуации:
newcoordsx = gridPosition.X + 1
If placed_stone(newcoordsx, gridPosition.Y) = 2 Then
newcoordsy = gridPosition.Y + 1
If placed_stone(newcoordsx, newcoordsy) = 1 Then
newcoordsy = gridPosition.Y - 1
If placed_stone(newcoordsx, newcoordsy) = 1 Then
newcoordsx = gridPosition.X + 2
If placed_stone(newcoordsx, gridPosition.Y) = 1 Then
newcoordsx = gridPosition.X + 1
Grid(gridPosition.X)(gridPosition.Y) = True 'Place a black stone at Grid(x,y)
Grid(newcoordsx)(gridPosition.Y) = Nothing
placed_stone(newcoordsx, gridPosition.Y) = 0
pass = False
cp = False
passbtn.BackColor = Color.White 'The passbutton changes colour to white
passbtn.ForeColor = Color.Black 'The passbutton font changes colour to black
End If
End If
End If
End If
'Grid(gridPosition.X)(gridPosition.Y) = True ' Place a black stone at Grid(x,y)
'placed_stone(gridPosition.X, gridPosition.Y) = 1
'pass = False
'cp = False
'passbtn.BackColor = Color.White ' The passbutton changes colour to white
'passbtn.ForeColor = Color.Black ' The passbutton font changes colour to black
ElseIf cp = False Then ' If current player is White
Grid(gridPosition.X)(gridPosition.Y) = False ' Place a white stone at Grid(x,y)
placed_stone(gridPosition.X, gridPosition.Y) = 2
pass = False
cp = True
passbtn.BackColor = Color.Black ' The passbutton changes colour to black
passbtn.ForeColor = Color.White ' The passbutton font changes colour to white
End If
ElseIf Grid(gridPosition.X)(gridPosition.Y).HasValue Then ' If gird(x,y) isn't empty
illegalmovelbl.Show() ' Shows the "Illegal Move" Label
MsgBox("Place your stone in a vacant point") ' Displays error message
End If
board.Invalidate() ' Force the board to redraw itself
End Sub
Я пробовал использовать алгоритм Википедии для заливки наводнением, и я понимаю логику его работы, но я просто не знаю, как его запрограммировать на Visual Basic.
Flood-fill (node, target-color, replacement-color):
1. If target-color is equal to replacement-color, return.
2. If the color of node is not equal to target-color, return.
3. Set the color of node to replacement-color.
4. Perform Flood-fill (one step to the south of node, target-color, replacement-color).
Perform Flood-fill (one step to the north of node, target-color, replacement-color).
Perform Flood-fill (one step to the west of node, target-color, replacement-color).
Perform Flood-fill (one step to the east of node, target-color, replacement-color).
5. Return.
Конечно, в Go вместо того, чтобы раскрашивать область, вам нужно убирать камни при захвате, и вы не начинаете заливку с камня, который вы только что поместили для захвата, вы начинаете с ближайшего камня, который хотите захватить. .
Не могли бы вы объяснить, как легко использовать заливку в Visual Basic и как реализовать это в этой игре в го?
Если кто-то захочет просмотреть весь код, дайте мне знать. Буду признателен за любые предложения!