VB.NETで数独を作成させてもらっています。
現在の悩みは下記のとおりです。
・数独でフォーカスのあるセルが所属する3×3のグループに着色
・そのメソッドを利用して入力値の被りがないかをチェックしたい
作成している数独の画像を添付します。
現在は{0,0}の座標にフォーカスがあるので、緑で塗られている範囲のグループを取得する必要があります。
下記のコードを先日教えていただきました。こちらを用いて試したのですが、うまく動作させることができておりません。
vb
1'(4,4)が属する3x3のマスの全座標を取得 2 '取得できるデータ:Arr = {[3,3],[4,3],[5,3],[3,4],[4,4],[5,4],[3,5],[4,5],[5,5]} 3 Dim Arr As Integer(,) = SameGroup(4, 4) 4 5 '入力座標が属する3x3のマスを取得 @変更 6 Public Function SameGroup(ByVal x As Integer, ByVal y As Integer) As Integer(,) 7 Dim AreaX As Integer '3x3を特定する 8 Dim AreaY As Integer '3x3を特定する 9 10 Dim Arr(8, 1) As Integer '結果を格納(例:{[3,3][3,4][5,3]...}) 11 12 AreaX = x / 3 'x方向を3分割した時の位置(0~2) 13 AreaY = y / 3 'y方向を3分割した時の位置(0~2) 14 15 Dim count As Integer = 0 16 For xx = 0 To 2 Step 1 17 For yy = 0 To 2 Step 1 18 Arr(count, 0) = AreaX * 3 + xx 19 Arr(count, 1) = AreaY * 3 + yy 20 count += 1 21 Next 22 Next 23 24 Return Arr 25 End Function 26
また参考までに現在自分が作成しているコードを下記に添付させていただきます。
vb
1Public Class Cell 2 Public Status As CellStatus 3 Public S As Source 4 Public Position As Point '論理位置 5 Public Rectangle As Rectangle '物理位置 6 Public Focused As Boolean 7 8 9 '■コンストラクタ 10 Public Sub New(ByVal S As Source, ByVal Position As Point) 11 12 Me.S = S 13 Me.Position = Position 14 15 '物理位置を求める。 16 Dim Rect As New Rectangle 17 18 '論理位置から物理位置を求めます。 19 Rect.X = Position.X * Source.CellSize 20 Rect.Y = Position.Y * Source.CellSize 21 Rect.Width = Source.CellSize 22 Rect.Height = Source.CellSize 23 24 Me.Rectangle = Rect 25 End Sub 26 27 '■Focus 28 Public Sub Focus() 29 30 Dim X As Integer 31 Dim Y As Integer 32 33 '同じグリッドに属する自分以外のセルを非アクティブにする。 34 For X = 0 To source.XCount - 1 35 For Y = 0 To source.YCount - 1 36 S.Cells(X, Y).Focused = False 37 Next 38 Next 39 40 '自分自身をアクティブにする。 41 Me.Focused = True 42 43 End Sub 44 45 Public Sub Draw(ByVal g As Graphics) 46 Dim oPen As New Pen(Color.Orange, 3) 47 Dim rPen As New Pen(Color.Red, 2) 48 Dim blue = New SolidBrush(Color.AntiqueWhite) 49 Dim pink = New SolidBrush(Color.Pink) 50 Dim CellRect As Rectangle 51 52 'オレンジ枠に余裕を持たせる 53 CellRect = Me.Rectangle 54 CellRect.Inflate(-2, -2) 55 Dim fnt As New Font("MS UI Gothic", 40) 56 Dim CellRectNotFocus As Rectangle ' フォーカス外のマス 57 58 59 'フォーカスのある枠をオレンジで囲む 60 If Me.Focused Then 61 g.DrawRectangle(oPen, CellRect) 'オレンジ色の枠描画 62 If S.Cells(Position.X, Position.Y).Status <> Nothing Then 63 For X = 0 To Source.XCount - 1 64 For Y = 0 To Source.YCount - 1 65 CellRectNotFocus = S.Cells(X, Y).Rectangle 66 CellRectNotFocus.Inflate(-3, -3) 67 68 If Position.X = X And Position.Y = Y Then 'フォーカスセルの場合(条件追加) 69 g.FillRectangle(pink, CellRectNotFocus) 'マスをピンクで塗る 70 ElseIf Position.X = X Then 71 g.FillRectangle(blue, CellRectNotFocus) 72 Call InputNumber(g, X, Y) '数字入力 73 ElseIf Position.Y = Y Then 74 g.FillRectangle(blue, CellRectNotFocus) 75 Call InputNumber(g, X, Y) '数字入力 76 End If 77 If S.Cells(Position.X, Position.Y).Status = S.Cells(X, Y).Status Then 78 g.DrawRectangle(rPen, CellRectNotFocus) '赤色の枠描画 79 End If 80 Next 81 Next 82 End If 83 End If 84 85 'CellStatusによって表示を変更 86 Select Case Me.Status 87 ____________中略___________ 88 89 'cell(X,Y)のマスに数字を描画する 90 Public Sub InputNumber(ByVal g As Graphics, ByVal X As Integer, ByVal Y As Integer) 91 Dim fnt As New Font("MS UI Gothic", 40) 92 93 Dim CellX As Integer = S.Cells(X, Y).Rectangle.X 94 Dim CellY As Integer = S.Cells(X, Y).Rectangle.Y 95 'CellStatusによって表示を変更 96 Select Case S.Cells(X, Y).Status 97 98 __________中略____________ 99 100 End Select 101 End Sub 102End Class
vb
1Public Class Source 2 3 Public Const CellSize As Integer = 50 'セルのサイズ 4 Public Const XCount As Integer = 9 '盤の横方向のセル数 5 Public Const YCount As Integer = 9 '盤の縦方向のセル数 6 Dim aCell(XCount - 1, YCount - 1) As Cell '全セルを表す配列 7 8 Public Sub New() 9 10 Dim X As Integer 11 Dim Y As Integer 12 13 For X = 0 To XCount - 1 14 For Y = 0 To YCount - 1 15 aCell(X, Y) = New Cell(Me, New Point(X, Y)) 16 Next 17 Next 18 19 End Sub 20 21 Public Sub Draw(ByVal g As Graphics) 22 23 Dim X As Integer 24 Dim Y As Integer 25 Dim aPen As New Pen(Color.Gray, 2) 26 Dim bPen As New Pen(Color.Black, 3) 27 28 '四角形 29 g.FillRectangle(Brushes.White, 0, 0, XCount * CellSize, YCount * CellSize) 30 31 '縦線 32 For X = 0 To XCount 33 If X Mod 3 = 0 Then 34 g.DrawLine(bPen, X * CellSize, 0, X * CellSize, YCount * CellSize) 35 Else 36 g.DrawLine(aPen, X * CellSize, 0, X * CellSize, YCount * CellSize) 37 End If 38 39 Next 40 41 '横線 42 For Y = 0 To YCount 43 If Y Mod 3 = 0 Then 44 g.DrawLine(bPen, 0, Y * CellSize, XCount * CellSize, Y * CellSize) 45 Else 46 g.DrawLine(aPen, 0, Y * CellSize, XCount * CellSize, Y * CellSize) 47 End If 48 49 Next 50 51 For Y = 0 To YCount - 1 52 For X = -0 To XCount - 1 53 Cells(X, Y).Draw(g) 54 Next 55 Next 56 End Sub 57 58 Public Property Cells(ByVal X As Integer, ByVal Y As Integer) As Cell 59 Get 60 Return aCell(X, Y) 61 End Get 62 Set(ByVal value As Cell) 63 aCell(X, Y) = value 64 End Set 65 End Property 66 67 Public Function CellFromPoint(ByVal X As Integer, ByVal Y As Integer) As Cell 68 69 Dim ThisCell As Cell 70 71 If X < 0 OrElse X >= XCount * CellSize Then 72 Return Nothing 73 End If 74 75 If Y < 0 OrElse Y >= YCount * CellSize Then 76 Return Nothing 77 End If 78 79 ThisCell = Cells(X \ CellSize, Y \ CellSize) 80 81 Return ThisCell 82 83 End Function 84End Class
回答3件
あなたの回答
tips
プレビュー