需要有关黑白棋游戏的说明

时间:2008-11-24 20:53:22

标签: python reversi

我正在尝试用Python编写Reversi游戏。任何人都可以给我一些简单,好用且易于使用的基本思路和策略吗?

我会感谢任何帮助,因为我已经走了一段距离,但是被困在代码之间,它也变得更加复杂。我认为我在一些应该相当简单的部分过度。所以......

6 个答案:

答案 0 :(得分:4)

黑白棋是一款优雅简约的游戏。我将使用psuedo 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个左右可能的移动,然后选择产生最佳结果的移动。尽量不要让它变得聪明,因为当你让它在整个游戏中发挥作用时很容易制造出无与伦比的AI。

当阵列中不再有任何空闲位置时,你就结束了游戏。

答案 1 :(得分:1)

wikipedia page拥有所有规则以及针对reversi / othello的一些体面的策略建议。基本上,您需要某种数据结构来表示电路板状态,也就是说游戏中任何一点上电路板上所有部件的位置。正如其他人所建议的那样,2d数组可能是一个不错的选择,但只要它是一个对你有意义的表示,它就没那么重要了。一些困难的事情是弄清楚哪些空间是有效的移动然后翻转哪些部分,但同样,维基百科页面具有所有细节,所以它不应该太难实现。

如果你想为你的游戏创建一个AI,那么我建议你看一下使用Alpha-Beta修剪的某种minimax类型算法。网上有大量资源用于这些,并且使用具有良好评估功能的minimax的ai将能够非常轻松地击败大多数人类玩家,因为它可以在很短的时间内至少看到8或9个步骤。在minimax上还有一些其他更高级的变体,比如negamax或negascout,它们甚至可以比基本的minimax更好,但我会从更简单的变体开始。维基百科有关于所有这些算法的页面,并且有大量关于所有这些算法的信息,因为许多AI课程将它们用于奥赛罗或类似的东西。一页特别有用的是this Java Applet。它允许您在带有和不带alpha-beta修剪的样本状态树上逐步执行minimax和negamax的步骤。

如果这些都没有意义,请告诉我。

答案 2 :(得分:0)

你需要一个2D阵列。谨防[[0] * 8] * 8,而在[0] * 8中使用[[0 for _ in [0] * 8] for _

白色应为1,黑色为-1(当然,反之亦然)。这样你可以用* = - 1翻转并保持空白 双四循环将能够得分并确定游戏是否完成得很好。地图(总和,地图(总和,板))会给你净分

不要忘记检查并查看玩家是否可以在一轮开始时移动

答案 3 :(得分:0)

您可能还希望考虑应用“模糊逻辑”循环来分析位置。 Reversi / Othello以强迫玩家考虑某些战略收益来应对每项举措的战略损失,以及优先考虑一个积极的举动而非另一个举动而臭名昭着。

模糊系统可以通过相互设置各种设置,让您更好地控制测试移动选择,并且通过移动各种权重,您可以创建多个“个性”来对抗。

答案 4 :(得分:0)

不要陷入多暗阵列解决方案。我已经写了一个多维度的井字游戏并且工作正常,但是当我开始自己的othello版本时,我做了一个线性整数数组,它快了近2倍。

Alternative/faster methods of converting an integer to a cartesian coordinate?

我已经完成了大部分用PHP编写的所有内容,但仍然在研究人工智能的想法,因为像Tic-tac-toe这样的强力解决方案是行不通的。

答案 5 :(得分:0)

您甚至不需要线性阵列。两个64位java长值就足够了(一个用于白色,一个用于黑色.s assert(白色和黑色)== 0.

你可以通过计算连接到角落的棋子而不是不能拍摄的棋子来增强游戏效果。