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

📄 lifegeneration.vb

📁 Programming the .NET Compact Framework with vb 源代码
💻 VB
字号:
' -----------------------------------------------------------------------------
' Code from _Programming the .NET Compact Framework with VB_
' and _Programming the .NET Compact Framework with C#_
' (c) Copyright 2002-2004 Paul Yao and David Durant. 
' All rights reserved.
' -----------------------------------------------------------------------------

Imports System
Imports System.Drawing
Imports System.IO
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary

' <summary>
' One Generation.  Consists of a set of Rows.
' </summary>

   Friend Class LifeGeneration

#Region "Properties"
   '	An array of rows.  The heart of the generation.
   Friend Rows(LifeMain.noofCells) As LifeRow

   '	Generation count.
   Friend countGeneration As Integer 'ToDo: Unsigned Integers not supported

   '	Number of live cells in this generation.  
   '		Derived by obtaining the counts from
   '		the rows.  

   Friend ReadOnly Property noofLive() As Integer
      Get
         Dim ctLive As Integer = 0
         Dim j As Integer
         For j = lo To hi
            ctLive += Rows(j).noofLive
         Next j
         Return ctLive
      End Get
   End Property

   '	Some convenience fields.
   Friend hi, lo, middle As Integer

#End Region

#Region "System Methods"
   ' Constructor.
   Friend Sub New()
      '	Set the convenience fields.
      lo = Rows.GetLowerBound(0)
      hi = Rows.GetUpperBound(0)
      middle = lo + (hi - lo) / 2

      '	Create the rows.
      Dim j As Integer
      For j = lo To hi
         Rows(j) = New LifeRow
      Next j
   End Sub
#End Region

#Region "Internal Methods"
   Friend Function CalcNextGen() As LifeGeneration
      '	Each row is used to calculate its next
      '		generation.
      '	The target row, the row above, and the 
      '		row below must be examined to determine 
      '		the target row's next generation.
      '	The outermost border of cells is always
      '		left blank.
      Dim genNext As New LifeGeneration

      genNext.countGeneration = Me.countGeneration + 1

      genNext.Rows(lo) = New LifeRow
      Dim j As Integer
      For j = lo + 1 To hi - 1
         genNext.Rows(j) = Rows(j).CalcNextGen(Rows((j - 1)), Rows((j + 1)))
      Next j
      genNext.Rows(hi) = New LifeRow

      Return genNext
   End Function


   Friend Function CompareTo(ByVal genTarget As LifeGeneration) As Integer
      '	CompareTo tradionally returns three
      '		possible values, 0 (==), -1 (<)
      '		and +1 (>); and we wish to 
      '		maintain that convention.  But,
      '		for a generation, only "==" 
      '		and "!=" is meaningful.  So the 
      '		definition of "<" and ">" is somewhat 
      '		arbitrary here.
      If genTarget Is Nothing Then
         Return 1
      End If
      If Me.noofLive = 0 And genTarget.noofLive = 0 Then
         Return 0
      End If
      If Me.noofLive < genTarget.noofLive Then
         Return -1
      End If
      If Me.noofLive > genTarget.noofLive Then
         Return 1
      End If
      Dim j As Integer
      For j = lo To hi
         If Rows(j).CompareTo(genTarget.Rows(j)) = 0 Then
            GoTo ContinueFor1
         End If
         If Rows(j).CompareTo(genTarget.Rows(j)) < 0 Then
            Return -1
         End If
         If Rows(j).CompareTo(genTarget.Rows(j)) > 0 Then
            Return +1
         End If
