0

所以我正在开发一个扫雷游戏,我已经分配了地雷,但我必须生成它们周围的数字。我已经开发了代码,但它似乎没有工作。重要的是要提到我正在使用 DataGridView。

这是我的代码现在的样子:

声明我的变量:

Public line As Integer
Public column As Integer
Public numbandeiras As Integer
Public mat(11, 11) As Integer
Public Const MINASEXISTE = 34
Public jogo(11, 11) As Integer

初始化地雷:

Public Sub initflags()

    'initialize the matrix
    For i = 0 To 11
        For j = 0 To 11
            mat(i, j) = 0
        Next
    Next


    'generate the mines
    Do Until numbandeiras = MINASEXISTE



        'Randomize()
        line = Int(Rnd() * 10) + 1
        column = Int(Rnd() * 10) + 1
        r = line
        c = column
        If mat(line, column) = 0 Then
            numbandeiras = numbandeiras + 1


            mat(line, column) = 1

        End If

    Loop

'call numbers    
Call avisinhos()

End Sub

生成矿山周围的数字:

 Public Sub avisinhos()

    'declaring my local variables
    Dim conta As Integer = 0
    Dim linestart As Integer = -1
    Dim lineend As Integer = 1
    Dim colstart As Integer = -1
    Dim colend As Integer = 1
    Dim auxlinha, auxcolumn As Integer


  'generating the numbers in the matrix
    For auxlinha = 1 To 10
        For auxcolumn = 1 To 10
            While conta < MINASEXISTE
                If mat(line, column) = 1 Then 'tem uma mina


                    mat(auxlinha - 1, auxcolumn - 1) = mat(auxlinha - 1, auxcolumn - 1) + 1
                    mat(auxlinha - 1, auxcolumn) = mat(auxlinha - 1, auxcolumn) + 1
                    mat(auxlinha - 1, auxcolumn + 1) = mat(auxlinha - 1, auxcolumn + 1) + 1
                    mat(auxlinha, auxcolumn - 1) = mat(auxlinha, auxcolumn - 1) + 1
                    mat(auxlinha, auxcolumn + 1) = mat(auxlinha, auxcolumn + 1) + 1
                    mat(auxlinha + 1, auxcolumn - 1) = mat(auxlinha + 1, auxcolumn - 1) + 1
                    mat(auxlinha + 1, auxcolumn) = mat(auxlinha + 1, auxcolumn) + 1
                    mat(auxlinha + 1, auxcolumn + 1) = mat(auxlinha + 1, auxcolumn + 1) + 1
                End If

                conta = conta + 1
            End While
        Next
    Next

End Sub
End Module

将正确的图像归因于 DataGridView tablw 上的矩阵编号:

 Private Sub tab1_CellContentClick(ByVal sender As System.Object, ByVal e As    System.Windows.Forms.DataGridViewCellEventArgs) Handles tab1.CellContentClick
    My.Computer.Audio.Play("butao.wav")
    Dim r, c As Integer
    r = tab1.CurrentCell.RowIndex + 1
    c = tab1.CurrentCell.ColumnIndex + 1
    Label5.Text = "linha=" + Str(r)
    Label6.Text = "coluna=" + Str(c)
    'MessageBox.Show(minas(r, c))


    If (jogo(r, c) = 1) Then
        MessageBox.Show("Ja jogou")
    Else
    'When There is a bomb
        If mat(r, c) = 1 Then
            Me.tab1.Rows(r - 1).Cells(c - 1).Value = Image.FromFile("mina1.png")
            jogo(r, c) = 1
            player1 = player1 + 3
            Label1.Text = Val(player1)
        End If
      'When There is a number
        If mat(r, c) > 1 Then
            Call preenche_num(r - 1, c - 1)
      'When there is nothing
        End If
        If mat(r, c) = 0 Then
            Me.tab1.Rows(r - 1).Cells(c - 1).Value = Image.FromFile("vazio.png")
        End If

    End If
End Sub

不同的数字可能性:

 Sub preenche_num(ByVal r As Integer, ByVal c As Integer)

    Select Case mat(r, c)
        Case 2
            Me.tab1.Rows(r).Cells(c).Value = Image.FromFile("um.png")
        Case 3
            Me.tab1.Rows(r).Cells(c).Value = Image.FromFile("dois.png")
        Case 4
            Me.tab1.Rows(r).Cells(c).Value = Image.FromFile("tres.png")
        Case 5
            Me.tab1.Rows(r).Cells(c).Value = Image.FromFile("quatro.png")
        Case 6
            Me.tab1.Rows(r).Cells(c).Value = Image.FromFile("cinco.png")
        Case 7
            Me.tab1.Rows(r).Cells(c).Value = Image.FromFile("seis.png")
        Case 8
            Me.tab1.Rows(r).Cells(c).Value = Image.FromFile("sete.png")
        Case 9
            Me.tab1.Rows(r).Cells(c).Value = Image.FromFile("oito.png")
    End Select
End Sub

我确实相信我的错误是在我生成数字的地方。最好的问候,乔奥。

4

2 回答 2

2

您正在使用auxlinhaandauxcolumn在您的循环中:

For auxlinha = 1 To 10
  For auxcolumn = 1 To 10

但是随后您正在使用lineandcolumn来检查循环内的项目:

    If mat(line, column) = 1 Then 'tem uma mina

此外,当你解决了这个问题时,你的算法仍然会惨遭失败。您正在阅读的同一数组中写入,并且在您阅读的位置之前写入。A1表示初始数组中的地雷,但是一旦开始增加地雷周围的方格,您就不再知道是否1表示地雷或者是否意味着靠近该方格的地雷。

此外,您从 1 循环到 10,因此不会考虑沿边缘的地雷。您必须循环所有方块,并在增加周围方块时检查您是否在边界。

于 2012-05-07T08:29:50.033 回答
0

一句话:英文节目!

我们无法读取您的代码。如果标识符不重要,那么您做错了什么:它们对于帮助理解代码应该很重要。英语是编程语言——接受这一点。

其次,用 2-9 代表数字 1-8 有点不直观且容易出错,你不觉得吗?

如果您坚持用数字对所有可能的值进行编码,则将地雷设为–1,并且数字代表它们自己。

第三,关于调试:您怀疑数字的生成不起作用。好吧,这很容易测试:只需硬编码一些数字,然后查看显示是否正常工作。或者反过来做,计算数字并在调试窗口中输出。

第四,关于风格。通过在第一次使用而不是之前声明变量来让您的生活更轻松。在开头有变量声明块不会使代码更清晰。我还怀疑您应该启用Option Explicitand Option Strict。我还将删除 VB6 样式的残余: egCall是不必要的,Str应该Val删除以支持 .NET 方法。

于 2012-05-07T08:19:44.507 回答