QA@IT

tic tac toe

449 PV

Module Module1

''' <summary>
''' プレイヤーの氏名入力
''' </summary>
''' <param name="turn">手番</param>
''' <param name="symbol">記号</param>
''' <returns>プレイヤーの氏名</returns>
''' <remarks></remarks>
Private Function InputPlayerName(turn As String, symbol As String) As String
    Console.WriteLine("{0}は「{1}」です。", turn, symbol)
    Console.Write("あなたの名前を入力して下さい")
    Console.WriteLine()
    Console.WriteLine()
    Dim name = Console.ReadLine() '1行分の文字を読み取る
    Return name
End Function

Sub Main()
    Do
        Dim table(2, 2) As String
        table(0, 0) = " "
        table(0, 1) = " "
        table(0, 2) = " "
        table(1, 0) = " "
        table(1, 1) = " "
        table(1, 2) = " "
        table(2, 0) = " "
        table(2, 1) = " "
        table(2, 2) = " "

        Dim P1name As String '先攻 プレイヤー1の名前 
        Dim P2name As String '後攻 プレイヤー2の名前
        Dim WinPlayer As String = String.Empty
        Dim LoopCount1 As Integer = 1
        Dim Gameover As Integer = 0
        Dim dNow As DateTime = System.DateTime.Now
        Console.Clear()
        'タイトル表示
        Console.ForegroundColor = ConsoleColor.Green
        Console.WriteLine(dNow.ToShortDateString())
        Console.WriteLine(dNow.ToString("HH時mm分ss秒"))
        Console.WriteLine()
        Console.WriteLine("(--Tic_Tac_Toe--)")
        Console.WriteLine()
        P1name = InputPlayerName("先行", "O")
        P2name = InputPlayerName("後攻", "X")

        Console.Clear() '↑のコンソールウィンドウをクリアして↓を出力
        Console.WriteLine()
        Console.WriteLine("Rを押すとゲームを終了できます。")
        Console.WriteLine("対応するキーを入力すると先攻は「O」,後攻は「X」が表示されます。")
        Console.WriteLine()
        Console.WriteLine(" #####")
        Console.WriteLine("# 123 #")
        Console.WriteLine("# 456 #")
        Console.WriteLine("# 789 #")
        Console.WriteLine(" #####")
        Console.WriteLine()
        Console.WriteLine("1から9の数字を入力して下さい。")

        Do 'Do Loop 繰り返す条件の指定  先攻がO 後攻がX

            '現在のプレイヤーの記号を取得する。
            Dim Mark As String = SenkouKOukouDisp(LoopCount1, P1name, P2name, WinPlayer)
            If (LoopCount1 Mod 2) <> 0 Then
                Mark = "O"
                WinPlayer = P1name
            Else
                Mark = "X"
                WinPlayer = P2name
            End If

            '入力されたキーの出力
            Dim Cursor As Integer = 0
            Dim Key As ConsoleKeyInfo
            Dim Truefalse1 As Boolean = False
            Key = Console.ReadKey(True)
            Truefalse1 = True
            Select Case Key.Key
                Case ConsoleKey.D1 To ConsoleKey.D9
                    Cursor = Convert.ToInt32(Key.Key) - 48
                Case ConsoleKey.R
                    Gameover = 3
                Case Else
                    Truefalse1 = False
                    Console.Write("入力されたキーは使えません")
            End Select

            If Cursor >= 1 AndAlso Cursor <= 9 Then
                Dim x As Integer = (Cursor - 1) Mod 3
                Dim y As Integer = (Cursor - 1) \ 3

                If table(y, x) = " " Then
                    table(y, x) = Mark
                    LoopCount1 += 1
                End If
            End If

            '勝敗判定
            ' 縦・横・斜めの探索ライン(全8通り)
            Dim checkline(,) As Integer = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}, {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 4, 8}, {2, 4, 6}}
            '全パターン 8 回探索する
            For n = 0 To 7
                Dim v() As Integer = {checkline(n, 0), checkline(n, 1), checkline(n, 2)}
                Dim line = String.Join("", v.Select(Function(p) table(p Mod 3, p \ 3)))

                ' 3 つ揃ったラインがあればループ終了
                If line = "OOO" Then
                    Gameover = 1
                    WinPlayer = P1name
                    Exit For
                ElseIf line = "XXX" Then
                    Gameover = 2
                    WinPlayer = P2name
                    Exit For
                    ' 最後まで決着がつかなかった場合
                ElseIf LoopCount1 > 9 Then
                    Gameover = 4
                    WinPlayer = Nothing
                End If
            Next

            Console.Clear()
            Dim Row0 As String = (table(0, 0) & table(0, 1) & table(0, 2))
            Dim Row1 As String = (table(1, 0) & table(1, 1) & table(1, 2))
            Dim Row2 As String = (table(2, 0) & table(2, 1) & table(2, 2))
            Console.WriteLine("ゲーム中Rキー入力でゲームを終了できます。")
            Console.WriteLine("PressedKey:{0}", Key.Key) '入力したキーの表示
            Console.WriteLine()
            Console.WriteLine(" {0}’s BattleTurn", WinPlayer) '順番プレイヤーの名前の表示
            Console.WriteLine()
            Console.WriteLine("「見本」")
            Console.WriteLine(" #####")
            Console.WriteLine("# 123 #")
            Console.WriteLine("# 456 #")
            Console.WriteLine("# 789 #")
            Console.WriteLine(" #####")
            Console.WriteLine()
            Console.WriteLine()
            Console.WriteLine(" #####")
            Console.WriteLine("# {0}  ", Row0 & " # ")
            Console.WriteLine("# {0}  ", Row1 & " # ")
            Console.WriteLine("# {0}  ", Row2 & " # ")
            Console.WriteLine(" #####")
            'ループを抜け出した先の分岐
        Loop Until Gameover = 1 Or Gameover = 2 Or Gameover = 3 Or Gameover = 4

        '結果出力 
        If Gameover = 1 Then
            Console.WriteLine()
            Console.WriteLine(" 試合終了 Player1 「{0}」の勝利!!!!!", WinPlayer)
            Console.WriteLine(" Rキー入力で名前入力画面に戻ります。R以外のキー入力をするとゲームを終了します。")
        ElseIf Gameover = 2 Then
            Console.WriteLine()
            Console.WriteLine("試合終了 Player2 「{0}」の勝利!!!!!", WinPlayer)
            Console.WriteLine("Rを押すと名前入力画面に戻ります。R以外のキー入力をするとゲームを終了します。")
        ElseIf Gameover = 3 Then
            Console.WriteLine()
            Console.WriteLine("  ゲームを終了します。")
            Console.WriteLine("   Rを押すと名前入力画面に戻ります。R以外のキー入力をするとゲームを終了します。")
        ElseIf Gameover = 4 Then
            Console.WriteLine()
            Console.WriteLine(" 引き分け ")
            Console.WriteLine("Rを押すと名前入力画面に戻ります。R以外のキー入力をするとゲームを終了します。")
        End If
    Loop While Console.ReadKey.Key = ConsoleKey.R 'Rキーを押すと名前入力画面(最初に)に戻る
End Sub

Private Function SenkouKOukouDisp(LoopCount1 As Integer, P1name As String, P2name As String, WinPlayer As String) As String

End Function

End Module
ゲームの結果(氏名、勝敗、盤面等)をファイルに出力したいです。様々なサイトの情報を試してみましたが、うまくできません。分かる方教えてください。

ウォッチ

この質問への回答やコメントをメールでお知らせします。