0

私はVBコンソールを使用してコンウェイのライフゲームのシミュレーションを構築しようとしています(私はそのように奇妙です)働く。プログラムは、最も内側から最も外側まで、一時停止、終了、クリア、および終了という個別のブール条件を持つ4つのループ内で実行されます。すべてを制御するのは、Keypressesを読み取り、すべてのブール変数を変更するBackgroundWorkerです。BackgroundWorkerとConsole.Readkeyを使用している場合にのみ、Keypressの読み取りに2回かかる場合にのみ発生します。私は他のプロジェクトでもそれを持っていました、そして私は理由を理解することができません。プログラムを一時停止すると、明らかに両方のスレッドでキーが押されるのを待っていますが、デバッガーがキーを押すように要求するのは、最初にプログラムを押したときだけです。大きな問題ではありませんが、それでも、これをなくすために何かできることがあるかどうか知りたいです。

これは、宣言を除いたメインサブです。

Do Until Quit = True 'This block repeats until Quit is true
        Start = False : Finish = False : Pause = False : Quit = False : Iterate = False : Clear = False
        Generation = 0 'This resets the Generation counter to 0
        ClearArray(Board) 'This resets a 2D boolean array to false.
        UpdateTitle(Generation) 'This updates the Console.Title to show the current generation.

        DrawBorder(Board, Offset, ConsoleColor.Cyan, BorderBlock) 'This draws an ASCII border around the grid.
        DrawBoard(Board, Offset) 'This draws the physical grid itself.

        WriteMessage(1, BoardDimensions(1) - 1, Offset) 'This writes a line below the grid prompting user input.
        ObtainInitialSetup(Board, Offset) 'This sub links to a bunch of other subs allowing the user to input an initial pattern.
        TransferArrayContents(Board, BoardMemory) 'This stores the contents of the pattern the user has entered into a memory array.
        Clear = False

        Do Until Clear = True 'This block repeats until Clear is true
            TransferArrayContents(BoardMemory, Board) 'This recalls the saved pattern from memory. If a user presses "Stop" then all generation
            'will cease and this is where the board is reset.
            DrawBoard(Board, Offset) 'The board is redrawn.
            WriteMessage(2, BoardDimensions(1) - 1, Offset)

            Do 'This block waits for the user to confirm before starting.
                Keypress = Console.ReadKey(True)
                If Keypress.Key = StartKey Then Start = True : Finish = False : Clear = False : Quit = False : Pause = False
                If Keypress.Key = QuitKey Then Finish = True : Clear = True : Quit = True
                If Keypress.Key = ClearKey Then Finish = True : Clear = True
                'The program does not start until a user presses Start, Clear or Quit.
            Loop Until Start = True Or Finish = True Or Clear = True Or Quit = True

            If Quit = False Then WriteMessage(3, BoardDimensions(1) - 1, Offset)
            If Finish = False Then If BK.IsBusy = False Then BK.RunWorkerAsync()
            'The backgroundworker is called so long as it isn't already running.

            Do Until Finish = True 'This block repeats until Stop is true
                Iterate = False 'The Iterate condition allows the Loop to go through once.
                UpdateTitle(Generation) 'This updates the title.
                Generate(Board, CoordList, Generation, Survivals, Births) 'This sub does the calculation across the whole Board and changes
                'the values in the board for the next generation.
                DrawBoard(Board, Offset) 'This draws the new board.
                CheckPause(Offset, BoardDimensions(1) - 1) 'This sub holds the loop if Pause is true by inserting a new Do Loop.
            Loop
        Loop
    Loop

    BK.CancelAsync()

そしてこれはBackgroundWorkerサブです:

Sub ReadBackgroundKey() Handles BK.DoWork
    Dim Keypress As ConsoleKeyInfo
    Do
        Keypress = Console.ReadKey(True)
        If Keypress.Key = StopKey Then 'Finish
            Quit = False
            Clear = False
            Finish = True
        ElseIf Keypress.Key = PauseKey Then 'Pause the generation.
            Quit = False
            Clear = False
            Finish = False
            Pause = Not Pause
        ElseIf Keypress.Key = QuitKey Then 'Quit the game.
            Quit = True
            Clear = True
            Finish = True
            Pause = False
        ElseIf Keypress.Key = StepKey Then 'Step a generation.
            Quit = False
            Clear = False
            Finish = False
            Pause = True
            Iterate = True
        ElseIf Keypress.Key = ClearKey Then 'Clear the board.
            Quit = False
            Clear = True
            Finish = True
            Pause = False
        End If
    Loop Until Quit = True Or Clear = True
End Sub

また、立派なプログラマーが絶対にやるべきではない恐ろしいことに気付いた場合は、すべての批判を歓迎します。私はVBを半年しかやっていないので、まだあまり上手ではありません。

私はすべての考えとフィードバックに感謝します:)。

編集:また、投稿の最初に「こんにちは」や楽しい挨拶を入れることはできません、それはoOで一掃されます

4

1 に答える 1

0

最初のループでは、「開始= False:終了= False:一時停止= False:終了= False:反復= False:クリア= False」であるように見えます。したがって、その周りのすべてのループがリセットされます。

それでうまくいくかどうかはよくわかりませんが、正直なところ、私は経験が浅く、めちゃくちゃ眠気があり、カフェインを渇望しています。

編集:それをいじりました、私は同じ問題を抱えています、これもループの中にあります、それをもっと調べます

そうです、暇なときにいじり回して、あまり便利ではない解決策を思いついたので、少しテストしてから投稿します。運が悪いと訴えたいだけです。

うん、ただ運。コンソールアプリケーションの経験が浅いため、確かに言うほどのコマンドはよくわかりませんが、フォーカスの問題になる可能性があります。

于 2013-11-28T08:08:11.947 に答える