所以我正在开发一个扫雷游戏,我已经分配了地雷,但我必须在它们周围生成数字。我已经开发了代码,但它似乎没有工作。 重要的是要提到我正在使用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标签上的矩阵编号:
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
我相信我的错误是我生成数字的地方。 最好的问候,joao。
答案 0 :(得分:2)
您在循环中使用auxlinha
和auxcolumn
:
For auxlinha = 1 To 10
For auxcolumn = 1 To 10
但是您正在使用line
和column
检查循环内的项目:
If mat(line, column) = 1 Then 'tem uma mina
此外,当你解决了这个问题后,你的算法仍然会失败。您正在编写与您正在阅读的相同的数组,并在您阅读的位置之前写入。 1
表示初始数组中的地雷,但是一旦你开始增加矿井周围的方块,就不再知道1
是否意味着矿井,或者是否意味着有一个矿井接近那个矿井方。
此外,您正在从1到10循环,因此不会考虑沿边缘的地雷。你必须循环所有的方块,并在增加周围的方块时检查你是否在边界。
答案 1 :(得分:0)
第一次备注:英语程序!
我们无法读取您的代码。如果标识符不重要,那么您就做错了: 对于帮助理解代码非常重要。英语是编程的语言 - 接受这一点。
其次,2-9代表数字1-8有点不直观且容易出错,你不觉得吗?
如果您坚持按编号对所有可能的值进行编码,请将地雷设为-1,数字代表自己。
第三次,在调试时:您怀疑数字的生成不起作用。嗯,这很容易测试:只需对某些数字进行硬编码,然后查看显示是否有效。或者反之亦然,计算数字并在调试窗口中输出它们。
第四,关于风格。通过在首次使用时声明变量,而不是之前,让您的生活变得更轻松。在开头有变量声明块不会使代码更清晰。我还怀疑你应该启用Option Explicit
和Option Strict
。我还删除了VB6样式的残余:例如Call
是不必要的,应删除Str
和Val
以支持.NET方法。