是否人工智能的运行完全依赖于人类所提供的数据呢?只需亲自编写一个“迷宫探险”的程序,便能找到答案。
本文为您呈现一份独特的快速入门指南,专为编程初学者设计,旨在帮助大家从零基础起步,深入了解“软件编程与人工智能”的结合,使非专业人士能够掌握核心概念。我们将尽量少讲理论,直接聚焦于重要的代码和算法应用。
由于内容较为丰富,我们计划分为三篇来完成。本篇是第一篇:软件编程的快速入门,同时也将实现迷宫程序的基础功能。
学习的基本条件是您的电脑上需安装微软的Office办公软件,版本不限。只要您能够熟练使用Excel的基本功能,就可以了。不需要安装任何额外的编程语言或开发环境。
如果您的电脑上只安装了WPS Office,理论上也可以使用,但需要下载一个插件才能进行VBA编程。如有需求,请随时留言。
我们会从VBA编程语言的基础知识开始,让大家在最短的时间内编写出自己的第一个计算机程序。接下来,我们将创建一个真正的人工智能程序,并采用强化学习算法。该算法被广泛应用于谷歌的围棋AI阿尔法狗、OpenAI的红蓝小人捉迷藏以及ChatGPT等多个项目。
在Excel中,我们将绘制一个简单的迷宫,并设置三个表格作为人工智能的“参数”。老鼠要通过这些参数学习如何走出迷宫,实现“智能”。
这个教程同样适合假期中的学生,帮助他们学习编程语言与人工智能编程。
接下来,我们正式开始:
01 在Excel中编写与运行程序
微软的Excel表格软件内置了编程语言VBA,这是一种可视化的BASIC语言,非常适合初学者进行编程学习。
第一步:开启Excel的编程窗口
启动Excel软件,创建一个新的空白表格。接着按下Alt+F11组合键,打开编程窗口。组合键的操作方式是:先按住Alt键,然后再按F11功能键。结果如图所示:
右侧窗口为编写程序的界面,请根据图示适当调整编程窗口的大小,使其占据屏幕的一半,另一半可见表格。
接下来,按照图中标记的①②顺序,点击小框中的“+”号使其变为“-”号,然后双击“Sheet1”,将光标移动到③处,便可以开始编写程序代码。
第二步:编写您的第一个程序代码
每个程序需以“Sub”开头,后接一个空格,接着是『程序名称』及一对空括号,然后按回车键。『程序名称』可以使用英文或汉字,以“End Sub”结束此段程序。例如:
Sub 初始化()End Sub
如图所示:
特别需要注意的是,在程序中,除了名称可以使用汉字外,所有字符和标点必须使用英文状态输入。否则会出现“无效字符”的提示。尤其是在标点符号方面,如逗号『,』、句点『.』、单引号『'』、双引号『""』、括号『()』等都必须使用英文符号。
在一个程序中,可以编写多个以“Sub”开头并以“End Sub”结尾的程序,这称为一个“过程”或“子程序”。
在“Sub”与“End Sub”之间,您可以输入自定义的程序代码。
第三步:在过程内编写程序代码
将光标移至Sub过程内部,输入第一条语句:
Cells(1,1)=1
该语句的作用是向指定单元格填入内容。格式如下:
举例来说:Cells(1,1)=1表示在第1行第1列的单元格中写入数字1。
在这个Sub过程中,我们将写入三个Cells()语句:
Sub 初始化() Cells(1,1)=1 Cells(1,2)=2 Cells(1,3)=3End Sub
请注意,程序语句通常需要比Sub向右缩进四个空格,以使程序结构更加清晰。通过按Tab键即可实现缩进。完整代码如下图:
接下来,让我们看看如何运行这段程序。
第四步:执行程序
将光标移到Sub过程内,然后按下功能键F8,此时Sub语句的背景会变成黄色,表示程序将从此处开始运行。
如果在运行程序时出现错误,请跳至第五步以设置安全级别。
F8键的作用是顺序执行一条程序语句,专业名词称为“单步执行”。
继续按F8键,让黄色背景移动到下一行的Cells(1,1)=1,表示此句将被执行。
再按F8键,黄色背景将再次下移一行。此时,上一句已经执行完,让我们来看一下结果:
轻松掌握VBA编程:从基础到高级
在表格的第一行第一列,我们已经成功填入了数字1。
这一行代码的执行获得了成功。
接着,我们再按两次F8键即可完成接下来的两条语句。这时,我们会发现表格的第一行第二列和第三列分别被填入了数字2和3,具体如下图所示:
至此,这段程序的所有语句均已执行完毕。我们成功编写了第一个程序。
不过,逐步按F8执行程序似乎有些繁琐,是否可以一键执行所有内容呢?
当然是可以的!
通过按下F5键,便可一键执行整个程序。
之所以起初讲解F8的单步执行,是为了让大家能够清楚地观察到程序执行的顺序。将来在调试程序时,单步执行的方式也会非常有用。
请注意,若编写了多个Sub过程,务必将光标放置于想要运行的Sub过程内,然后再按F5,这样该过程才会被执行。其他过程将不会被执行,见下图:
最后我们来总结一下,VBA编程中常用的功能键如下图所示:
以上内容便是使用VBA语言在Excel中编写和运行程序的全部步骤,难度并不大吧?
第五步:调整安全级别
如果前面四个步骤没有问题,那么这一部分可以选择跳过。
若程序无法运行,并提示被“禁止”,这通常是因为Excel的安全级别设置过高,导致不允许运行任何程序。此时,需要重新配置“宏安全性”。
请按照下图的四个步骤,将安全级别修改为:“禁用所有宏,并发出通知”。
如果在Excel的主菜单中没有找到步骤①中的“开发工具”选项,别急。
点击主菜单中的“文件”→“选项”→“自定义功能区”,在“主选项卡”下,勾选“开发工具”复选框,“开发工具”就会显示出来。如下图所示:
在某些较低版本的Excel软件中,安全性设置位置在:“工具”→“宏”→“安全性”选项下,请将安全级别设置为“中”即可。
02 编程基本操作
我们已经编写了三条代码,并在表格的第一行前三列填入了数字1、2、3。接下来,我们将继续在后续列中依次填入4、5、6,直到20,每列填入一个数字。
若依旧使用之前的方法,则需要逐条写出20条Cells()语句,这显然效率低下。我们可以利用循环语句,用少量代码便能实现。具体步骤如下:
(1)定义变量。
在中学时,我们学习过代数,能够用字母表示数字,如x=8,y=0.5等,这些字母在编程中被称为变量。
使用变量之前,必须先定义其类型,具体方法如下:
例如:(若以下代码显示不全,可左右滑动)
Dim 列号 As Integer '把变量『列号』定义为整型,只能表达整数 Dim x As Single '把变量『x』定义为浮点型,可表达带小数点的数 Dim 姓名 As String '把变量『姓名』定义为字符串,可表达“张三”等单词或汉字 Dim 列号 As Integer '把变量『列号』定义为整型,只能表达整数
通常会将所有的变量定义集中在一起,放在Sub过程的上方。
另外,我们注意到在Dim语句后面,还附有以单引号『‘ 』开头的一段文字,这便是注释语句,通常显示为绿色。其目的是为了帮助读者理解程序的功能,这种以单引号开头的注释语句不会被执行。
(2)For循环语句
For循环语句以For开头,以Next结束,中间为循环体,如下图所示:
例如:
Dim 列号 As Integer '把变量 列号 定义为整型 For 列号 = 1 To 20 '列号从1到20循环 Cells(1, 列号) = 列号 '循环体,向指定单元格写入数据 Next 列号 '每循环一次,列号加1,大于20后退出循环
这段代码从『列号=1』开始,执行到『Next』语句后,自动将『列号』加1,然后跳回『For』语句重新进行判断。
如果『列号』没有超过20,则再次执行循环体的代码。
这一过程将持续,直到『列号』超过20后才会退出循环,执行Next后的下一句程序。
完整的代码如下图所示。请将光标移到Sub过程内部,按F5执行这段程序。
最终结果是在表格的第一行中,每一列依次填入1至20的数字,见下图。
这一系列连续的数字即为表格的列号,我们将留着它以供后续使用。
如果对循环语句的用法仍不太明白,建议按F8键逐步执行上述程序,这样可以清楚地观察到循环语句的运行过程,以及循环变量『列号』的变化情况。如下图所示:
(3)保存程序
编写完成后,记得将程序保存,以便下次使用。保存方法为:
点击主菜单的“文件”→“另存为”→“其他格式”。
接着选择“文件格式”,选择“Excel 启用宏的工作簿(*.xlsm)”,输入文件名“老鼠走迷宫.xlsm”,最后点击“保存”按钮即可。如下图:
请注意,必须使用.xlsm后缀的文件格式进行保存,选择其他格式将可能导致程序丢失。
在某些较低版本的Excel中,可能没有*.xlsm文件类型的选项,此时请照常保存即可。
(4)启动已保存的程序
在Excel软件中,您需要点击主菜单的“文件”→“打开”,并选择之前保存的“老鼠走迷宫.xlsm”。打开文件后,通常会出现一个安全警告,如下图所示的黄色区域:
这个警告是为了防范未知文件可能带来的宏病毒。由于我们确认该文件是安全的,因此只需点击“启用内容”按钮即可。
在某些较旧版本的Excel中,安全警告可能会以对话框的形式出现,此时同样需要选择“启用宏”按钮。
启用后,请使用组合键 Alt + F11 来打开编程窗口,这样您就能看到之前编写的程序了。您可以尝试运行该程序,检查其是否正常。
如果在打开程序或运行程序时遇到问题,请返回上一步,检查安全级别设置。
以上内容是Excel VBA编程的基础入门,接下来我们将进入实际编程阶段。
03 画迷宫
首先,在Excel表格中绘制一个三行三列的迷宫。
我们将迷宫的起点,即左上角,设置在整个表格的第4行,第2列。
由于这两个数字在后续程序中将被频繁使用,我们将其定义为两个常量。定义常量的方法如下:
Const 迷宫头行 = 4 '迷宫左上角的行号Const 迷宫头列 = 2 '迷宫左上角的列号
完成定义后,在程序中使用『迷宫头行』将代表数字4,而『迷宫头列』将代表数字2。
我们把定义常量的代码放在Sub过程外部,位于编程窗口的最上方。如图所示。
这样做的原因是:在Sub过程外定义的常量或变量可以被所有Sub过程共享。
接着,我们将编写第二个过程“画迷宫”,并将其放在第一个Sub 初始化()过程的下方(如图所示):
Sub 画迷宫()End Sub
随后在这个新的Sub过程内,输入以下代码:
Dim 迷宫行号 As Integer '迷宫内部的相对行号 Dim 迷宫列号 As Integer '迷宫内部的相对列号 Dim 迷宫编号 As Integer '迷宫内单元格的编号
这三条语句用于定义三个变量,这些变量放在Sub过程内部,称为“局部变量”。与在Sub过程外定义的变量不同,局部变量只在其所在的Sub过程内有效,而其他Sub过程不能访问。此外,在不同Sub过程中可以定义同名的变量,它们之间不会相互干扰。
变量的具体含义在后面的注释中已有说明,今后使用时会详细解释。
接下来输入以下代码:
'以下画迷宫边框,并设置迷宫区域的字体属性 With Range(Cells(迷宫头行, 迷宫头列), Cells(迷宫头行 + 2, 迷宫头列 + 2)) .BorderAround LineStyle:=xlDouble '在迷宫四周画出双线边框 .HorizontalAlignment = xlCenter '设字符居中显示 .Font.ColorIndex = 15 '设字体为灰色 .Font.FontStyle = "Bold" '设字体为粗体 End With
以With开头的第一条语句中,Range()语句用于定义一个矩形区域,括号内的两个Cells()分别表示矩形区域的左上角和右下角的单元格。
在Cells()中使用了之前定义的两个常量『迷宫头行』和『迷宫头列』,它们分别代表4和2。也就是说,其实际含义是:
Range(Cells(4, 2), Cells(6, 4))
这表示以第4行第2列的单元格作为左上角,以第6行第4列的单元格作为右下角,形成一个3行3列的矩形区域。如图所示:
可以看到,Cells()语句内的行号和列号可以用数字、常量、变量或表达式来表示,非常灵活。这正是编程的一个特点,大部分代码都可以如此使用。
有些人可能会问:为什么不在程序中直接写Cells(4, 2)和Cells(6, 4),而要使用这样冗长的名称呢?
这样做的目的是为了未来需要修改数字时,能够更加方便。
接下来,查看With语句下方的四行代码,其作用是绘制这个矩形的四条边框,并设置字体属性。这里的英文字符均为Excel手册中规定的,查找后可直接使用,无需记忆。
如果在代码的开头或中间出现一个或多个小句点,这表示:小句点后面的对象是属于前者的。
例如,中国.北京,意味着:这是中国的北京。
如果写成“中国.华盛顿”,则显然是错误的,因为中国并没有这个对象。
每个对象还可以有自身的子对象,因此,可以通过多个句点连写多个层级。例如:
中国.北京.清华大学.法学院.某某班.某某人.年龄=20。
最后一级的对象通常是前面对象的属性,例如,某人的年龄、身高、体重、学习成绩等均属于属性。
在VBA中,单元格、矩形块、表格等统称为对象。这种“面向对象”的表达方式,使得归属关系非常清晰,即使存在同名对象也不会引起混淆。
通常,当一个对象需要设置或使用多个属性时,就可以使用With语句。
With语句以With开头,以End With结束。用法如下:
将以上代码复制或输入至Sub 画迷宫()过程内,然后按F5键运行,检查是否成功绘制出矩形边框。
再次强调,在按F5键运行之前,请确保光标位于Sub过程内,否则将无法正常运行该过程。
如果光标处于Sub过程外,按F5键后会弹出菜单供您选择要运行的过程。如图所示:
选择“画迷宫”,然后点击“运行”按钮即可执行。
接下来,下面四行代码将绘制迷宫内部的墙,方法是利用Cells(行号,列号)语句指定某个单元格,并逐条绘制该单元格某一边的边框。
'以下画迷宫内部墙 Cells(迷宫头行 + 0, 迷宫头列 + 0).Borders(xlEdgeRight).LineStyle = xlDouble '指定单元格右边画双线边框 Cells(迷宫头行 + 1, 迷宫头列 + 0).Borders(xlEdgeBottom).LineStyle = xlDouble '指定单元格下边双线边框 Cells(迷宫头行 + 1, 迷宫头列 + 2).Borders(xlEdgeBottom).LineStyle = xlDouble '指定单元格下边双线边框 Cells(迷宫头行 + 1, 迷宫头列 + 1).Borders(xlEdgeTop).LineStyle = xlDouble '指定单元格上边双线边框
这里的行号和列号都是以常量『迷宫头行』和『迷宫头列』为基准,即以第4行第2列为基准,分别加0、加1、加2来确定相应的单元格。
接下来将绘制迷宫内部单元格的编号。
此处需要使用在Sub过程开头定义的三个局部变量。
其中『迷宫行号』和『迷宫列号』是相对于左上角的行号和列号,取值分别为0、1、2。这意味着在迷宫内部的第0行、1行和2行,或第0列、1列和2列。
迷宫左上角的位置由常量『迷宫头行』和『迷宫头列』决定。
例如:迷宫内的第0行第1列,即:迷宫行号=0,迷宫列号=1。该单元格表示为:Cells(迷宫头行 + 迷宫行号, 迷宫头列 + 迷宫列号)
'以下画迷宫内部单元格的编号 迷宫编号 = 0 '设迷宫编号的初始值为0 For 迷宫行号 = 0 To 2 '迷宫内部行号=0,1,2 For 迷宫列号 = 0 To 2 '迷宫内部列号=0,1,2 Cells(迷宫头行 + 迷宫行号, 迷宫头列 + 迷宫列号) =迷宫编号 '画迷宫内单元格的编号 迷宫编号 = 迷宫编号 + 1 '修改迷宫编号变为当前值+1 Next 迷宫列号 Next 迷宫行号
这是两个嵌套的For循环语句。
外层的For循环语句会循环三次,『迷宫行号』依次取值0、1、2。
每当外层的For语句完成一次循环,就会进入内层For循环语句,并循环三次,『迷宫列号』的取值也为:0、1、2。
总共进行3x3=9轮的循环。
构建迷宫与老鼠移动的逻辑解析
在程序的起始阶段,『迷宫编号』被初始化为0,并在每次循环中递增1。经过9轮的循环,最终其值将从0提升至8。
下面的图示展示了这两个嵌套的For循环执行的全过程,箭头指向了各个步骤:
在图中,蓝色箭头表示内层的列循环,红色箭头则代表外层的行循环。经过9次循环后,迷宫中的9个单元格将依次被填充数字0至8。
最后,在迷宫的左上角位置标记为“老鼠”,而右下角则写上“食物”。
请注意,在单元格中填入的字符必须用英文双引号括起来,切勿使用中文双引号。:
Cells(迷宫头行, 迷宫头列) = "老鼠" '在迷宫0号单元格写“老鼠” Cells(迷宫头行, 迷宫头列).Font.ColorIndex = 1 '字体设为黑色 Cells(迷宫头行 + 2, 迷宫头列 + 2) = "食物" '在迷宫8号单元格写“食物” Cells(迷宫头行 + 2, 迷宫头列 + 2).Font.ColorIndex = 3 '字体设为红色
结束语为End Sub,标志着迷宫的绘制完成。
接下来,请将光标定位到Sub 画迷宫()的内部,然后按下F5键以执行该程序。
除了可以直接运行一个Sub过程,在其他Sub过程内调用该过程时,只需写出其名称,通常不需要加上Sub或括号。
例如,在Sub 初始化()中添加以下两行代码:
Sub 初始化() Dim 列号 As Integer '把变量 列号 定义为整型 For 列号 = 1 To 20 '列号从1到20循环 Cells(1, 列号) = 列号 '循环体,向指定单元格写入数据 Next 列号 '每循环一次列号加1,大于20后退出循环 Range(Cells(2, 1), Cells(26, 12)).Clear '清空指定矩形区域 画迷宫 '调用“画迷宫()”过程End Sub
后面的两行是新增加的,第一句用于清空某个矩形区域,区域的大小由左上角和右下角的单元格决定。第二句则是调用『画迷宫』过程。
当运行『初始化』过程时,『画迷宫』过程将被自动执行,效果如下图所示:
请将上述代码复制或手动输入到编程窗口中,按F5键运行,检查是否能够绘制出同样的迷宫。
如果对这段程序存在疑问,建议使用F8键逐步执行,观察程序的执行流程,这将有助于理解。
04 设计动作参数表
完成迷宫绘制后,我们的目标是让老鼠开始移动。
老鼠如何移动呢?假设它处于迷宫的某个单元格中,可以往上、下、左、右四个方向移动。但是,若有墙壁阻挡,则无法通过。
因此,需要让老鼠明确哪些方向是可行的,哪些方向是不可行的,以免它随意穿越墙壁。
为此,我们创建一张表格,列出迷宫中每个单元格的四个方向,若该方向有墙则标记为0,若无墙则标记为1。这样,老鼠就能根据表中的数值判断出可行与否。
迷宫总共有9个单元格,每个单元格对应四个方向。因此,我们可以建立一张9行4列的表格,涵盖所有可能的情况,称之为“动作参数表”。
在人工智能领域,直接建立表格是处理参数的最简单方法。然而,并非所有应用都适合直接建立表格,或是数据量庞大不够经济。在这种情况下,通常会采用神经网络模型来表达,例如在处理文本、图像和语言等复杂情况时。ChatGPT在处理自然语言时,就运用了神经网络技术,包含了大量参数。
我们将动作参数表的左上角放置在第4行和第8列,并定义两个常量来代表这两个数字。相关代码如下:
Const 参数表头行 = 4 '动作参数表左上角行号Const 参数表头列 = 8 '动作参数表左上角列号
这两行代码应与之前定义的迷宫常量放在一起,并置于整个程序的最上方,如下图所示:
接着,我们建立一个新的过程:画动作参数表,并定义内部局部变量,如下:
Sub 画动作参数表() '画动作参数表(θ) Dim 迷宫行号 As Integer '迷宫内部行号 Dim 迷宫列号 As Integer '迷宫内部列号 Dim 迷宫编号 As Integer '迷宫位置编号 Dim 参数表行号 As Integer '动作参数表当前行号 Dim 参数表列号 As Integer '动作参数表当前列号 End Sub
接下来,在Dim语句下方编写“画表头”的代码,如下:
'画动作参数表表头 Cells(参数表头行 - 2, 参数表头列 + 1).Value = "动作参数表θ(动作表格化)" Cells(参数表头行 - 2, 参数表头列 - 1) = "迷宫编号/" Cells(参数表头行 - 1, 参数表头列 - 1) = "移动方向" Cells(参数表头行 - 1, 参数表头列 + 0) = " 上" Cells(参数表头行 - 1, 参数表头列 + 1) = " 右" Cells(参数表头行 - 1, 参数表头列 + 2) = " 下" Cells(参数表头行 - 1, 参数表头列 + 3) = " 左" '画动作参数表边框 With Range(Cells(参数表头行, 参数表头列), Cells(参数表头行 + 8, 参数表头列 + 3)) .BorderAround LineStyle:=xlContinuous '画参数表四边单线边框 End With
之后,我们将数据填入动作参数表中。
方法是从『迷宫编号』为0的单元格开始,逐个检查到第8个单元格,判断该单元格的上、右、下及左四个方向是否存在墙壁。
若方向上没有墙壁,则表示可以通过,相应地在参数表中填入数字1。
若有墙壁,则表示无法通过,此时在参数表中填入数字0。
如下图所示:
要实现判断的功能,需要使用IF分支语句,其用法如下:
其中『条件表达式』通常涉及到两个常量或变量之间的比较,常见的比较运算符有:
表达式中还可使用算术运算符,常用的有以下几种:
使用示例:
Sub 测试() '这是一个测试程序 Dim x As Integer '定义一个整型变量x x = 7 '给x赋值为7 If x <=2*3 Then '如果x小于等于2乘以3(即6) Cells(2, 1) = "小" '则在第2行1列单元格中填入“小” 。 Else '其他情况,即x大于10 Cells(2, 1) = "大" '则在第2行1列单元格中填入“大”。 End If 'If语句结束End Sub
将这段代码复制或输入到编程窗口中,按F5或F8执行,查看结果。
尝试将x=7中的数字修改为小于7的值,观察程序的运行结果是否有所变化。
接下来,我们来看看如何将参数填写到动作参数表中的代码:
'向表内填写动作参数 迷宫编号 = 0 For 迷宫行号 = 0 To 2 For 迷宫列号 = 0 To 2 参数表行号 = 参数表头行 + 迷宫编号 Cells(参数表行号, 参数表头列 - 1) = 迷宫编号 '动作参数表中左侧写迷宫编号 With Cells(迷宫头行 + 迷宫行号, 迷宫头列 + 迷宫列号) '指定迷宫某个单元格 '以下检查单元格上方有无边框 If .Borders(xlEdgeTop).LineStyle = -4142 Then '如果上方无边框 Cells(参数表行号, 参数表头列 + 0) = 1 '动作参数值填1 Else Cells(参数表行号, 参数表头列 + 0) = 0 '动作参数值填0 End If '以下检查单元格右方有无边框 If .Borders(xlEdgeRight).LineStyle = -4142 Then '如果右方无边框 Cells(参数表行号, 参数表头列 + 1) = 1 '动作参数值填1 Else Cells(参数表行号, 参数表头列 + 1) = 0 '动作参数值填0 End If '以下检查单元格下方有无边框 If .Borders(xlEdgeBottom).LineStyle = -4142 Then '如果下方无边框 Cells(参数表行号, 参数表头列 + 2) = 1 '动作参数值填1 Else Cells(参数表行号, 参数表头列 + 2) = 0 '动作参数值填0 End If '以下检查单元格左方有无边框 If .Borders(xlEdgeLeft).LineStyle = -4142 Then '如果左方无边框 Cells(参数表行号, 参数表头列 + 3) = 1 '动作参数值填1 Else Cells(参数表行号, 参数表头列 + 3) = 0 '动作参数值填0 End If End With 迷宫编号 = 迷宫编号 + 1 '迷宫编号+1 Next 迷宫列号 Next 迷宫行号
虽然程序看似较长,其实结构相对简单。
主体结构依旧是两个嵌套的For循环,利用With语句依次选择编号从0到8的单元格,然后通过4个IF分支语句判断该单元格的上、右、下、左四个方向是否有边框。
根据手册,属性.LineStyle = -4142意味着“无边框”。
请把以上代码复制或输入到“Sub 画动作参数表()”过程中,完成该过程。
同时,也将调用“画动作参数表”的语句添加到“Sub 初始化()”中,如下:
Sub 初始化() Dim 列号 As Integer '把变量 列号 定义为整型 For 列号 = 1 To 20 '列号从1到20循环 Cells(1, 列号) = 列号 '循环体,向指定单元格写入数据 Next 列号 '每循环一次列号加1,大于20后退出循环 Range(Cells(2, 1), Cells(26, 12)).Clear '清空指定矩形区域 画迷宫 '调用“画迷宫()”过程 画动作参数表 '调用“画动作参数表()”过程End Sub
最后一句为新增内容。
接着,按F5键运行“初始化()”过程,结果如下图所示:
左上部分是迷宫,而右上部分则是动作参数表,整个表格包含9行4列。
其中,行编号为0至8,每行对应迷宫中的一个单元格。每列表示一个移动方向,共四列,分别为“上、右、下、左”。
观察表中红色方框所圈住的第0行,其四个参数值为:“0、0、1、0”,表示“上、右、左”三个方向不可移动,而“下”方向的参数为1,表示可以移动。
这四个参数与左下方红色方框中“老鼠”的移动方向参数一致,如蓝色字所示。
迷宫中每个单元格的动作参数都以相同的方式填入到动作参数表中。
通过这张表,老鼠能够清楚了解自己可以走的方向及不可走的方向。
在下一篇文章中,我们将探讨怎样编写代码以实现老鼠的移动,敬请关注,以便第一时间获取更新。
如在编程过程中遇到任何问题,请在下方留言与我们分享。
Please specify source if reproduced从零开始,轻松掌握强化学习编程,探索人工智能的奥秘! | AI工具导航































