我正在参加CS50的Python人工智能入门课程,我非常喜欢它。当我运行我的脚本时,似乎一切都运行良好,但CS50的检查器发现了一种边缘情况,我的软件在推断知识时显然无法找到安全单元格。以下是CS50规范,着重于未通过测试的部分:
规范
完成
Sentence
类和MinesweeperAI
类在minesweeper.py
中的实现。
在
Sentence
类中,完成known_mines
、known_safes
、mark_mine
和mark_safe
的实现。
known_mines
函数应返回self.cells
中所有已知为地雷的单元格的集合。
known_safes
函数应返回self.cells
中所有已知为安全的单元格的集合。
mark_mine
函数应首先检查cell
是否包含在句子中。
如果
cell
在句子中,函数应更新句子,使cell
不再在句子中,但仍表示一个逻辑上正确的句子,因为cell
已知为地雷。如果
cell
不在句子中,则无需采取任何行动。
mark_safe
函数应首先检查cell
是否包含在句子中。
如果
cell
在句子中,函数应更新句子,使cell
不再在句子中,但仍表示一个逻辑上正确的句子,因为cell
已知为安全。如果
cell
不在句子中,则无需采取任何行动。在
MinesweeperAI
类中,完成add_knowledge
、make_safe_move
和make_random_move
的实现。
add_knowledge
应接受一个cell
(表示为元组(i, j)
)及其对应的count
,并更新self.mines
、self.safes
、self.moves_made
和self.knowledge
,以包含AI可以推断的任何新信息,因为cell
已知为安全单元格,周围有count
个地雷。
函数应将
cell
标记为游戏中已进行的移动之一。函数应将
cell
标记为安全单元格,同时更新包含cell
的任何句子。函数应根据
cell
和count
的值向AI的知识库添加一个新句子,以指示cell
的count
个邻居是地雷。请确保句子中只包含状态仍未确定的单元格。如果基于
self.knowledge
中的任何句子,可以将新的单元格标记为安全或地雷,则函数应执行此操作。如果基于
self.knowledge
中的任何句子,可以推断出新的句子(使用背景中描述的子集方法),则这些句子也应添加到知识库中。请注意,每次对AI的知识进行任何更改时,都可能产生之前不可能的新推断。请确保将这些新推断添加到知识库中,如果可能的话。
这是我的代码(大部分任务已经完成,所以如果你不想剧透,请不要继续阅读):
...
当我通过CS50检查函数运行我的脚本时,输出如下:
...
求助!
我已经尝试了一切,Chat GPT一点帮助都没有,我尝试使用pytest和test_minesweeper.py来单元测试我的代码,一切似乎都很好!在所有情况下,我添加到知识中的代码似乎都运行良好。
回答:
你有多个问题需要解决。我将从最基本的问题开始。查看add_sentence()
方法中的代码,其中你删除空句子并查找已知地雷和安全单元格的句子。你可以使用这个代码片段进行测试。运行它并在每个for循环后检查knowledge
以发现问题:
...
关于地雷/安全单元格循环的提示:如果你使用if/elif
,你不需要continue
语句。
在你修复了那段代码后,你还有更多需要修复的地方。假设knowledge
中有这两个sentences
(按此顺序):
...
在你发现(0,0),(0,1),(0,2)
中的地雷后,你应该发现(1,0),(2,0)
中的地雷。然而,你不会通过一次调用add_sentence()
捕获到它。
最后,你的最后一步(推断知识)需要改进。我在CS50AI ED论坛上有一篇帖子展示了这一点。使用此链接:如何调试扫雷