Module1.bas
上传用户:shwyly
上传日期:2007-01-07
资源大小:49k
文件大小:31k
源码类别:

棋牌游戏

开发平台:

Visual Basic

  1. Attribute VB_Name = "Module1"
  2. Option Explicit
  3. Public Declare Function GetWindowsDirectory Lib "Kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
  4. Public FoundWindows As String, ZSend As String
  5. Public ZTop As Integer, ZLeft As Integer, ZWidth As Integer, ZHeight As Integer
  6. Public AQZ_H As Integer, AQZ_M As Integer, AQZ_S As Integer, ZTempPath As String
  7. ' Object reference to the DLL that contains the resources to be loaded.
  8. Public clsCTARS As Object
  9. Public Const Indicator = ":':"
  10. 'UDP Port
  11. Public Client As New Collection
  12. Public Names As New Collection
  13. Public RmIP As String, RmPt As String
  14. 'Sound
  15. Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
  16. '  flag values for uFlags parameter
  17. Public Const SND_SYNC = &H0         '  play synchronously (default)
  18. Public Const SND_ASYNC = &H1         '  play asynchronously
  19. Public Const SND_NODEFAULT = &H2         '  silence not default, if sound not found
  20. Public Const SND_MEMORY = &H4         '  lpszSoundName points to a memory file
  21. Public Const SND_ALIAS = &H10000     '  name is a WIN.INI [sounds] entry
  22. Public Const SND_FILENAME = &H20000     '  name is a file name
  23. Public Const SND_RESOURCE = &H40004     '  name is a resource name or atom
  24. Public Const SND_ALIAS_ID = &H110000    '  name is a WIN.INI [sounds] entry identifier
  25. Public Const SND_ALIAS_START = 0  '  must be > 4096 to keep strings in same section of resource file
  26. Public Const SND_LOOP = &H8         '  loop the sound until next sndPlaySound
  27. Public Const SND_NOSTOP = &H10        '  don't stop any currently playing sound
  28. Public Const SND_VALID = &H1F        '  valid flags          / ;Internal /
  29. Public Const SND_NOWAIT = &H2000      '  don't wait if the driver is busy
  30. Public Const SND_VALIDFLAGS = &H17201F    '  Set of valid flag bits.  Anything outside
  31. Public Const SND_RESERVED = &HFF000000  '  In particular these flags are reserved
  32. Public Const SND_TYPE_MASK = &H170007
  33. Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
  34. Public Declare Function GetDesktopWindow Lib "user32" () As Long
  35. Public Declare Function GetWindowLW Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
  36. Public Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
  37. Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
  38. Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
  39. Public Const GWL_ID = (-12)
  40. Public Const GW_HWNDNEXT = 2
  41. Public Const GW_CHILD = 5
  42. 'My Defs
  43. Public ZWhosTurn As Integer, ZRotated As Boolean, ZToggle As Integer, BoardFrom As Integer, BoardTo As Integer, BlackInCheck As Boolean, WhiteInCheck As Boolean, BlackCheckMate As Boolean, WhiteCheckMate As Boolean
  44. Public LegalMove As Boolean, OpInProgress As Boolean, OpInProgress2 As Boolean, WhatPiece As String, BlackKingHasMoved As Boolean, WhiteKingHasMoved As Boolean
  45. Public WhiteCanCastleKingSide As Boolean, WhiteCanCastleQueenSide As Boolean, BlackCanCastleKingSide As Boolean, BlackCanCastleQueenSide As Boolean, TriedToCastle As Boolean
  46. Public ZBoardFrom As Integer, ZBoardTo As Integer, ZBoardFromTo As String, ZLastMove As String, ZGameInProcess As Boolean, ZMovingPiece As Boolean
  47. Public ZGuestMode As Boolean, ZLastMessage As String
  48. Public Const CWhite = 1
  49. Public Const CBlack = 2
  50. Public Sub SendOutIP()
  51. On Local Error Resume Next
  52. Err.Clear
  53. 'Send a text message to all clients in collection/listbox
  54. Dim X As Integer
  55. 'Loop through all IP in listbox and get the right Users IP
  56. For X = 0 To RJSoftChess.lName.ListCount - 1
  57.     'Select each IP
  58.     RJSoftChess.lName.ListIndex = X
  59.     'Set IP and Port to send to
  60.     RmIP = RJSoftChess.lName.Text
  61.     RmPt = Client(RmIP)
  62.     RJSoftChess.Wsck.RemoteHost = RmIP
  63.     RJSoftChess.Wsck.RemotePort = RmPt
  64.     'Send text message
  65.     RJSoftChess.Wsck.SendData ZSend
  66. Next
  67. Err.Clear
  68. End Sub
  69. Public Sub FindPath()
  70. On Local Error Resume Next
  71. Err.Clear
  72. Dim ZTempPath As String, X As Integer
  73. ZTempPath = String(145, 0)
  74. X = GetWindowsDirectory(ZTempPath, 145)
  75. ZTempPath = Left(ZTempPath, X)
  76. If Right(ZTempPath, 1) <> "" Then
  77.     FoundWindows = ZTempPath + ""
  78. Else
  79.     FoundWindows = ZTempPath
  80. End If
  81. End Sub
  82. Public Function CheckForLegalMove(XMove As Boolean)
  83. On Local Error Resume Next
  84. Err.Clear
  85. Dim ZFrom As Integer, ZTo As Integer, ZFrom2 As Integer, ZTo2 As Integer, XY As Integer, Y As Integer, ZDirection As Long, ZTempKing As String
  86. LegalMove = False
  87. TriedToCastle = False
  88. 'Pawn
  89. If WhatPiece = "PN" Then
  90.     'check 2
  91.     If (Abs(Int(BoardFrom / 8)) = 1) Or (Abs(Int(BoardFrom / 8)) = 6) Then
  92.         If (Abs(BoardFrom - (Int(BoardFrom / 8) * 8) = Abs(BoardTo - (Int(BoardTo / 8) * 8)))) And (Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) = 2) And (RJSoftChess.Board(BoardTo).Tag = "") Then LegalMove = True
  93.         If Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) > 2 Then Exit Function
  94.      Else
  95.         If Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) > 1 Then Exit Function
  96.     End If
  97.     'check 1
  98.     If ZRotated = True Then
  99.         If ZWhosTurn = CWhite Then
  100.             If BoardTo < BoardFrom Then Exit Function
  101.          Else
  102.             If BoardFrom < BoardTo Then Exit Function
  103.         End If
  104.         If ZWhosTurn = CWhite Then
  105.             If Abs(BoardFrom - (Int(BoardFrom / 8) * 8) = Abs(BoardTo - (Int(BoardTo / 8) * 8))) And (Int(BoardTo / 8) - Int(BoardFrom / 8)) = 1 Then LegalMove = True
  106.             If BoardTo >= 56 And BoardTo <= 63 And XMove = True Then
  107.                 RJSoftChess.Board(BoardFrom).Picture = RJSoftChess.Master_White(1).Picture
  108.                 RJSoftChess.Board(BoardFrom).Tag = "WQU"
  109.             End If
  110.          Else
  111.             If Abs(BoardFrom - (Int(BoardFrom / 8) * 8) = Abs(BoardTo - (Int(BoardTo / 8) * 8))) And (Int(BoardTo / 8) - Int(BoardFrom / 8)) = -1 Then LegalMove = True
  112.             If BoardTo >= 0 And BoardTo <= 7 And XMove = True Then
  113.                 RJSoftChess.Board(BoardFrom).Picture = RJSoftChess.Master_Black(1).Picture
  114.                 RJSoftChess.Board(BoardFrom).Tag = "BQU"
  115.             End If
  116.         End If
  117.      Else
  118.         If ZWhosTurn = CWhite Then
  119.             If BoardFrom < BoardTo Then Exit Function
  120.          Else
  121.             If BoardTo < BoardFrom Then Exit Function
  122.         End If
  123.         If ZWhosTurn = CWhite Then
  124.             If Abs(BoardFrom - (Int(BoardFrom / 8) * 8) = Abs(BoardTo - (Int(BoardTo / 8) * 8))) And (Int(BoardTo / 8) - Int(BoardFrom / 8)) = -1 Then LegalMove = True
  125.             If BoardTo >= 0 And BoardTo <= 7 And XMove = True Then
  126.                 RJSoftChess.Board(BoardFrom).Picture = RJSoftChess.Master_White(1).Picture
  127.                 RJSoftChess.Board(BoardFrom).Tag = "WQU"
  128.             End If
  129.          Else
  130.             If Abs(BoardFrom - (Int(BoardFrom / 8) * 8) = Abs(BoardTo - (Int(BoardTo / 8) * 8))) And (Int(BoardTo / 8) - Int(BoardFrom / 8)) = 1 Then LegalMove = True
  131.             If BoardTo >= 56 And BoardTo <= 63 And XMove = True Then
  132.                 RJSoftChess.Board(BoardFrom).Picture = RJSoftChess.Master_Black(1).Picture
  133.                 RJSoftChess.Board(BoardFrom).Tag = "BQU"
  134.             End If
  135.         End If
  136.     End If
  137.     'Can take the piece?
  138.     If RJSoftChess.Board(BoardTo).Tag <> "" Then
  139.         'Kill at angle
  140.         If (Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) + 1 = Abs(BoardTo - (Int(BoardTo / 8) * 8))) And (Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) > 0) Then LegalMove = True
  141.         If (Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) - 1 = Abs(BoardTo - (Int(BoardTo / 8) * 8))) And (Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) > 0) Then LegalMove = True
  142.         'Can't kill head on.  Must be at an angle
  143.         If Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) - Abs(BoardTo - (Int(BoardTo / 8) * 8)) = 0 Then LegalMove = False
  144.         If LegalMove = False Then
  145.             'Must not be backwards
  146.             If ZRotated = True Then
  147.                 If ZWhosTurn = CWhite Then
  148.                     ZDirection = ((BoardFrom - BoardTo) / Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)))
  149.                     If ZDirection = 7 Or ZDirection = 9 Then LegalMove = False
  150.                  Else
  151.                     ZDirection = ((BoardFrom - BoardTo) / Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)))
  152.                     If ZDirection = -7 Or ZDirection = -9 Then LegalMove = False
  153.                 End If
  154.              Else
  155.                 If ZWhosTurn = CWhite Then
  156.                     ZDirection = ((BoardFrom - BoardTo) / Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)))
  157.                     If ZDirection = -7 Or ZDirection = -9 Then LegalMove = False
  158.                  Else
  159.                     ZDirection = ((BoardFrom - BoardTo) / Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)))
  160.                     If ZDirection = 7 Or ZDirection = 9 Then LegalMove = False
  161.                 End If
  162.             End If
  163.         End If
  164.      Else
  165.         If Abs(BoardFrom - (Int(BoardFrom / 8) * 8) = Abs(BoardTo - (Int(BoardTo / 8) * 8))) And (Abs(Int(BoardTo / 8) - Int(BoardFrom / 8))) = 2 Then
  166.             'Can't move backwards
  167.             If ZRotated = True Then
  168.                 If ZWhosTurn = CWhite Then
  169.                     If RJSoftChess.Board(BoardTo - 8).Tag <> "" Then LegalMove = False
  170.                  Else
  171.                     If RJSoftChess.Board(BoardTo + 8).Tag <> "" Then LegalMove = False
  172.                 End If
  173.              Else
  174.                 If ZWhosTurn = CWhite Then
  175.                     If RJSoftChess.Board(BoardTo + 8).Tag <> "" Then LegalMove = False
  176.                  Else
  177.                     If RJSoftChess.Board(BoardTo - 8).Tag <> "" Then LegalMove = False
  178.                 End If
  179.             End If
  180.         End If
  181.     End If
  182.     GoTo TestMove
  183.     Exit Function
  184. End If
  185. 'Rook
  186. If WhatPiece = "RK" Then
  187.     If (Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = Abs(BoardTo - (Int(BoardTo / 8) * 8))) And (Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) > 0) Then
  188.         LegalMove = True
  189.         ZDirection = ((BoardFrom - BoardTo) / Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)))
  190.     End If
  191.     If (Abs(BoardFrom - (Int(BoardFrom * 8) / 8)) = Abs(BoardTo - (Int(BoardTo * 8) / 8))) And (Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) = 0) Then
  192.         LegalMove = True
  193.         ZDirection = BoardFrom - BoardTo
  194.     End If
  195.     If LegalMove = True Then
  196.         GoSub TestUpDownSideSide
  197.         GoTo TestMove
  198.     End If
  199.     Exit Function
  200. End If
  201. 'Knight
  202. If WhatPiece = "KN" Then
  203.     ZFrom = BoardFrom - (Int(BoardFrom / 8) * 8)
  204.     ZTo = BoardTo - (Int(BoardTo / 8) * 8)
  205.     ZFrom2 = Int(BoardFrom / 8)
  206.     ZTo2 = Int(BoardTo / 8)
  207.     'check 1 right 2 down
  208.     If ZTo = ZFrom + 1 And ZTo2 = ZFrom2 + 2 Then LegalMove = True
  209.     'check 2 right 1 down
  210.     If ZTo = ZFrom + 2 And ZTo2 = ZFrom2 + 1 Then LegalMove = True
  211.     'check 1 right 2 up
  212.     If ZTo = ZFrom + 1 And ZTo2 = ZFrom2 - 2 Then LegalMove = True
  213.     'check 2 right 1 up
  214.     If ZTo = ZFrom + 2 And ZTo2 = ZFrom2 - 1 Then LegalMove = True
  215.     'check 1 left 2 down
  216.     If ZTo = ZFrom - 1 And ZTo2 = ZFrom2 + 2 Then LegalMove = True
  217.     'check 1 left 2 up
  218.     If ZTo = ZFrom - 1 And ZTo2 = ZFrom2 - 2 Then LegalMove = True
  219.     'check 2 left 1 down
  220.     If ZTo = ZFrom - 2 And ZTo2 = ZFrom2 + 1 Then LegalMove = True
  221.     'check 2 left 1 up
  222.     If ZTo = ZFrom - 2 And ZTo2 = ZFrom2 - 1 Then LegalMove = True
  223.     GoTo TestMove
  224.     Exit Function
  225. End If
  226. 'Bishop
  227. If WhatPiece = "BP" Then
  228.     If Abs(Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) - Abs(BoardTo - (Int(BoardTo / 8) * 8))) = Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) Then
  229.         LegalMove = True
  230.         GoSub TestAngle
  231.         GoTo TestMove
  232.     End If
  233.     Exit Function
  234. End If
  235. 'Queen
  236. If WhatPiece = "QU" Then
  237.     'Angle
  238.     If Abs(Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) - Abs(BoardTo - (Int(BoardTo / 8) * 8))) = Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) Then
  239.         LegalMove = True
  240.         GoSub TestAngle
  241.     End If
  242.     'Up/Down/Side/Side
  243.     If LegalMove = False Then
  244.         If (Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = Abs(BoardTo - (Int(BoardTo / 8) * 8))) And (Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) > 0) Then
  245.             LegalMove = True
  246.             ZDirection = ((BoardFrom - BoardTo) / Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)))
  247.         End If
  248.         If (Abs(BoardFrom - (Int(BoardFrom * 8) / 8)) = Abs(BoardTo - (Int(BoardTo * 8) / 8))) And (Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)) = 0) Then
  249.             LegalMove = True
  250.             ZDirection = BoardFrom - BoardTo
  251.         End If
  252.         If LegalMove = True Then GoSub TestUpDownSideSide
  253.     End If
  254.     GoTo TestMove
  255.     Exit Function
  256. End If
  257. 'King
  258. If WhatPiece = "KK" Then
  259.     'Up/Down
  260.     If BoardTo = BoardFrom + 8 Then LegalMove = True
  261.     If BoardTo = BoardFrom - 8 Then LegalMove = True
  262.     'Side to Side
  263.     If BoardTo = BoardFrom + 1 Then LegalMove = True
  264.     If BoardTo = BoardFrom - 1 Then LegalMove = True
  265.     'Angle
  266.     If BoardTo = BoardFrom + 7 Then LegalMove = True
  267.     If BoardTo = BoardFrom - 7 Then LegalMove = True
  268.     If BoardTo = BoardFrom + 9 Then LegalMove = True
  269.     If BoardTo = BoardFrom - 9 Then LegalMove = True
  270.     
  271.     'Check to see if moving next to other King
  272.     If ZWhosTurn = CWhite Then
  273.         ZTempKing = "BKK"
  274.      Else
  275.         ZTempKing = "WKK"
  276.     End If
  277.     Err.Clear
  278.     'Up/Down
  279.     If RJSoftChess.Board(BoardTo + 8).Tag = ZTempKing Then
  280.         If Err = 0 Then
  281.             LegalMove = False
  282.             Exit Function
  283.         End If
  284.     End If
  285.     Err.Clear
  286.     If RJSoftChess.Board(BoardTo - 8).Tag = ZTempKing Then
  287.         If Err = 0 Then
  288.             LegalMove = False
  289.             Exit Function
  290.         End If
  291.     End If
  292.     Err.Clear
  293.     'Side to Side
  294.     If RJSoftChess.Board(BoardTo + 1).Tag = ZTempKing Then
  295.         If Err = 0 Then
  296.             LegalMove = False
  297.             Exit Function
  298.         End If
  299.     End If
  300.     Err.Clear
  301.     If RJSoftChess.Board(BoardTo - 1).Tag = ZTempKing Then
  302.         If Err = 0 Then
  303.             LegalMove = False
  304.             Exit Function
  305.         End If
  306.     End If
  307.     Err.Clear
  308.     'Angle
  309.     If RJSoftChess.Board(BoardTo + 7).Tag = ZTempKing Then
  310.         If Err = 0 Then
  311.             LegalMove = False
  312.             Exit Function
  313.         End If
  314.     End If
  315.     Err.Clear
  316.     If RJSoftChess.Board(BoardTo - 7).Tag = ZTempKing Then
  317.         If Err = 0 Then
  318.             LegalMove = False
  319.             Exit Function
  320.         End If
  321.     End If
  322.     Err.Clear
  323.     If RJSoftChess.Board(BoardTo + 9).Tag = ZTempKing Then
  324.         If Err = 0 Then
  325.             LegalMove = False
  326.             Exit Function
  327.         End If
  328.     End If
  329.     Err.Clear
  330.     If RJSoftChess.Board(BoardTo - 9).Tag = ZTempKing Then
  331.         If Err = 0 Then
  332.             LegalMove = False
  333.             Exit Function
  334.         End If
  335.     End If
  336.     
  337.     If ZWhosTurn = CWhite Then
  338.         If ZRotated = True Then
  339.             'Tried To Castle
  340.             If (BoardFrom = 4 And BoardTo = 6) Or (BoardFrom = 4 And BoardTo = 2) Then TriedToCastle = True
  341.             If WhiteKingHasMoved = False And WhiteInCheck = False Then
  342.                 'Castle?
  343.                 If BoardFrom = 4 And BoardTo = 6 Then
  344.                     LegalMove = True
  345.                     If XMove = True Then
  346.                         'Castle King Side
  347.                         RJSoftChess.Board(5).Picture = RJSoftChess.Board(7).Picture
  348.                         RJSoftChess.Board(5).Tag = RJSoftChess.Board(7).Tag
  349.                         RJSoftChess.Board(7).Picture = RJSoftChess.Master_Blank.Picture
  350.                         RJSoftChess.Board(7).Tag = ""
  351.                         WhiteCanCastleKingSide = False
  352.                         WhiteCanCastleQueenSide = False
  353.                     End If
  354.                 End If
  355.                 If BoardFrom = 4 And BoardTo = 2 Then
  356.                     LegalMove = True
  357.                     If XMove = True Then
  358.                         'Castle Queen Side
  359.                         RJSoftChess.Board(3).Picture = RJSoftChess.Board(0).Picture
  360.                         RJSoftChess.Board(3).Tag = RJSoftChess.Board(0).Tag
  361.                         RJSoftChess.Board(0).Picture = RJSoftChess.Master_Blank.Picture
  362.                         RJSoftChess.Board(0).Tag = ""
  363.                         WhiteCanCastleKingSide = False
  364.                         WhiteCanCastleQueenSide = False
  365.                     End If
  366.                 End If
  367.             End If
  368.             If LegalMove = True And XMove = True Then WhiteKingHasMoved = True
  369.          Else
  370.             'Tried To Castle
  371.             If (BoardFrom = 59 And BoardTo = 57) Or (BoardFrom = 59 And BoardTo = 61) Then TriedToCastle = True
  372.             If WhiteKingHasMoved = False And WhiteInCheck = False Then
  373.                 'Castle?
  374.                 If BoardFrom = 59 And BoardTo = 57 Then
  375.                     LegalMove = True
  376.                     If XMove = True Then
  377.                         'Castle King Side
  378.                         RJSoftChess.Board(58).Picture = RJSoftChess.Board(56).Picture
  379.                         RJSoftChess.Board(58).Tag = RJSoftChess.Board(56).Tag
  380.                         RJSoftChess.Board(56).Picture = RJSoftChess.Master_Blank.Picture
  381.                         RJSoftChess.Board(56).Tag = ""
  382.                         WhiteCanCastleKingSide = False
  383.                         WhiteCanCastleQueenSide = False
  384.                     End If
  385.                 End If
  386.                 If BoardFrom = 59 And BoardTo = 61 Then
  387.                     LegalMove = True
  388.                     If XMove = True Then
  389.                         'Castle Queen Side
  390.                         RJSoftChess.Board(60).Picture = RJSoftChess.Board(63).Picture
  391.                         RJSoftChess.Board(60).Tag = RJSoftChess.Board(63).Tag
  392.                         RJSoftChess.Board(63).Picture = RJSoftChess.Master_Blank.Picture
  393.                         RJSoftChess.Board(63).Tag = ""
  394.                         WhiteCanCastleKingSide = False
  395.                         WhiteCanCastleQueenSide = False
  396.                     End If
  397.                 End If
  398.                 If LegalMove = True And XMove = True Then WhiteKingHasMoved = True
  399.             End If
  400.         End If
  401.      Else
  402.         If ZRotated = True Then
  403.             'Tried To Castle
  404.             If (BoardFrom = 62 And BoardTo = 60) Or (BoardFrom = 60 And BoardTo = 58) Then TriedToCastle = True
  405.             If BlackKingHasMoved = False And BlackInCheck = False Then
  406.                 'Castle?
  407.                 If BoardFrom = 60 And BoardTo = 62 Then
  408.                     LegalMove = True
  409.                     If XMove = True Then
  410.                         'Castle King Side
  411.                         RJSoftChess.Board(61).Picture = RJSoftChess.Board(63).Picture
  412.                         RJSoftChess.Board(61).Tag = RJSoftChess.Board(63).Tag
  413.                         RJSoftChess.Board(63).Picture = RJSoftChess.Master_Blank.Picture
  414.                         RJSoftChess.Board(63).Tag = ""
  415.                         BlackCanCastleKingSide = False
  416.                         BlackCanCastleQueenSide = False
  417.                     End If
  418.                 End If
  419.                 If BoardFrom = 60 And BoardTo = 58 Then
  420.                     LegalMove = True
  421.                     If XMove = True Then
  422.                         'Castle Queen Side
  423.                         RJSoftChess.Board(59).Picture = RJSoftChess.Board(56).Picture
  424.                         RJSoftChess.Board(59).Tag = RJSoftChess.Board(56).Tag
  425.                         RJSoftChess.Board(56).Picture = RJSoftChess.Master_Blank.Picture
  426.                         RJSoftChess.Board(56).Tag = ""
  427.                         BlackCanCastleKingSide = False
  428.                         BlackCanCastleQueenSide = False
  429.                     End If
  430.                 End If
  431.                 If LegalMove = True And XMove = True Then BlackKingHasMoved = True
  432.             End If
  433.          Else
  434.             'Tried To Castle
  435.             If (BoardFrom = 3 And BoardTo = 1) Or (BoardFrom = 3 And BoardTo = 5) Then TriedToCastle = True
  436.             If BlackKingHasMoved = False And BlackInCheck = False Then
  437.                 'Castle?
  438.                 If BoardFrom = 3 And BoardTo = 1 Then
  439.                     LegalMove = True
  440.                     If XMove = True Then
  441.                         'Castle King Side
  442.                         RJSoftChess.Board(2).Picture = RJSoftChess.Board(0).Picture
  443.                         RJSoftChess.Board(2).Tag = RJSoftChess.Board(0).Tag
  444.                         RJSoftChess.Board(0).Picture = RJSoftChess.Master_Blank.Picture
  445.                         RJSoftChess.Board(0).Tag = ""
  446.                         BlackCanCastleKingSide = False
  447.                         BlackCanCastleQueenSide = False
  448.                     End If
  449.                 End If
  450.                 If BoardFrom = 3 And BoardTo = 5 Then
  451.                     LegalMove = True
  452.                     If XMove = True Then
  453.                         'Castle Queen Side
  454.                         RJSoftChess.Board(4).Picture = RJSoftChess.Board(7).Picture
  455.                         RJSoftChess.Board(4).Tag = RJSoftChess.Board(7).Tag
  456.                         RJSoftChess.Board(7).Picture = RJSoftChess.Master_Blank.Picture
  457.                         RJSoftChess.Board(7).Tag = ""
  458.                         BlackCanCastleKingSide = False
  459.                         BlackCanCastleQueenSide = False
  460.                     End If
  461.                 End If
  462.                 If LegalMove = True And XMove = True Then BlackKingHasMoved = True
  463.             End If
  464.         End If
  465.     End If
  466.     
  467.     GoTo TestMove
  468.     Exit Function
  469. End If
  470. Exit Function
  471. TestMove:
  472.     'Can not take your on piece
  473.     If ZWhosTurn = CWhite Then
  474.         If Left(RJSoftChess.Board(BoardTo).Tag, 1) = "W" Then LegalMove = False
  475.      Else
  476.         If Left(RJSoftChess.Board(BoardTo).Tag, 1) = "B" Then LegalMove = False
  477.     End If
  478.     If LegalMove = True And XMove = True Then RJSoftChess.Board(BoardTo).Picture = RJSoftChess.Master_Blank.Picture
  479. Exit Function
  480. TestAngle:
  481.     'Can not jump over own piece
  482.     'What Direction?
  483.     ' 7 = Upper Left
  484.     ' 9 = Upper Right
  485.     '-7 = Lower Right
  486.     '-9 = Lower Left
  487.     ZDirection = ((BoardFrom - BoardTo) / Abs(Int(BoardTo / 8) - Int(BoardFrom / 8)))
  488.     If ZDirection = 0 Then Return
  489.     For XY = BoardFrom - ZDirection To BoardTo Step -ZDirection
  490.         If ZWhosTurn = CWhite Then
  491.             If Left(RJSoftChess.Board(XY).Tag, 1) = "W" Then
  492.                 LegalMove = False
  493.                 Exit For
  494.             End If
  495.             If (XY <> BoardTo) And (Left(RJSoftChess.Board(XY).Tag, 1) = "B") Then
  496.                 LegalMove = False
  497.                 Exit For
  498.             End If
  499.          Else
  500.             If Left(RJSoftChess.Board(XY).Tag, 1) = "B" Then
  501.                 LegalMove = False
  502.                 Exit For
  503.             End If
  504.             If (XY <> BoardTo) And (Left(RJSoftChess.Board(XY).Tag, 1) = "W") Then
  505.                 LegalMove = False
  506.                 Exit For
  507.             End If
  508.         End If
  509.     Next XY
  510. Return
  511. TestUpDownSideSide:
  512.     If Abs(ZDirection) <> 8 Then
  513.         If BoardFrom < BoardTo Then
  514.             For XY = BoardFrom + 1 To BoardTo
  515.                 If ZWhosTurn = CWhite Then
  516.                     If Left(RJSoftChess.Board(XY).Tag, 1) = "W" Then
  517.                         LegalMove = False
  518.                         Exit For
  519.                     End If
  520.                     If (XY <> BoardTo) And (Left(RJSoftChess.Board(XY).Tag, 1) = "B") Then
  521.                         LegalMove = False
  522.                         Exit For
  523.                     End If
  524.                  Else
  525.                     If Left(RJSoftChess.Board(XY).Tag, 1) = "B" Then
  526.                         LegalMove = False
  527.                         Exit For
  528.                     End If
  529.                     If (XY <> BoardTo) And (Left(RJSoftChess.Board(XY).Tag, 1) = "W") Then
  530.                         LegalMove = False
  531.                         Exit For
  532.                     End If
  533.                 End If
  534.             Next XY
  535.          Else
  536.             For XY = BoardFrom - 1 To BoardTo Step -1
  537.                 If ZWhosTurn = CWhite Then
  538.                     If Left(RJSoftChess.Board(XY).Tag, 1) = "W" Then
  539.                         LegalMove = False
  540.                         Exit For
  541.                     End If
  542.                     If (XY <> BoardTo) And (Left(RJSoftChess.Board(XY).Tag, 1) = "B") Then
  543.                         LegalMove = False
  544.                         Exit For
  545.                     End If
  546.                  Else
  547.                     If Left(RJSoftChess.Board(XY).Tag, 1) = "B" Then
  548.                         LegalMove = False
  549.                         Exit For
  550.                     End If
  551.                     If (XY <> BoardTo) And (Left(RJSoftChess.Board(XY).Tag, 1) = "W") Then
  552.                         LegalMove = False
  553.                         Exit For
  554.                     End If
  555.                 End If
  556.             Next XY
  557.         End If
  558.     Else
  559.         For XY = BoardFrom - ZDirection To BoardTo Step -ZDirection
  560.             If ZWhosTurn = CWhite Then
  561.                 If Left(RJSoftChess.Board(XY).Tag, 1) = "W" Then
  562.                     LegalMove = False
  563.                     Exit For
  564.                 End If
  565.                 If (XY <> BoardTo) And (Left(RJSoftChess.Board(XY).Tag, 1) = "B") Then
  566.                     LegalMove = False
  567.                     Exit For
  568.                 End If
  569.              Else
  570.                 If Left(RJSoftChess.Board(XY).Tag, 1) = "B" Then
  571.                     LegalMove = False
  572.                     Exit For
  573.                 End If
  574.                 If (XY <> BoardTo) And (Left(RJSoftChess.Board(XY).Tag, 1) = "W") Then
  575.                     LegalMove = False
  576.                     Exit For
  577.                 End If
  578.             End If
  579.         Next XY
  580.     End If
  581.     If XMove = True Then
  582.         If ZWhosTurn = CWhite Then
  583.             If ZRotated = True Then
  584.                 If WhiteKingHasMoved = False Then
  585.                     If Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = 7 Then WhiteCanCastleKingSide = False
  586.                     If Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = 0 Then WhiteCanCastleQueenSide = False
  587.                     If WhiteCanCastleKingSide = False And WhiteCanCastleQueenSide = False Then WhiteKingHasMoved = True
  588.                 End If
  589.              Else
  590.                 If WhiteKingHasMoved = False Then
  591.                     If Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = 56 Then WhiteCanCastleKingSide = False
  592.                     If Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = 63 Then WhiteCanCastleQueenSide = False
  593.                     If WhiteCanCastleKingSide = False And WhiteCanCastleQueenSide = False Then WhiteKingHasMoved = True
  594.                 End If
  595.             End If
  596.          Else
  597.             If ZRotated = True Then
  598.                 If BlackKingHasMoved = False Then
  599.                     If Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = 63 Then BlackCanCastleKingSide = False
  600.                     If Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = 56 Then BlackCanCastleQueenSide = False
  601.                     If BlackCanCastleKingSide = False And BlackCanCastleQueenSide = False Then BlackKingHasMoved = True
  602.                 End If
  603.              Else
  604.                 If BlackKingHasMoved = False Then
  605.                     If Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = 0 Then BlackCanCastleKingSide = False
  606.                     If Abs(BoardFrom - (Int(BoardFrom / 8) * 8)) = 7 Then BlackCanCastleQueenSide = False
  607.                     If BlackCanCastleKingSide = False And BlackCanCastleQueenSide = False Then BlackKingHasMoved = True
  608.                 End If
  609.             End If
  610.         End If
  611.     End If
  612. Return
  613. End Function
  614. Function CheckForCheck(CheckForAlreadyInCheck As Boolean)
  615. Dim X As Integer, InCheck As Boolean, P As Integer
  616. Dim WhereFrom As Integer, WhereTo As Integer, ZTempKing As String, ZTempLegalMove As Boolean
  617. Dim KingLocation As Integer, ZTempWhatPiece As String, ZTempFromTag As String, ZTempToTag As String
  618. InCheck = False
  619. WhereFrom = BoardFrom
  620. WhereTo = BoardTo
  621. ZTempWhatPiece = WhatPiece
  622. ZTempLegalMove = LegalMove
  623. If CheckForAlreadyInCheck = True Then
  624.     If ZWhosTurn = CWhite Then
  625.         ZTempKing = "WKK"
  626.         ZWhosTurn = CBlack
  627.      Else
  628.         ZTempKing = "BKK"
  629.         ZWhosTurn = CWhite
  630.     End If
  631.  Else
  632.     If ZWhosTurn = CWhite Then
  633.         ZTempKing = "BKK"
  634.      Else
  635.         ZTempKing = "WKK"
  636.     End If
  637. End If
  638. 'King Location
  639. If Right(ZTempWhatPiece, 2) = "KK" Then 'Check to see if it's the King that moved
  640.     If CheckForAlreadyInCheck = True And TriedToCastle = True Then
  641.         If BlackInCheck = True Or WhiteInCheck = True Then
  642.             WhatPiece = ZTempWhatPiece
  643.             BoardFrom = WhereFrom
  644.             BoardTo = WhereTo
  645.             LegalMove = False
  646.             If ZWhosTurn = CWhite Then
  647.                 ZWhosTurn = CBlack
  648.              Else
  649.                 ZWhosTurn = CWhite
  650.             End If
  651.             Exit Function
  652.         End If
  653.     End If
  654.     KingLocation = BoardTo
  655.  Else
  656.     For X = 0 To 63
  657.         If Trim(RJSoftChess.Board(X).Tag) = ZTempKing Then
  658.             KingLocation = X
  659.             Exit For
  660.         End If
  661.     Next X
  662. End If
  663. If CheckForAlreadyInCheck = True Then
  664.     ZTempFromTag = RJSoftChess.Board(BoardFrom).Tag
  665.     ZTempToTag = RJSoftChess.Board(BoardTo).Tag
  666.     RJSoftChess.Board(BoardTo).Tag = RJSoftChess.Board(BoardFrom).Tag
  667.     RJSoftChess.Board(BoardFrom).Tag = ""
  668. End If
  669. 'Check all locations to see if king can be killed
  670. For P = 0 To 63
  671.     WhatPiece = Right(RJSoftChess.Board(P).Tag, 2)
  672.     BoardFrom = P
  673.     BoardTo = KingLocation
  674.     If (Trim(Left(RJSoftChess.Board(P).Tag, 1)) <> Left(ZTempKing, 1)) Then
  675.         CheckForLegalMove False
  676.         If LegalMove = True Then
  677.             If Trim(RJSoftChess.Board(BoardTo).Tag) = ZTempKing Then
  678.                 InCheck = True
  679.                 Exit For
  680.             End If
  681.         End If
  682.     End If
  683. Next P
  684. WhatPiece = ZTempWhatPiece
  685. BoardFrom = WhereFrom
  686. BoardTo = WhereTo
  687. LegalMove = ZTempLegalMove
  688. If CheckForAlreadyInCheck = True Then
  689.     RJSoftChess.Board(BoardFrom).Tag = ZTempFromTag
  690.     RJSoftChess.Board(BoardTo).Tag = ZTempToTag
  691.     If ZWhosTurn = CWhite Then
  692.         ZWhosTurn = CBlack
  693.      Else
  694.         ZWhosTurn = CWhite
  695.     End If
  696. End If
  697. BlackInCheck = False
  698. WhiteInCheck = False
  699. If CheckForAlreadyInCheck = True Then
  700.     If InCheck = True Then
  701.         If ZWhosTurn = CWhite Then
  702.             BlackInCheck = Not InCheck
  703.             WhiteInCheck = InCheck
  704.          Else
  705.             BlackInCheck = InCheck
  706.             WhiteInCheck = Not InCheck
  707.         End If
  708.     End If
  709.  Else
  710.     If InCheck = True Then
  711.         If ZWhosTurn = CWhite Then
  712.             BlackInCheck = InCheck
  713.             WhiteInCheck = Not InCheck
  714.          Else
  715.             BlackInCheck = Not InCheck
  716.             WhiteInCheck = InCheck
  717.         End If
  718.     End If
  719. End If
  720. End Function