人工智能是否真需要依赖人类所提供的数据来运作?通过自己动手编写一个“走迷宫”的程序,或许能给出答案。
这篇文章是网络上为数不多的零基础快速入门教程之一,专为编程新手设计,旨在帮助读者从零开始学习“软件编程与人工智能”。我们将重点介绍核心语句和算法应用,而非冗长的理论。
由于内容较为丰富,我们将分为三篇来完成。本篇为第一篇:快速入门软件编程,同时为走迷宫程序打下基础。
学习的基本条件是你的电脑需安装微软的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缩进4个空格,以便使程序结构清晰。按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开始,以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个单元格,每个单元格有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工具导航