ContinueFor1:
      Next j
      Return 0
   End Function


   Friend Sub Clear()
      '	Clear this generation.
      Dim j As Integer
      For j = lo To hi
         Rows(j) = New LifeRow
      Next j
      countGeneration = 0
   End Sub


   Friend Sub CopyTo(ByVal genTarget As LifeGeneration)
      '	Copy the relevant info from gen to gen.
      Dim j As Integer
      For j = lo To hi
         Me.Rows(j).CopyTo(genTarget.Rows(j))
      Next j
      genTarget.countGeneration = Me.countGeneration
   End Sub


   Friend Sub SetPattern(ByVal Pattern As LifeMain.lgpPattern)
      '	Convenience variables.
      Dim displayLo As Integer = middle - (LifeMain.noofDisplay - 1) / 2
      Dim displayHi As Integer = displayLo + (LifeMain.noofDisplay - 1)
      Dim gap As Integer = (middle - displayLo) / 3

      Clear()
      Select Case Pattern
         Case LifeMain.lgpPattern.lgpEmpty
         Case LifeMain.lgpPattern.lgpDiagonal
            Dim j As Integer
            For j = displayLo + 1 To displayHi - 1
               SetRow(j, New Integer() {j})
            Next j
         Case LifeMain.lgpPattern.lgpVertical
            Dim j As Integer
            For j = displayLo + gap To displayHi - gap
               SetRow(j, New Integer() {middle})
            Next j
         Case LifeMain.lgpPattern.lgpFlawedVertical
            Dim j As Integer
            For j = displayLo + gap To displayHi - gap
               SetRow(j, New Integer() {middle})
            Next j
            FlipCell(displayHi - gap, middle + 1)
         Case LifeMain.lgpPattern.lgpFiveCell
            SetRow(middle - 1, New Integer() {middle, middle + 1})
            SetRow(middle, New Integer() {middle - 1, middle})
            SetRow(middle + 1, New Integer() {middle})
         Case LifeMain.lgpPattern.lgpSixCell
            SetRow(middle - 1, New Integer() {middle, middle + 1})
            SetRow(middle, New Integer() {middle - 1, middle})
            SetRow(middle + 1, New Integer() {middle, middle + 1})
         Case LifeMain.lgpPattern.lgpSevenCell
            SetRow(middle - 2, New Integer() {middle})
            SetRow(middle - 1, New Integer() {middle - 2, middle - 1, middle + 1})
            SetRow(middle, New Integer() {middle - 1, middle + 1})
            SetRow(middle + 1, New Integer() {middle})
         Case LifeMain.lgpPattern.lgpEightCell
            SetRow(middle - 2, New Integer() {middle - 1})
            SetRow(middle - 1, New Integer() {middle - 1, middle + 1})
            SetRow(middle, New Integer() {middle - 1, middle, middle + 1})
            SetRow(middle + 1, New Integer() {middle - 1, middle + 1})
         Case LifeMain.lgpPattern.lgpTenCell
            SetRow(194, New Integer() {195, 196})
            SetRow(195, New Integer() {194, 195})
            SetRow(196, New Integer() {195})
            SetRow(315, New Integer() {298})
            SetRow(316, New Integer() {298, 299})
            SetRow(317, New Integer() {297, 298})
         Case LifeMain.lgpPattern.lgpBoard, LifeMain.lgpPattern.lgpSelfFix, LifeMain.lgpPattern.lgpSelfDestruct
            Dim j As Integer
            For j = lo To hi
               If j Mod 3 <> 0 Then
                  Dim k As Integer
                  For k = lo To hi
                     If k Mod 3 <> 0 Then
                        FlipCell(k, j)
                     End If
                  Next k
               End If
            Next j
            If Pattern = LifeMain.lgpPattern.lgpSelfFix Then
               FlipCell(middle, middle)
            End If
            If Pattern = LifeMain.lgpPattern.lgpSelfDestruct Then
               FlipCell(middle - 1, middle)
            End If
         Case LifeMain.lgpPattern.lgpGlider
            SetRow(middle - 1, New Integer() {middle})
            SetRow(middle, New Integer() {middle, middle + 1})
            SetRow(middle + 1, New Integer() {middle - 1, middle + 1})
         Case LifeMain.lgpPattern.lgpGliderMate
            SetRow(middle + 1 - 10, New Integer() {displayHi - (1 + 1), displayHi - (3 + 1)})
            SetRow(middle + 2 - 10, New Integer() {displayLo + (1 + 1), displayLo + (3 + 1), displayHi - (2 + 1), displayHi - (3 + 1)})
            SetRow(middle + 3 - 10, New Integer() {displayLo + (2 + 1), displayLo + (3 + 1), displayHi - (2 + 1)})
            SetRow(middle + 4 - 10, New Integer() {displayLo + (2 + 1)})
            SetRow(middle + 4 + 10, New Integer() {displayHi - 2})
            SetRow(middle + 5 + 10, New Integer() {displayLo + 2, displayHi - 2, displayHi - 3})
            SetRow(middle + 6 + 10, New Integer() {displayLo + 2, displayLo + 3, displayHi - 1, displayHi - 3})
            SetRow(middle + 7 + 10, New Integer() {displayLo + 1, displayLo + 3})
         Case LifeMain.lgpPattern.lgpGliderPump
            SetRow(middle - 5, New Integer() {middle + 6})
            SetRow(middle - 4, New Integer() {middle + 4, middle + 6})
            SetRow(middle - 3, New Integer() {middle - 5, middle + 3, middle + 5})
            SetRow(middle - 2, New Integer() {middle - 6, middle - 5, middle + 2, middle + 5, middle + 17, middle + 18})
            SetRow(middle - 1, New Integer() {middle - 7, middle - 6, middle - 1, middle - 0, middle + 3, middle + 5, middle + 17, middle + 18})
            SetRow(middle, New Integer() {middle - 17, middle - 16, middle - 8, middle - 7, middle - 6, middle - 1, middle - 0, middle + 4, middle + 6})
            SetRow(middle + 1, New Integer() {middle - 17, middle - 16, middle - 7, middle - 6, middle - 1, middle - 0, middle + 6})
            SetRow(middle + 2, New Integer() {middle - 6, middle - 5})
            SetRow(middle + 3, New Integer() {middle - 5})
         Case Else
      End Select
      countGeneration = 0
   End Sub


   Friend Sub SetRow(ByVal ixRow As Integer, ByVal arrayArgs() As Integer)
      '	Have the row do it.
      Rows(ixRow).SetRow(arrayArgs)
   End Sub


   Friend Sub FlipCell(ByVal ixRow As Integer, ByVal ixCell As Integer)
      '	Have the row do it.
      Rows(ixRow).FlipCell(ixCell)
   End Sub
#End Region

End Class

⌨️ 快捷键说明

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