私は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で一掃されます