すみませんゆとりが質問です

このエントリーをはてなブックマークに追加
52デフォルトの名無しさん
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
53デフォルトの名無しさん:2009/11/23(月) 14:47:58
---------------------------
その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
54デフォルトの名無しさん:2009/11/23(月) 14:50:11
---------------------------
その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
55デフォルトの名無しさん:2009/11/23(月) 14:51:02
---------------------------
その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
56デフォルトの名無しさん:2009/11/23(月) 14:55:41
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
がメンバにあるものとする。
57デフォルトの名無しさん:2009/11/23(月) 14:58:00
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
58デフォルトの名無しさん:2009/11/23(月) 15:03:42
後は、自分なりにフォームを作って(テキストボックス9つ、もしくは
グリッドを配置するなど)クリックイベントで○が入力されるように
すると良いだろう。

変数名でiやjを使っているとか、変数の使い回しをしているとか、
ソースコードが汚い部分があるなどしているが、あとは、>>1自身が、
自分のやりたい方向に拡張していったらいいと思う。

例1:comの入力の方法は、純粋なランダムじゃないようにする。
例2:ルールは、横列が3そろった時のみあがりとし、縦列は関係ないものに変更する。
例3:斜め3つがそろった時もあがるように拡張する。
59デフォルトの名無しさん:2009/11/23(月) 15:09:46
書き忘れていたが、>>56のソースは、人間プレイヤーが先攻で○入力をした後の
判定処理のものだ。

人間プレイヤーが入力した後、勝ち負け判定が無い場合は、自動でcomの入力に移り、
その内容の結果判断までを自動で行う為、似たようなコードが2回入っているわけだ。
(mCell.Judge() が入れ子になっている)