3×3の9マスのセルで、○×ゲームをする場合の、データ格納&勝ち負け判定を行う
クラス Cell9 を作ってみたぞ。
-----------------------
その1
Public Class Cell9
Dim mCell(3, 3) As String
Public Sub cell9()
Call Clear()
End Sub
Public Sub Clear()
Dim i As Integer
Dim j As Integer
For i = 1 To 3 Step 1
For j = 1 To 3 Step 1
mCell(i, j) = ""
Next j
Next i
End Sub
Public Sub Set_Circle(ByVal intX As Integer, ByVal intY As Integer)
mCell(intX, intY) = "○"
End Sub
Public Sub Set_Cross(ByVal intX As Integer, ByVal intY As Integer)
mCell(intX, intY) = "×"
End Sub
---------------------------
その2
Public Function Get_Symbol(ByVal intX As Integer, ByVal intY As Integer)
Get_Symbol = mCell(intX, intY)
End Function
Public Function Judge()
Judge = 0
Dim i As Integer
Dim j As Integer
Dim Ycnt As Integer
Dim Ccnt As Integer
' あいこ状況のチェック
Dim Emp As Integer
Emp = 0
For i = 1 To 3 Step 1
For j = 1 To 3 Step 1
If mCell(i, j) <> "" Then
Emp = Emp + 1
End If
Next j
Next i
If Emp = 9 Then
Judge = 3
End If
---------------------------
その3
' 勝ち負けのチェック
' 縦列が一致しているか
For i = 1 To 3 Step 1
Ycnt = 0
Ccnt = 0
For j = 1 To 3 Step 1
If mCell(i, j) = "○" Then
Ycnt = Ycnt + 1
End If
If mCell(i, j) = "×" Then
Ccnt = Ccnt + 1
End If
Next j
If Ycnt = 3 Then
Judge = 1
ElseIf Ccnt = 3 Then
Judge = 2
End If
Next i
---------------------------
その4
' 横列が一致しているか
For j = 1 To 3 Step 1
Ycnt = 0
Ccnt = 0
For i = 1 To 3 Step 1
If mCell(i, j) = "○" Then
Ycnt = Ycnt + 1
End If
If mCell(i, j) = "×" Then
Ccnt = Ccnt + 1
End If
Next i
If Ycnt = 3 Then
Judge = 1
ElseIf Ccnt = 3 Then
Judge = 2
End If
Next j
End Function
End Class
Cell9 は、以上だ。
勝ち負けの判定は、以下のような感じで書くと良いと思う。
Select Case mCell.Judge()
Case 0
Call Com_Play()
Select Case mCell.Judge()
Case 1
MessageBox.Show("あんたの勝ち")
Case 2
MessageBox.Show("comの勝ち")
Case 3
MessageBox.Show("あいこです")
End Select
Case 1
MessageBox.Show("あんたの勝ち")
Case 2
MessageBox.Show("comの勝ち")
Case 3
MessageBox.Show("あいこです")
End Select
----
このコードは、
Private mCell As New Cell9
がメンバにあるものとする。
Com_Play()の記述例も紹介しておく
Private Sub Com_Play()
' Random クラスの新しいインスタンスを生成する
Dim cRandom As New System.Random()
Dim com_Result1 As Integer
Dim com_Result2 As Integer
Dim flg As Integer
flg = 0
Do Until flg = 1
' 1 以上 3 未満の乱数を取得する
com_Result1 = cRandom.Next(1, 4)
com_Result2 = cRandom.Next(1, 4)
If mCell.Get_Symbol(com_Result1, com_Result2) = "" Then
mCell.Set_Cross(com_Result1, com_Result2)
Set_Cross(com_Result1, com_Result2)
flg = 1
End If
Loop
End Sub
後は、自分なりにフォームを作って(テキストボックス9つ、もしくは
グリッドを配置するなど)クリックイベントで○が入力されるように
すると良いだろう。
変数名でiやjを使っているとか、変数の使い回しをしているとか、
ソースコードが汚い部分があるなどしているが、あとは、
>>1自身が、
自分のやりたい方向に拡張していったらいいと思う。
例1:comの入力の方法は、純粋なランダムじゃないようにする。
例2:ルールは、横列が3そろった時のみあがりとし、縦列は関係ないものに変更する。
例3:斜め3つがそろった時もあがるように拡張する。
書き忘れていたが、
>>56のソースは、人間プレイヤーが先攻で○入力をした後の
判定処理のものだ。
人間プレイヤーが入力した後、勝ち負け判定が無い場合は、自動でcomの入力に移り、
その内容の結果判断までを自動で行う為、似たようなコードが2回入っているわけだ。
(mCell.Judge() が入れ子になっている)