Vb.net 如果面板的背景图像等于“我的资源”中的图像

Vb.net 如果面板的背景图像等于“我的资源”中的图像,vb.net,visual-studio,Vb.net,Visual Studio,这是我编写的一个函数,但它在else部分输出msgbox(error) 我的代码中发生了什么: 这是一个tic tac toe程序,当三个水平面板的背景图像等于我的参考资料中的imagefile时,然后更改标签文本 有人能帮我解决这个问题吗 函数win_status() 如果Panel1.Enabled=False,Panel2.Enabled=False,Panel3.Enabled=False,则 如果Panel1.BackgroundImage是My.Resources.ticcross,

这是我编写的一个函数,但它在else部分输出msgbox(error

我的代码中发生了什么: 这是一个tic tac toe程序,当三个水平面板的背景图像等于我的参考资料中的imagefile时,然后更改标签文本

有人能帮我解决这个问题吗

函数win_status()
如果Panel1.Enabled=False,Panel2.Enabled=False,Panel3.Enabled=False,则
如果Panel1.BackgroundImage是My.Resources.ticcross,Panel2.BackgroundImage是My.Resources.ticcross,Panel3.BackgroundImage是My.Resources.ticcross,则
lblWinner.Text=“玩家1赢得了比赛”
其他的
MsgBox(“错误”)
如果结束
如果结束
端函数

您可以参考以下参考:

在VB.NET中,代码如下所示:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    '...
    If CompareImg(New Bitmap(Panel1.BackgroundImage), My.Resources.ticcross) And CompareImg(New Bitmap(Panel2.BackgroundImage), My.Resources.ticcross) And CompareImg(New Bitmap(Panel3.BackgroundImage), My.Resources.ticcross) Then
        lblWinner.Text = "Player 1 Won The Game"
    Else
        MsgBox("error")
    End If
End Sub
Public Function CompareImg(ByVal bitmap1 As Bitmap, ByVal bitmap2 As Bitmap) As Boolean
    Dim lstbol As List(Of Boolean) = GetHash(bitmap1)
    Dim equalElements As Integer = lstbol.Zip(GetHash(bitmap2), Function(i, j) i = j).Count(Function(eq) eq)
    If equalElements = lstbol.Count() Then
        Return True
    End If
    Return False
End Function
Public Function GetHash(ByVal bmpSource As Bitmap) As List(Of Boolean)
    Dim lResult As List(Of Boolean) = New List(Of Boolean)()
    Dim bmpMin As Bitmap = New Bitmap(bmpSource, New Size(16, 16))
    For j As Integer = 0 To bmpMin.Height - 1

        For i As Integer = 0 To bmpMin.Width - 1
            lResult.Add(bmpMin.GetPixel(i, j).GetBrightness() < 0.5F)
        Next
    Next
    Return lResult
End Function
Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
'...
如果CompareImg(新位图(Panel1.BackgroundImage)、My.Resources.ticcross)、CompareImg(新位图(Panel2.BackgroundImage)、My.Resources.ticcross)和CompareImg(新位图(Panel3.BackgroundImage)、My.Resources.ticcross),则
lblWinner.Text=“玩家1赢得了比赛”
其他的
MsgBox(“错误”)
如果结束
端接头
作为布尔值的公共函数CompareImg(ByVal bitmap1作为位图,ByVal bitmap2作为位图)
Dim lstbol As List(布尔值)=GetHash(位图1)
整数=lstbol.Zip(GetHash(bitmap2),函数(i,j)i=j.Count(函数(eq)eq)形式的Dim等式元素
如果equalElements=lstbol.Count(),则
返回真值
如果结束
返回错误
端函数
公共函数GetHash(ByVal bmpSource作为位图)作为列表(布尔值)
Dim lResult As List(布尔值)=新列表(布尔值)()
Dim bmpMin As Bitmap=新位图(bmpSource,新大小(16,16))
对于j,整数=0到bmpMin.Height-1
对于i,整数=0到bmpMin.Width-1
lResult.Add(bmpMin.GetPixel(i,j).GetBrightness()<0.5F)
下一个
下一个
返回lResult
端函数

如果您想了解更多有关如何比较两幅图像的信息,请查看。

单击窗格时,我更改了窗格的背景颜色,并键入了以下功能:

它起作用了

函数win\u status()


如果确实要比较位图引用(不需要),则必须将资源对象分配给位图对象,并使用这些引用进行比较
My.Resources
是一个工厂:每次调用它时,它都会创建一个新对象,因此它永远不是同一个引用(在任何情况下,都是比较引用,而不是对象的内容)。您可以构建一个类对象来维护使用图像的控件与图像本身之间的关系,也可以使用命名索引器(如字典)作为这两部分之间的链接。@Jimi您能建议我其他方法来进行比较吗?我需要帮助plz@GHOSTH4CK3R例如,我会存储每个“单元”的状态而不是依赖于检查图像本身。一种简单的方法是,当一个玩家声明一个字符串时,在面板的
.Tag
属性中放入一个字符串:Nothing=Empty,“X”=Player1,“O”=Player2,然后您可以检查这些标记是否为空,它们是否都相等。更复杂的方法将把游戏状态与用户界面本身分开。这将允许您在没有视觉界面的情况下完全跟踪和玩游戏。然后您可以更改接口,并且基础代码相同。我不会比较两个图像。我只是检查panel1.background image是否等于my.resources.ticcross。谢谢你的回答,但是太复杂了。所以我提出了我自己的答案,在不比较图像的情况下,我是如何做到简单的方法的
    If Panel4.BackColor = Color.LightSalmon And Panel5.BackColor = Color.LightSalmon And Panel6.BackColor = Color.LightSalmon Then
        lblWinner.Text = "Player 1 Wins (X)"
    ElseIf Panel4.BackColor = Color.LightCyan And Panel5.BackColor = Color.LightCyan And Panel6.BackColor = Color.LightCyan Then
        lblWinner.Text = "Player 2 Wins (O)"
    ElseIf 

    End If

End Function