人工智能真的需要依靠人类提供的数据才能正常运作吗?只需亲自编写一个“走迷宫”的程序,便能找到答案。
本文以两篇简明易懂的教程为基础,专为编程初学者设计,带领大家从零起步学习“软件编程与人工智能”,旨在让非专业人士能够深入理解人工智能的实现原理。我们将减少理论探讨,直击最核心的语句与算法应用。
鉴于内容较为丰富,计划分为三篇来完成。本篇为第一篇:软件编程的快速入门,同时也会构建走迷宫程序的基础。
学习的基础条件是电脑上安装有微软的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键,黄色背景又下移一行。此时,前一句已经执行完毕,我们来看看结果如何:
全面掌握Excel VBA编程:从基础到高级技巧
在表格的第一行第一列中,我们成功填入了数字1。
这标志着我们的第一句代码顺利执行。
接下来,再次按两次F8键,以便执行接下来的两条语句。此时,表格第一行的第二列和第三列分别填入了数字2和3,呈现如下图所示:
至此,这段简单的程序已经全部执行完毕。我们编写的首个程序取得了成功。
然而,这样逐步按F8键执行程序是否显得太繁琐呢?有没有可能一键完成呢?
当然是可以的!
使用功能键F5可以实现一键执行整个程序。
之所以首先介绍F8的单步执行,是为了让大家清晰地看到程序的执行顺序。将来在调试时,单步执行将非常有用。
需要注意的是,如果我们编写了多个Sub过程,确保将光标放置在想要运行的Sub内部后再按F5,这样该过程才会被执行。其他过程则不会执行,如下图所示:
最后,我们总结一下,VBA编程常用的功能键如下图所示:
这就是在Excel中使用VBA语言编写和运行程序的全过程,难度并不大吧?
第五步:调整安全级别
如果前四步都顺利进行,可以跳过这一步。
若程序无法运行且提示被“禁止”,可能是因为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循环语句,并循环三次,『迷宫列号』的取值分别为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个单元格,每个单元格有4个移动方向。因此,我们可以创建一张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”,即“上、右、左”三个方向的参数为0,表示不可移动。而“下”方向的参数为1,表示可以移动。
这四个参数与左下方红色方框中“老鼠”的移动方向参数是一致的,如蓝字所示。
迷宫中每个单元格的动作参数,都以相似的方式填入动作参数表中。
有了这张表,老鼠便能识别哪些方向可以通行,哪些方向则无法前行。
接下来,我们将探讨怎样编写程序使老鼠活动,欢迎关注我,确保您不会错过最新动态。
如果您在编程过程中遇到任何问题,请随时在下方留言。
Please specify source if reproduced从零开始,轻松编程探索人工智能的奥秘:强化学习入门指南 | AI工具导航































