GameField.vb
上传用户:c_chunwei
上传日期:2022-05-07
资源大小:80k
文件大小:5k
源码类别:

其他智力游戏

开发平台:

Visual Basic

  1. Imports System
  2. Imports System.Drawing
  3. Imports System.Drawing.Drawing2D
  4. Namespace Nettrix
  5.     _
  6.     Public Class GameField
  7.         ' The Game Field Witdth Will Be Exactly 16 Bits (2 Bytes)
  8.         Public Const Width As Integer = 16
  9.         Public Const Height As Integer = 30
  10.         ' The Size Of Each Square
  11.         Public Const SquareSize As Integer = 10
  12.         Private Shared ArrGameField(Width, Height) As Square
  13.         Private Shared ArrBitGameField(Height) As Integer
  14.         Public Shared WinHandle As System.IntPtr
  15.         Public Shared BackColor As Color
  16.         Private Const BitEmpty As Integer = &H0 '00000000 0000000
  17.         Private Const BitFull As Integer = &HFFFF
  18.         '11111111 1111111
  19.         ' X Goes From 0 To Width -1
  20.         ' Y Goes From 0 To Height -1
  21.         Public Shared Function IsEmpty(ByVal X As Integer, ByVal Y As Integer) As Boolean
  22.             ' If The Y Or X Is Beyond The Game Field, Return False
  23.             If Y < 0 Or Y >= Height Or (X < 0 Or X >= Width) Then
  24.                 Return False
  25.                 '  Test The Xth Bit Of The Yth Line Of The Game Field
  26.             Else
  27.                 If (ArrBitGameField(Y) And (1 << X)) <> 0 Then
  28.                     Return False
  29.                 End If
  30.             End If
  31.             Return True
  32.         End Function 'IsEmpty
  33.         Public Shared Function CheckLines() As Integer
  34.             Dim CheckLines_result As Integer = 0 'Returns The Number Of Lines Completed
  35.             Dim Y As Integer = Height - 1
  36.             While Y >= 0
  37.                 ' Stops The Loop When The Blank Lines Are Reached
  38.                 If ArrBitGameField(Y) = BitEmpty Then
  39.                     Y = 0
  40.                 End If
  41.                 ' If All The Bits Of The Line Are Set, Then Increment The 
  42.                 '    Counter To Clear The Line And Move All Above Lines Down
  43.                 If ArrBitGameField(Y) = BitFull Then
  44.                     CheckLines_result += 1
  45.                     ' Move All Next Lines Down
  46.                     Dim Index As Integer
  47.                     For Index = Y To 0 Step -1
  48.                         ' If The Current Line Is NOT The First Of The Game Field,
  49.                         '  Copy The Line Above
  50.                         If Index > 0 Then
  51.                             ' Copy The Bits From The Line Above 
  52.                             ArrBitGameField(Index) = ArrBitGameField((Index - 1))
  53.                             ' Copy Each Of The Squares From The Line Above 
  54.                             Dim X As Integer
  55.                             For X = 0 To Width - 1
  56.                                 ' Copy The Square
  57.                                 ArrGameField(X, Index) = ArrGameField(X, Index - 1)
  58.                                 ' Update The Location Property Of The Square
  59.                                 If Not (ArrGameField(X, Index) Is Nothing) Then
  60.                                     ArrGameField(X, Index).Location = New Point(ArrGameField(X, Index).Location.X, ArrGameField(X, Index).Location.Y + SquareSize)
  61.                                 End If
  62.                             Next X
  63.                         Else
  64.                             ' If The Current Line Is The First Of The Game Field
  65.                             '  Just Clear The Line
  66.                             ArrBitGameField(Index) = BitEmpty
  67.                             Dim X As Integer
  68.                             For X = 0 To Width - 1
  69.                                 ArrGameField(X, Index) = Nothing
  70.                             Next X
  71.                         End If
  72.                     Next Index
  73.                 Else
  74.                     Y -= 1
  75.                 End If
  76.             End While
  77.             Return CheckLines_result
  78.         End Function 'CheckLines
  79.         Public Shared Sub StopSquare(ByVal Square As Square, ByVal X As Integer, ByVal Y As Integer)
  80.             ArrBitGameField(Y) = ArrBitGameField(Y) Or (1 << X)
  81.             ArrGameField(X, Y) = Square
  82.         End Sub 'StopSquare
  83.         Public Shared Sub Redraw()
  84.             Dim Y As Integer
  85.             For Y = Height - 1 To 0 Step -1
  86.                 If ArrBitGameField(Y) <> BitEmpty Then
  87.                     Dim X As Integer
  88.                     For X = Width - 1 To 0 Step -1
  89.                         If Not (ArrGameField(X, Y) Is Nothing) Then
  90.                             ArrGameField(X, Y).Show(WinHandle)
  91.                         End If
  92.                     Next X
  93.                 End If
  94.             Next Y ' Clean The Game Field
  95.         End Sub 'Redraw
  96.         Public Shared Sub Reset()
  97.             Dim I As Integer
  98.             For I = Height To 0 Step -1
  99.                 '  Clear The Lines
  100.                 ArrBitGameField(I) = BitEmpty
  101.                 Dim X As Integer
  102.                 For X = 0 To Width - 1
  103.                     ArrGameField(X, I) = Nothing
  104.                 Next X
  105.             Next I
  106.         End Sub 'Reset
  107.     End Class 'GameField
  108. End Namespace 'Nettrix