人工智能是否真的需要依赖人类输入的数据才能运作?若想亲身体验,可以尝试编写一个“走迷宫”的程序,便能得出答案。
本文将为初学者提供两个零基础的快速入门教程,旨在帮助编程新手从零起步,学习“软件编程与人工智能”的基本概念,尽可能让非专业人士了解这一技术的实现方式。本教程将尽量减少理论讲解,直接聚焦核心语句和算法的应用。
由于内容丰富,我们计划分三篇文章进行讲解。当前为第一篇:软件编程的快速入门,同时将完成走迷宫程序的基础构建。
学习本课程的前提是你的电脑上安装有微软的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
请注意,程序语句通常需要向右缩进四个空格,这样可以使代码层次清晰。按下Tab键即可实现缩进。完整代码见下图:
接下来,我们来看看如何运行这段程序。
第四步:运行程序
将光标移至Sub过程内部,然后按下功能键F8,此时Sub语句的背景将变为黄色,表示程序将从这里开始执行。
如果在运行程序时出现错误,请跳至第五步以设置安全级别。
F8键的作用是按顺序执行每一行程序,这种方法称为“单步执行”。
再次按F8键,黄色背景将移至下一句 Cells(1,1)=1,表示该句将被执行。
再一次按下F8键,黄色背景将下移一行。此时,上一句已经执行,我们来查看结果:
在表格的第一行第一列中,数字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工具导航































