【发布时间】:2019-07-01 01:10:30
【问题描述】:
我对如何解决一些问题有一些疑问。我正在尝试使用装配设置井字游戏,并且我正在尝试实现计算机作为玩家进行游戏。我正在寻找将数据主要保存到变量的方法,例如我可以附加一个变量字符串,我将在其中添加每个玩家播放的单元格的所有变量。
我该怎么做,有没有办法可以说创建一个数组来保存我可以动态更改和分配的信息?。
【问题讨论】:
标签: algorithm assembly data-structures mips
我对如何解决一些问题有一些疑问。我正在尝试使用装配设置井字游戏,并且我正在尝试实现计算机作为玩家进行游戏。我正在寻找将数据主要保存到变量的方法,例如我可以附加一个变量字符串,我将在其中添加每个玩家播放的单元格的所有变量。
我该怎么做,有没有办法可以说创建一个数组来保存我可以动态更改和分配的信息?。
【问题讨论】:
标签: algorithm assembly data-structures mips
我建议将调用堆栈用作堆栈数据结构,或者更简单地用于创建递归函数。
递归自然有助于对可能的移动进行详尽的搜索,修剪任何导致强制失败的分支。正式地,这称为 Minimax 搜索(以找到下一步)。 https://www.cs.cornell.edu/courses/cs312/2002sp/lectures/rec21.htm
如果你找到了获胜的棋步,你就会返回这个事实,而跟注者知道它正在考虑的棋盘位置让对手强行获胜。您希望您的功能避免让对手强行获胜,并采取可能导致自己强行获胜的动作(如果有的话)。例如Tic Tac Toe recursive algorithm.
我建议使用固定大小的数据结构来表示棋盘状态。你的好选择是
一个 9 字节的字符数组,如空格、“X”和“O”(填充为 12,以便您可以使用 3x lw 复制它)。即在 C 中,struct board { alignas(4) char b[9]; };。您复制整个结构。
2x 位图(一个用于 X,一个用于 O),用于所谓的“位板”。 (在国际象棋引擎中,64 位位图对于棋盘上的每个方格都有一个位。在 3x3 井字游戏中,整个棋盘只需要 9 位寄存器)。然后你可以想出一些小技巧来测试 3-in-a-row,比如 b & 0b111 == 0b111(andi 和 beq)来检查第一行是否都是一个标记。
您可以通过执行X|O 并寻找仍然为零的位来找到板上剩余的空位。
单个位板,每个位置 2 位(总共 18 位,大于 MIPS 立即数)。通过这种方式,在第三个位置为空的情况下连续查找 2 个可能会更容易。
【讨论】: