我正在尝试用Python编写Reversi游戏。有人能给我一些简单,好用的基本想法和策略吗?
我非常感谢任何人的帮助,因为我已经走得有点远了,但代码之间却被困住了,而且它也变得更加复杂。我认为我在某些方面做得太过了,这应该是相当简单的。所以..。
发布于 2008-11-24 21:01:44
Reversi是一款优雅简单的游戏。我将使用伪C#/Java语言来解释一些概念,但您可以将它们转换为Python。
要将其分解为最简单的组成部分,您需要做两件基本的事情:
表示游戏板的二维数组:
gameBoard[10,10]以及某种形式的枚举,用于存储游戏板中每个瓦片的状态:
enum tile
{
none,
white,
black
}要渲染电路板,您需要遍历gameBoard数组,按块大小的偏移量递增:
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
// The Piece to draw would be at gameBoard[i,j];
// Pixel locations are calculated by multiplying the array location by an offset.
DrawPiece(gameBoard[i,j],i * Width of Tile, j * width of tile);
}
}同样,将鼠标单击返回到数组中的某个位置也是类似的,使用鼠标位置和偏移来计算您所在的实际磁贴。
每次放置一个块时,您都会扫描整个数组,并根据新颜色应该是什么来应用一个简单的规则引擎。(这是真正的挑战,我将把它留给您。)
AI可以利用假设的移动进行阵列扫描,让它扫描大约10个可能的移动,然后选择产生最好结果的一个。尽量不要让它变得聪明,因为当你让它在大脑中玩完整个游戏时,它很容易做出一个无与伦比的人工智能。
当数组中不再有空闲位置时,结束游戏。
发布于 2008-11-24 22:12:37
wikipedia page为reversi/othello提供了所有的规则和一些不错的策略建议。基本上,您需要某种数据结构来表示棋盘状态,也就是说,棋盘上所有棋子在游戏中的任意点的位置。正如其他人所建议的那样,二维数组可能是一个不错的选择,但只要它是对您有意义的表示,它实际上并不重要。一些困难的事情是找出哪些空格是有效的移动,然后翻转哪些部分,但同样,维基百科页面有所有的细节,所以它应该不会太难实现。
如果你想为你的游戏创建一个AI,那么我建议你看看一些带有Alpha-Beta剪枝的minimax类型的算法。网络上有大量的资源,一个使用了极大极小的评估函数的人工智能将能够非常容易地击败大多数人类玩家,因为它可以在很短的时间内看起来至少8到9步。在minimax上还有其他一些更花哨的变体,比如negamax或negascout,它们甚至可以比基本的minimax做得更好,但我还是从更简单的开始。维基百科有关于所有这些算法的页面,并且有大量关于所有这些算法的信息,因为许多AI课程将它们用于奥赛罗或类似的东西。一个特别有用的页面是this Java Applet。它允许您在具有和不具有alpha-beta剪枝的情况下,在样本状态树上逐步执行minimax和negamax步骤。
如果这些都说不通,请告诉我。
发布于 2008-11-24 21:21:10
你需要一个二维数组。注意[* 8] * 8,而不是使用[[0 for _ in * 8] for _ in * 8]
白色应该是1,黑色应该是1(当然,反之亦然)。这样你就可以用*=-1做翻转,并保持空白,双四个循环将能够获得总分,并确定游戏是否做得很好。map(sum,map(sum,board))会给出你的净分
别忘了检查一下,看看玩家在一轮开始时是否还能移动
https://stackoverflow.com/questions/315435
复制相似问题