16,717
社区成员
发帖
与我相关
我的任务
分享Public Function lsKisuu(ByVal iCount As Integer)
Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer '動的二次元配列
giX = (grdTxt.Rows.Count + 1) / 2 - 1 '第一個の数字は第一行の中間にになります
giY = 0
For i As Integer = 1 To iCount * iCount
magic(giY, giX) = i
If i Mod iCount = 0 Then 'すぐ1個数がiCountの倍数な時、まっすぐな下に置きます
giY = giY + 1
ElseIf giY = 0 Then '上の境を超える時
giX = giX + 1
giY = iCount - 1
ElseIf giX = iCount - 1 Then '右側の境を超える時
giX = 0
giY = giY - 1
Else '正常な情況の下
giX = giX + 1
giY = giY - 1
End If
Next
For i As Integer = 0 To iCount - 1 '循環出力
For j As Integer = 0 To iCount - 1
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
Next
Next
Return 0
End Function
Public Class Form1
Dim giX As Integer = 0 '次数字の保存位置
Dim giY As Integer = 0 '次数字の保存位置
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
''-------------------------------------------------
'' [処理名]:Form1_Load
'' [機 能]:初期化
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
grdTxt.Rows.Count = 0
grdTxt.Cols.Count = 0
grdTxt.AllowEditing = False
End Sub
''-------------------------------------------------
'' [処理名]:btnClose_Click
'' [機 能]:終了
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
Me.Close()
End Sub
''-------------------------------------------------
'' [処理名]:txtTi1_TextChanged
'' [機 能]:txtTi2はtxtTi1の値を得ます
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
Private Sub txtTi1_TextChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtTi1.TextChanged
txtTi1.Focus() '焦点を得ます
txtTi2.Text = txtTi1.Text
End Sub
Private Sub btnBegin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBegin.Click
Try
If CInt(txtTi1.Text) > 2 Then
grdTxt.Rows.Count = Int(txtTi1.Text)
grdTxt.Cols.Count = Int(txtTi1.Text)
If Int(txtTi1.Text) Mod 2 = 1 Then '奇方陣(3×3,5×5,7×7・・・)
lsKisuu(Int(txtTi1.Text))
ElseIf Int(txtTi1.Text) Mod 4 = 0 Then '偶方陣 4の倍数型(4×4,8×8,12×12・・・)
lsGuusuu(Int(txtTi1.Text))
ElseIf Int(txtTi1.Text) Mod 4 = 2 Then '偶方陣 4の倍数+2型(6×6,10×10,14×14・・・)
lsGuusuu4plus2(Int(txtTi1.Text))
End If
Else
MessageBox.Show("指定の値では、魔方陣を作成できません", "魔方陣")
End If
Catch ex As Exception
MessageBox.Show("数字のみ指定できます", "魔方陣")
End Try
End Sub
Public Function lsKisuu(ByVal iCount As Integer)
Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer '動的二次元配列
giX = (grdTxt.Rows.Count + 1) / 2 - 1 '第一個の数字は第一行の中間にになります
giY = 0
For i As Integer = 1 To iCount * iCount
magic(giY, giX) = i
If i Mod iCount = 0 Then 'すぐ1個数がiCountの倍数な時、まっすぐな下に置きます
giY = giY + 1
ElseIf giY = 0 Then '上の境を超える時
giX = giX + 1
giY = iCount - 1
ElseIf giX = iCount - 1 Then '右側の境を超える時
giX = 0
giY = giY - 1
Else '正常な情況の下
giX = giX + 1
giY = giY - 1
End If
Next
For i As Integer = 0 To iCount - 1 '循環出力
For j As Integer = 0 To iCount - 1
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
Next
Next
Return 0
End Function
Public Function lsGuusuu(ByVal iCount As Integer) As Integer
Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer '動的二次元配列
Dim currnum As Integer '偶方陣を作って数の変数
If iCount Mod 4 = 0 Then
For i As Integer = 0 To iCount / 2 - 1 '記号をします
For j As Integer = 0 To iCount / 2 - 1
If (i + j) Mod 2 = 0 Then
magic(i, j) = -1
magic(i, iCount - j - 1) = -1
magic(iCount - i - 1, j) = -1
magic(iCount - i - 1, iCount - j - 1) = -1
End If
Next
Next
For i As Integer = 0 To iCount - 1 '数字を出力します
For j As Integer = 0 To iCount - 1
currnum = i * iCount + j
If magic(i, j) = -1 Then
magic(i, j) = iCount * iCount - currnum
Else
magic(i, j) = currnum + 1
End If
Next
Next
For i As Integer = 0 To iCount - 1 '循環出力
For j As Integer = 0 To iCount - 1
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
Next
Next
End If
Return 0
End Function
Public Function lsGuusuu4plus2(ByVal iCount As Integer) As Integer
Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer '動的二次元配列
Dim sizem As Integer = (iCount / 2 - 1) / 2
Dim sizeh As Integer = iCount / 2
Dim sizesq As Integer = (iCount / 2) * (iCount / 2)
Dim iSt_x As Integer = 0
Dim iSt_y As Integer = 0
Dim iSt_i As Integer
Dim temp As Integer
If iCount Mod 4 <> 0 Then
For iSt_i = 0 To 4 '魔方陣を4つに分けます
Select Case iSt_i
Case 0 '左上 A
iSt_x = 0
iSt_y = 0
Case 1 '右下 B
iSt_x = sizeh
iSt_y = sizeh
Case 2 '右上 C
iSt_x = sizeh
iSt_y = 0
Case 3 '左下 D
iSt_x = 0
iSt_y = sizeh
End Select
giX = (iCount / 2) / 2 '第一個の数字は第一行の中間にになります
giY = 0
For i As Integer = 1 To sizesq
magic(giY + iSt_y, giX + iSt_x) = i + sizesq * iSt_i
If i Mod (iCount / 2) = 0 Then 'すぐ1個数がiCountの倍数な時、まっすぐな下に置きます
giY = giY + 1
ElseIf giY = 0 Then '上の境を超える時
giX = giX + 1
giY = iCount / 2 - 1
ElseIf giX = iCount / 2 - 1 Then '右側の境を超える時
giX = 0
giY = giY - 1
Else '正常な情況の下
giX = giX + 1
giY = giY - 1
End If
Next 'end of for (count)
Next 'end of for (iSt_i)
'数字を出力します
For j As Integer = 1 To sizem
temp = magic((iCount / 2) / 2, j)
magic((iCount / 2) / 2, j) = magic((sizeh + 1) / 2 + sizeh - 1, j)
magic((sizeh + 1) / 2 + sizeh - 1, j) = temp
Next
For i As Integer = 0 To sizeh
If i = (sizeh + 1) / 2 - 1 Then
Exit For
End If
For j As Integer = 0 To sizem
temp = magic(i, j)
magic(i, j) = magic(sizeh + i, j)
magic(sizeh + i, j) = temp
Next
Next
For i As Integer = 0 To sizeh
For j As Integer = iCount - sizem + 1 To iCount - 1 Step -1
temp = magic(i, j)
magic(i, j) = magic(sizeh + i, j)
magic(sizeh + i, j) = temp
Next
Next
For i As Integer = 0 To iCount - 1 '循環出力
For j As Integer = 0 To iCount - 1
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
Next
Next
End If
End Function
End Class
Public Class Form1
Private giRecord_Magic(,) As Integer '配列
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
grdTxt.Rows.Count = 0
grdTxt.Cols.Count = 0
grdTxt.AllowEditing = False
End Sub
''-------------------------------------------------
'' [処理名]:btnClose_Click
'' [機 能]:終了
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
Me.Close()
End Sub
''-------------------------------------------------
'' [処理名]:txtTi1_TextChanged
'' [機 能]:txtTi2はtxtTi1の値を得ます
'' [備 考]:なし
'' [作成者]:
'' [作成日]:08.09.03
''-------------------------------------------------
Private Sub txtTi1_TextChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtTi1.TextChanged
txtTi1.Focus()
txtTi2.Text = txtTi1.Text
End Sub
Private Sub btnBegin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBegin.Click
Try
If CInt(txtTi1.Text) > 2 Then
grdTxt.Rows.Count = Int(txtTi1.Text)
grdTxt.Cols.Count = Int(txtTi1.Text)
If Int(txtTi1.Text) Mod 2 = 1 Then
lsKisuu(Int(txtTi1.Text))
Else
MessageBox.Show("ff")
End If
Else
MessageBox.Show("指定の値では、魔方陣を作成できません", "魔方陣")
End If
Catch ex As Exception
MessageBox.Show("数字のみ指定できます", "魔方陣")
End Try
End Sub
Public Function lsKisuu(ByVal iCount As Integer)
Dim magic(grdTxt.Rows.Count, grdTxt.Cols.Count) As Integer
Dim i As Integer = -1
Dim j As Integer = (grdTxt.Rows.Count + 1) / 2 - 1
Dim count = grdTxt.Rows.Count
Dim a As String
For count = 1 To iCount * iCount
If grdTxt.Rows.Count Mod 2 = 1 Then
i += i
Else
i -= i
j += j
End If
If i < 0 Then
i = grdTxt.Rows.Count - 1
End If
If j >= grdTxt.Rows.Count Then
j = 0
End If
magic = count
Next
For i = 0 To iCount
For j = 0 To iCount
grdTxt.Item(i, j) = Convert.ToString(magic(i, j))
a = Convert.ToString(magic(i, j))
Next
Next
Return 0
End Function
End Class