人工智能真的需要依赖人类提供的数据才能进行操作吗?亲自编写一个“走迷宫”的人工智能程序,您就会有更深的理解。
本文提供了少数几乎独一无二的双零基础入门教程,旨在帮助初学者从零起步,学习“软件编程与人工智能”。这样,更多非专业人士能够从根本上理解人工智能的工作原理。我们将尽量少谈理论,直接聚焦于最重要的语句和算法。
由于内容较为丰富,我们计划将其分为三篇完成。本文是第一篇:快速入门软件编程,同时为走迷宫程序奠定基础。
学习的基本要求是您的计算机上必须安装微软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,黄色背景将下移一行。此时前一条指令已经执行完毕,我们来查看结果:
轻松掌握VBA编程与Excel操作
在表格的第一行第一列中,我们成功地填入了数字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个单元格,每个单元格对应四个方向,因此我们需要创建一张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”,这意味着“上、右、左”三个方向不可移动,而“下”方向则可以移动。
这些参数与左下方红色方框中“老鼠”的移动方向参数一致,如蓝色字所示。
迷宫中每个单元格的动作参数均以相同方式填入动作参数表中。
有了这张表,老鼠就能清楚地知道哪些方向可以前进,哪些方向是无法通过的。
在接下来的篇章中我们将探讨如何编写代码以实现老鼠的移动,敬请关注,以便第一时间获取更新。
如果在编程过程中遇到任何困惑,欢迎在下方留言讨论。
Please specify source if reproduced从零开始,轻松编程探索人工智能的奥秘:强化学习入门指南 | AI工具导航































