⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vbcch.frm

📁 VB版的中国象棋人机对战源程序
💻 FRM
📖 第 1 页 / 共 5 页
字号:
                            For j1 = 0 To 3
                                If X(j1) < 4 Or X(j1) > 6 Or Y(j1) < 8 Or Y(j1) > 10 Then X(j1) = 200
                            Next
                            
                        Else
                            
                            ''士只能走左斜、右斜、上斜、下斜
                            X(0) = i - 1: Y(0) = j - 1    ''左
                            X(1) = i + 1: Y(1) = j - 1    ''右
                            X(2) = i - 1: Y(2) = j + 1    ''上
                            X(3) = i + 1: Y(3) = j + 1    ''下
                            
                            '原位置不能走
                            For j1 = 0 To 3
                                If X(j1) = i And Y(j1) = j Then X(j1) = 200
                            Next
                            
                            ''判断有无超格(超格范围和王一样)
                            For j1 = 0 To 3
                                If X(j1) < 4 Or X(j1) > 6 Or Y(j1) < 1 Or Y(j1) > 3 Then X(j1) = 200
                            Next
                            
                        End If
  
                        
                    Case 5:
                        ''象(走田型,共有7个着点,还要判断隔子) x横y竖
                        xGzx = 0: xGzy = 0
                        
                        If Cer = 2 Then
                            
                            ''Cer=2为红方
                            Tt = False
                            X(0) = 1: Y(0) = 8
                            ''如果象走到目标x(0),y(0)的原始目标为5,3则其隔子位置在2,2
                            If i = 3 And j = 10 Then xGzx = 2: xGzy = 9: Tt = True
                            ''如果象走到目标x(0),y(0)的原始目标为3,10则其隔子位置在2,7
                            If i = 3 And j = 6 Then xGzx = 2: xGzy = 7: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(0) = 200   ''有隔子,不能通过
                            
                            Tt = False
                            X(1) = 3: Y(1) = 10
                            ''如果象走到目标x(1),y(1)的原始目标为5,3则其隔子位置在2,2
                            If i = 5 And j = 8 Then xGzx = 4: xGzy = 9: Tt = True
                            ''如果象走到目标x(1),y(1)的原始目标为3,5则其隔子位置在2,2
                            If i = 1 And j = 8 Then xGzx = 2: xGzy = 9: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(1) = 200     ''有隔子,不能通过
                            
                            Tt = False
                            X(2) = 5: Y(2) = 8
                            ''如果象走到目标x(2),y(2)的原始目标为5,3则其隔子位置在2,2
                            If i = 3 And j = 10 Then xGzx = 4: xGzy = 9: Tt = True
                            ''如果象走到目标x(2),y(2)的原始目标为3,5则其隔子位置在2,2
                            If i = 7 And j = 10 Then xGzx = 6: xGzy = 9: Tt = True
                            ''如果象走到目标x(2),y(2)的原始目标为5,3则其隔子位置在2,2
                            If i = 7 And j = 6 Then xGzx = 6: xGzy = 7: Tt = True
                            ''如果象走到目标x(2),y(2)的原始目标为3,5则其隔子位置在2,2
                            If i = 3 And j = 6 Then xGzx = 4: xGzy = 7: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(2) = 200     ''有隔子,不能通过
                            
                            Tt = False
                            X(3) = 7: Y(3) = 10
                            ''如果象走到目标x(3),y(3)的原始目标为5,3则其隔子位置在2,2
                            If i = 5 And j = 8 Then xGzx = 6: xGzy = 9: Tt = True
                            ''如果象走到目标x(3),y(3)的原始目标为3,5则其隔子位置在2,2
                            If i = 9 And j = 8 Then xGzx = 8: xGzy = 9: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(3) = 200     ''有隔子,不能通过
                            
                            Tt = False
                            X(4) = 9: Y(4) = 8
                            ''如果象走到目标x(4),y(4)的原始目标为5,3则其隔子位置在2,2
                            If i = 7 And j = 10 Then xGzx = 8: xGzy = 9: Tt = True
                            ''如果象走到目标x(4),y(4)的原始目标为3,5则其隔子位置在2,2
                            If i = 7 And j = 6 Then xGzx = 8: xGzy = 7: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(4) = 200     ''有隔子,不能通过
                            
                            X(5) = 7: Y(5) = 6
                            Tt = False
                            ''如果象走到目标x(5),y(5)的原始目标为5,3则其隔子位置在2,2
                            If i = 5 And j = 8 Then xGzx = 6: xGzy = 7: Tt = True
                            ''如果象走到目标x(5),y(5)的原始目标为3,5则其隔子位置在2,2
                            If i = 9 And j = 8 Then xGzx = 8: xGzy = 7: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(5) = 200      ''有隔子,不能通过
                            
                            Tt = False
                            X(6) = 3: Y(6) = 6
                            ''如果象走到目标x(6),y(6)的原始目标为5,3则其隔子位置在2,2
                            If i = 1 And j = 8 Then xGzx = 2: xGzy = 7: Tt = True
                            ''如果象走到目标x(6),y(6)的原始目标为3,5则其隔子位置在2,2
                            If i = 5 And j = 8 Then xGzx = 4: xGzy = 7: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(6) = 200      ''有隔子,不能通过
                        
                        Else
                            Tt = False
                            X(0) = 1: Y(0) = 3
                            ''如果象走到目标x(0),y(0)的原始目标为5,3则其隔子位置在2,2
                            If i = 1 And j = 3 Then xGzx = 2: xGzy = 2: Tt = True
                            ''如果象走到目标x(0),y(0)的原始目标为3,5则其隔子位置在2,2
                            If i = 3 And j = 5 Then xGzx = 2: xGzy = 4: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(0) = 200     ''有隔子,不能通过
                            
                            Tt = False
                            X(1) = 3: Y(1) = 1
                            ''如果象走到目标x(1),y(1)的原始目标为5,3则其隔子位置在2,2
                            If i = 1 And j = 3 Then xGzx = 2: xGzy = 2: Tt = True
                            ''如果象走到目标x(1),y(1)的原始目标为3,5则其隔子位置在2,2
                            If i = 5 And j = 3 Then xGzx = 4: xGzy = 2: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(1) = 200
                            
                            Tt = False
                            X(2) = 5: Y(2) = 3
                            ''如果象走到目标x(2),y(2)的原始目标为5,3则其隔子位置在2,2
                            If i = 7 And j = 1 Then xGzx = 6: xGzy = 2: Tt = True
                            ''如果象走到目标x(2),y(2)的原始目标为3,5则其隔子位置在2,2
                            If i = 3 And j = 1 Then xGzx = 4: xGzy = 2: Tt = True
                            ''如果象走到目标x(2),y(2)的原始目标为5,3则其隔子位置在2,2
                            If i = 3 And j = 5 Then xGzx = 4: xGzy = 4: Tt = True
                            ''如果象走到目标x(2),y(2)的原始目标为3,5则其隔子位置在2,2
                            If i = 7 And j = 5 Then xGzx = 6: xGzy = 4: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(2) = 200

                            Tt = False
                            X(3) = 7: Y(3) = 1
                            ''如果象走到目标x(3),y(3)的原始目标为5,3则其隔子位置在2,2
                            If i = 9 And j = 3 Then xGzx = 8: xGzy = 2: Tt = True
                            ''如果象走到目标x(3),y(3)的原始目标为3,5则其隔子位置在2,2
                            If i = 5 And j = 3 Then xGzx = 6: xGzy = 2: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(3) = 200
                            
                            Tt = False
                            X(4) = 9: Y(4) = 3
                            ''如果象走到目标x(3),y(3)的原始目标为5,3则其隔子位置在2,2
                            If i = 7 And j = 5 Then xGzx = 8: xGzy = 4: Tt = True
                            ''如果象走到目标x(3),y(3)的原始目标为3,5则其隔子位置在2,2
                            If i = 7 And j = 1 Then xGzx = 8: xGzy = 2: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(4) = 200
                            
                            Tt = False
                            X(5) = 7: Y(5) = 5
                            ''如果象走到目标x(4),y(4)的原始目标为5,3则其隔子位置在2,2
                            If i = 9 And j = 3 Then xGzx = 8: xGzy = 4: Tt = True
                            ''如果象走到目标x(4),y(4)的原始目标为3,5则其隔子位置在2,2
                            If i = 5 And j = 3 Then xGzx = 6: xGzy = 4: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(5) = 200
                            
                            Tt = False
                            X(6) = 3: Y(6) = 5
                            ''如果象走到目标x(5),y(5)的原始目标为5,3则其隔子位置在2,2
                            If i = 5 And j = 3 Then xGzx = 4: xGzy = 4: Tt = True
                            ''如果象走到目标x(5),y(5)的原始目标为3,5则其隔子位置在2,2
                            If i = 3 And j = 1 Then xGzx = 2: xGzy = 4: Tt = True
                            If ChessBoard(xGzx, xGzy).Value > 0 Or Tt = False Then X(6) = 200
                            
                        End If
                        
                    Case 4:
                        ''车(除原位置外可横向或竖向任何一格直到有隔子为止)
                        ''ChessBoard(9,10)
                        T1 = 0
                        For i1 = i + 1 To 9
                            If Int(ChessBoard(i1, j).Value / 100) = Cer Then
                                i1 = 10
                            Else
                                X(T1) = i1: Y(T1) = j: T1 = T1 + 1
                                If ChessBoard(i1, j).Value <> 0 Then i1 = 10
                            End If
                        Next
                        
                        i1 = i - 1
                        Do While i1 > 0
                            
                            If Int(ChessBoard(i1, j).Value / 100) = Cer Then
                                i1 = 1
                            Else
                                X(T1) = i1: Y(T1) = j: T1 = T1 + 1
                                If ChessBoard(i1, j).Value <> 0 Then i1 = 1
                            End If
                            i1 = i1 - 1
                        Loop
                        
                        For j1 = j + 1 To 10
                            If Int(ChessBoard(i, j1).Value / 100) = Cer Then
                                j1 = 11
                            Else
                                X(T1) = i: Y(T1) = j1: T1 = T1 + 1
                                If ChessBoard(i, j1).Value <> 0 Then j1 = 11
                            End If
                        Next
                        
                        j1 = j - 1
                        
                        Do While j1 > 0
                        
                            If Int(ChessBoard(i, j1).Value / 100) = Cer Then
                                j1 = 1
                            Else
                                X(T1) = i: Y(T1) = j1: T1 = T1 + 1
                                If ChessBoard(i, j1).Value <> 0 Then j1 = 1
                            End If
                            j1 = j1 - 1
                        Loop
                        
                    Case 3:
                        ''马(走日形,共8个落子点,落子点方向若有阻隔棋不能下) i横j竖
                        X(0) = i - 1: Y(0) = j - 2
                        If Y(0) > 0 Then
                            ''判断有无阻隔
                            If ChessBoard(X(0) + 1, Y(0) + 1).Value <> 0 Then X(0) = 200
                        End If
                        
                        X(1) = i + 1: Y(1) = j - 2
                        If Y(1) > 0 Then
                            ''判断有无阻隔
                            If ChessBoard(X(1) - 1, Y(1) + 1).Value <> 0 Then X(1) = 200
                        End If
                        
                        X(2) = i - 1: Y(2) = j + 2
                        If Y(2) <= 10 Then

                            ''判断有无阻隔
                            If ChessBoard(X(2) + 1, Y(2) - 1).Value <> 0 Then X(2) = 200
                        End If

                        X(3) = i + 1: Y(3) = j + 2
                        If Y(3) <= 10 Then
                            ''判断有无阻隔
                            If ChessBoard(X(3) - 1, Y(3) - 1).Value <> 0 Then X(3) = 200
                        End If
                        
                        X(4) = i - 2: Y(4) = j - 1
                        If X(4) > 0 Then
                            ''判断有无阻隔
                            If ChessBoard(X(4) + 1, Y(4) + 1).Value <> 0 Then X(4) = 200
                        End If
                        
                        X(5) = i + 2: Y(5) = j - 1
                        If X(5) <= 9 Then
                            ''判断有无阻隔
                            If ChessBoard(X(5) - 1, Y(5) + 1).Value <> 0 Then X(5) = 200
                        End If
                        
                        X(6) = i - 2: Y(6) = j + 1
                        If X(6) > 0 Then
                            ''判断有无阻隔
                            If ChessBoard(X(6) + 1, Y(6) - 1).Value <> 0 Then X(6) = 200
                        End If
                        
                        X(7) = i + 2: Y(7) = j + 1
                        If X(7) <= 9 Then
                            ''判断有无阻隔
                            If ChessBoard(X(7) - 1, Y(7) - 1).Value <> 0 Then X(7) = 200
                        End If
                        
                        
                    Case 2:
                        ''炮(不吃子情况下走法类似车,吃子方式为隔山打牛)
                        ''车(除原位置外可横向或竖向任何一格)
                        ''ChessBoard(9,10)
                        
                        Gzs = 0     ''判断隔子数
                        T1 = 0
                        For i1 = i + 1 To 9
                            
                            ''如果当前隔为空,或者隔棋后当前位置是对方的棋而形成的隔山打牛可走
                            If (ChessBoard(i1, j).Value = 0 And Gzs = 0) Or (Gzs = 1 And (Int(ChessBoard(i1, j).Value / 100) = NextCer(Cer))) Then
                                X(T1) = i1: Y(T1) = j: T1 = T1 + 1
                                If ChessBoard(i1, j).Value <> 0 Then Gzs = Gzs + 1
                            Else
                                ''落子点非空,增加隔子数
                                If ChessBoard(i1, j).Value > 0 Then Gzs = Gzs + 1
                            End If
                        
                        Next
                        
                        Gzs = 0     ''判断隔子数
                        i1 = i - 1
                        
                        Do While i1 > 0
                            
                            ''如果当前隔为空,或者隔棋后当前位置是对方的棋而形成的隔山打牛可走
                            If (ChessBoard(i1, j).Value = 0 And Gzs = 0) Or (Gzs = 1 And (Int(ChessBoard(i1, j).Value / 100) = NextCer(Cer))) Then
                                X(T1) = i1: Y(T1) = j: T1 = T1 + 1
                                If ChessBoard(i1, j).Value <> 0 Then Gzs = Gzs + 1
                            Else
                                ''落子点非空,增加隔子数
                                If ChessBoard(i1, j).Value > 0 Then Gzs = Gzs + 1
                            End If
                        
                            i1 = i1 - 1
                        Loop
                        
                        Gzs = 0
                        For j1 = j + 1 To 10
                            
                            ''如果当前隔为空,或者隔棋后当前位置是对方的棋而形成的隔山打牛可走
                            If (ChessBoard(i, j1).Value = 0 And Gzs = 0) Or (Gzs = 1 And (Int(ChessBoard(i, j1).Value / 100) = NextCer(Cer))) Then
                                X(T1) = i: Y(T1) = j1: T1 = T1 + 1
                                If ChessBoard(i, j1).Value <> 0 Then Gzs = Gzs + 1
                            Else
                                ''落子点非空,增加隔子数
                                If ChessBoard(i, j1).Value > 0 Then Gzs = Gzs + 1
                            End If
                        Next
                        
                        Gzs = 0
                        j1 = j - 1
                        
                        Do While j1 > 0
                        
                            ''如果当前隔为空,或者隔棋后当前位置是对方的棋而形成的隔山打牛可走
                            If (ChessBoard(i, j1).Value = 0 And Gzs = 0) Or (Gzs = 1 And (Int(ChessBoard(i, j1).Value / 100) = NextCer(Cer))) Then
                                X(T1) = i: Y(T1) = j1: T1 = T1 + 1
                                If ChessBoard(i, j1).Value <> 0 Then Gzs = Gzs + 1
                            Else
                                ''落子点非空,增加隔子数
                                If ChessBoard(i, j1).Value > 0 Then Gzs = Gzs + 1
                            End If
                            j1 = j1 - 1
                        
                        Loop
                        
                    Case 1:
                        ''卒(只可前进、过界后还可左右)
                        ''以下x,y存储该棋的每个可落子点
                        If Cer = 2 Then
                            ''Cer=2 红方
                            X(0) = i:     Y(0) = j - 1      ''前进
                            If j < 6 Then
                                ''j < 6已经过界,可以左右行走
                                X(1) = i - 1: Y(1) = j          ''左
                                X(2) = i + 1:   Y(2) = j        ''右
                            End If
                        
                        Else
                            X(0) = i: Y(0) = j + 1     ''前进
                            
                            If j > 5 Then
                                ''j>5已经过界,可以左右行走
                                X(1) = i - 1: Y(1) = j          ''左
                                X(2) = i + 1: Y(2) = j          ''右
                            End If
                        
                        End If
                            
                    End Select
                
                    For a = 0 To MAXDOWNPOINT
                        ''试下当前所有可下位置进行判断分数(以下断判是否超出棋盘,x(a)=200表示无落子点)
                        If X(a) > 0 And Y(a) > 0 And X(a) <= 9 And Y(a) <= 10 Then
                            ''落子点不能有自己的棋
                            If Int(ChessBoard(X(a), Y(a)).Value / 100) <> Cer And (X(a) <> i Or Y(a) <> j) Then
                                ''GetLocateValue判断落子点的分数
                                
                                T1 = CchessValue(Cer, ChessBoard(X(a), Y(a)).Value)
                                
                                If T1 > 0 Then _
                                    GoTo NextA  ''T1>0表示该落子点为己方的棋
                                    
                                T3 = ChessBoard(i, j).Value             ''保存(起点的棋子)
                                T4 = ChessBoard(X(a), Y(a)).Value        ''(终点的棋子)
                                

                                ChessBoard(i, j).Value = 0            ''移动棋子
                                ChessBoard(X(a), Y(a)).Value = T3    ''试下

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -