用VB程序制作穿心对调幻方
曹
陵 曹 雷
幻方源出《河图洛书》,是中华民族的优秀文化遗产,传入日本欧美,研究兴盛不衰。幻方内在和谐,结构美妙!小则为数学游戏,大则属组合分析,寓学于乐、拓展思维、开发智力,……。近年在中国幻方协会大旗下,佳作迭出,群星璀璨!幻方知识正以规范化、理论化、系统化向数学殿堂飞速挺进。
进入信息时代,大批量有规律的动作与复杂繁琐的计算,完全可以交给电脑代劳,幻方研究如虎添翼。这里我介绍用
VB6.0程序制作穿心对调幻方,对调为幻方名家高手常用,别具特色,穿心对调如坐帐论兵,是我从西安孙友先生处学得,简单有效,奇妙无穷!程序中使用了一些VB最基本的功能及技巧,解决一般要求的n 阶幻方制作,可为VB初学者与幻方爱好者借鉴与共享,愿你在本文中增长知识、领悟乐趣。简略实用的幻方界面
本工程只用一个窗体。启动
Visual Basic 6.0后,先在窗体Pwny0上画出大小适当平稳的父图片框Picture1,再在Picture1中绘制子图片框Picture2。参阅图-1,在窗体上添加水平滚动条HScroll1和垂直滚动条VScroll1。在窗体的Form_Load事件中写入代码,用两滚动条来控制子图片框Picture2在Picture1中的移动,形成一个可滚动的图形窗口。在滚动窗口右下方画出六个命令按钮Command1至 Command6,其标题(Caption) 依次为开始、检验、清屏、记录、退出及对调。再添上一个单选按钮,通过复制、粘贴形成控件数组Option1(0)与Option1(1),用来区分穿心对调是采用一法或二法。为了便于初学者掌握,我精简了多余的控件及功能。

