|
■No92701 (furu さん) に返信
Option Explicit On '型宣言を強制する。
Option Strict On '暗黙的な型変換を禁止する。
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
勝敗判定を訂正しました。アドバイスをお願いします。
|