程序源代码清单
1、窗体Pwny0的程序
Dim Ne(100, 100) As Integer '
自然方阵Dim c(100, 100) As Integer '
幻方数组Private m As Integer, r As Integer '
幻方参数Private ak As Integer, bk As Integer '
方法、起点Private v As Integer, w As Integer, s As Integer
Dim ckr As String, u As Integer, sk As Integer
Dim L(210) As Long '
检验数组Private n As Integer, a As Integer, b As Integer
Private z As Integer, k As Integer, t As Integer
Sub swcg(n) '
通用幻方检验过程Erase L
L(0) = n * (n * n + 1) / 2 '
幻和z = 2 * n + 2: k = 0
For i = 1 To n
For j = 1 To n
L(i) = L(i) + c(i, j)
'
验算幻方C的行和与列和L(n + i) = L(n + i) + c(j, i)
Next j
Next i
For j = 1 To n
L(z - 1) = L(z - 1) + c(j, j)
L(z) = L(z) + c(n + 1 - j, j)
'
验算幻方C的两条对角线Next j
For i = 1 To z '
上述结果与幻方C的幻和比较If L(i) <> L(0) Then k = k + 1
Next i
End Sub
Private Sub Command1_Click() '
开始Erase c, Ne '
初始化数组CK$ = "
要制作多少阶幻方?请输入大于七的自然数:"nv$ = InputBox$(CK$, "
询问后单选")n = Val(nv$)
a = n \ 2: b = a + 1 '
设置重要参数w = n Mod 4 '
分出阶数n 所属类型v = n + 1: m = n \ 4
sk = IIf(n < 31, 5, 6) '
根据数位确定输出格式t = 1
Picture2.Print
Picture2.Print "
排出 "; n; " 阶自然数阵Ne(i, j)如下: "For i = 1 To n '
For j = 1 To n
Ne(i, j) = t
Picture2.Print Tab(sk * j); Ne(i, j);
t = t + 1
Next j
Picture2.Print
Next i
End Sub
Sub nycfym(n) '
穿心对调主过程Picture2.Print
If ak = 1 Then
Picture2.Print "
这是使用穿心对调二法:奇行换偶,偶行换奇"ckr = "
穿心对调二法"Else
Picture2.Print "
这是使用穿心对调一法:奇行换奇,偶行换偶"ckr = "
穿心对调一法"End If
For k = 1 To 2
bk = IIf(ak = 1, 3 - k, k) '
奇行换奇,偶行换偶For i = k To a Step 2
For j = bk To a Step 2 '
c(i, j) = Ne(v - i, v - j)
c(v - i, v - j) = Ne(i, j)
c(i, v - j) = Ne(v - i, j) '
左右对称c(v - i, j) = Ne(i, v - j) '
穿心对调Next j
Next i
Next k
End Sub
Sub oypb(n) '
重排米字过程If ak = 1 Then
For i = 1 To n '
二法重排米字(顺向)c(i, b) = Ne(i, v - i) '
中列向下c(i, v - i) = Ne(i, b) '
副对角线向左下c(b, i) = Ne(i, i) '
中行向右c(i, i) = Ne(b, i) '
主对角线向右下Next i
Else
For i = 0 To n - 1 '
一法重排米字(逆向)c(n - i, b) = n + (n - 1) * i '
中列向上c(b, n - i) = 1 + v * i '
中行向左c(n - i, 1 + i) = v / 2 + n * i '
副对角线向右上c(n - i, n - i) = (n - 1) * n / 2 + 1 + i
'
主对角线向左上Next i
End If
End Sub
Private Sub Command6_Click() '
对调中枢主程序For i = 1 To n
For j = 1 To n
c(i, j) = Ne(i, j)
Next j
Next i
Call nycfym(n) '
穿心对调主过程If n Mod 2 = 0 Then '
一、二法偶阶对调后调整If w = 2 Then
For i = 2 To a - 1 '
单偶阶上下对调a列u = c(i, a): c(i, a) = c(v - i, a)
c(v - i, a) = u '
再左右对调a+1行u = c(b, i): c(b, i) = c(b, v - i)
c(b, v - i) = u
Next i
u = c(1, a): c(1, a) = c(1, b) '
c(1, b) = u '
最后对调首行、首列的中间两项u = c(a, 1): c(a, 1) = c(b, 1)
c(b, 1) = u
u = c(1, 3): c(1, 3) = c(n, 3)
c(n, 3) = u
u = c(3, 1): c(3, 1) = c(3, n)
c(3, n) = u
End If
ElseIf n Mod 2 = 1 Then '
一、二法奇阶对调后调整Call oypb(n) '
加入十字,重排米字If w = 3 Then
For i = 1 To a - 1 '4m+3
阶上下对调a列u = c(a, i): c(a, i) = c(a, v - i)
c(a, v - i) = u
u = c(i, a): c(i, a) = c(v - i, a)
c(v - i, a) = u '
再左右对调a行Next i
u = c(a, a): c(a, a) = c(v - a, v - a)
c(v - a, v - a) = u '
最后对调中心四项u = c(a, b): c(a, b) = c(v - a, b)
c(v - a, b) = u
End If
End If
nk = IIf(n < 58, n, 57) '
最多显示57列For i = 1 To n '
显示幻方For j = 1 To nk
Picture2.Print Tab(sk * j); c(i, j);
Next j
Picture2.Print '
换行Next i
End Sub
Private Sub Command2_Click() '
检验swcg n '
通用幻方检验过程If k = 0 Then
Picture2.Print "C
是一个"; n, "阶幻方,其幻和为"; L(0), "它的每一行、每一列及两对角线上数之和都是:"; L(8)MsgBox "
这个C是一个标准幻方。", 48, "检验结论:" ' 信息对话框Else
Picture2.Print
Picture2.Print Tab(20); "
遗憾,C不是一个幻方!"; "其中有"; k; "条不符合要求。"Exit Sub
End If
End Sub
Private Sub Command3_Click() '
记录Open "d:\09\
穿心对调幻方A.txt" For Append As #1 '打开或创立文件Print #1,
Print #1, "
使用 " & ckr & "制作的 "; n; " 阶幻方如下:"; "从1 填到 "; n * nFor i = 1 To n '50
For j = 1 To n
Print #1, Tab(sk * j); c(i, j);
Next j
Print #1,
Next i
If k = 0 Then
Print #1, "C
是一个"; n, "阶幻方,其幻和为"; L(0), _"
它的每一行、每一列及两对角线上数之和都是:"; L(8)Else
Print #1, Tab(20); "
遗憾,C不是一个幻方!"; "其中有"; k; "条不符合要求。"End If
Print #1,
Close #1 '
关闭这个文本End Sub
Private Sub Command4_Click() '
退出End
End Sub
Private Sub Option1_Click(Index As Integer)
ak = Index '
单选制作法End Sub
Private Sub Command5_Click() '
清屏Picture2.Cls
HScroll1.Value = 10 '
写入点返回左上角VScroll1.Value = 10
End Sub
Private Sub Form_Load() '
滚动图形窗口设置Picture2.AutoSize = True
Picture1.BorderStyle = 0
Picture2.BorderStyle = 0
Picture2.Width = 31680
Picture2.Height = 31350
HScroll1.Max = Picture2.Width - Picture1.Width
VScroll1.Max = Picture2.Height - Picture1.Height
Option1(0).Value = True
End Sub
Private Sub HScroll1_Change() '
水平滚动条变化Picture2.Left = -HScroll1.Value
End Sub
Private Sub VScroll1_Change() '
垂直滚动条变化Picture2.Top = -VScroll1.Value
End Sub
程序运行与功能
| 8 阶自然数阵Ne及使用 穿心对调二法制作的 8 阶幻方如下:从1 填到 64 | C是一个 8 阶幻方,其幻和为 260 它的每一行、每一列及两对角线上数之和都是: 260 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
图-2:自然方阵与穿心对调幻方
运行穿心对调幻方程序,出现主窗体界面。单击“开始”按钮,初始化幻方数组
当一幅图片快写完,垂直滚动条VScroll1的滑块到了最下方,这时单击“清屏”按钮,清除所显示的内容,光标(写入点)自动返回图片框的左上角。
图片框的宽度是有限的,本软件设置滚动显示幻方最多时是57列,再多的列将被略去。如要看全或之后仔细玩赏研究,可以单击“记录”按钮,程序将幻方及结论记录在事前创建的文件夹D\09中的穿心对调幻方A.txt文本内,图-2是一例,能再作打印或其它处理。
单击“退出”按钮后退出程序。此工程能生成可执行文件穿心对调幻方.exe,在windows95/98环境下使用,记住在硬盘D中先创建09文件夹以备记录。
穿心对调幻方的制作原理
以n阶方阵的行、列顺序依次排入自然数1
到n×n,得到的是n阶自然数阵Ne。见图-2左侧,在自然数阵里,关于中心对称的两项之和恒相等,为常数
整除运算
取模运算
n mod 4用来求余数w,w将阶数分为四个类型,即双偶数4m、单偶数4m+2及奇数4m+1和4m+3。看样,穿心对调法最适合于4m阶,操作之后即得幻方;而对4m+2阶还要将中间多出的不平衡的两行、两列及一些项进行调整,这近似经验或灵感的调整,很难找出动作的规则,才是编程的艰难之处!参阅对调中枢主程序Private Sub Command6_Click()。对于奇数阶,施行穿心对调一法或二法后,得到的也不是幻方,必须将中行和中列及两对角线重新排列,称作重排米字,见oypb(n)过程及图-3例。4m+3阶最为复杂,还有调整部分项的第三步工作,才得幻方。VB编程时往往对不规范的另星动作熬尽脑汁,调试成功后才尝到胜利的喜悦,运行时转瞬间制得高阶幻方并加以验算,这才觉得电脑的效率与程序之伟大!
|
使用 穿心对调二法制作的
9 阶幻方如下:从1 填到
81
C是一个 9 阶幻方,其幻和为 369 图-3:9阶穿心对调幻方与米字示意 |
幻方制作是一个大课题,如果说马步法似奔驰疆场、军容严正,那么穿心对调法则是坐席论道、灵活机动。倘有机缘,以后再介绍其它制作法的
VB程序。读者若有兴趣可与我联系,电话:0712—2313763。
2001年7月12日重新修订