首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查othello/reversi [Python 3]中的移动

检查othello/reversi [Python 3]中的移动
EN

Stack Overflow用户
提问于 2016-11-22 11:24:41
回答 1查看 1.5K关注 0票数 1

我目前正试图在python 3中创建othello (又名reversi)的游戏。

我有很大的问题,在程序的一部分,它应该评估是否一个移动是有效的。

我想要创造的是:

  1. 检查板上的位置是否为空
  2. 检查是否有相反颜色的邻居。
  3. 如果有这样的邻国,继续朝这个方向前进,看看我们是否能够在不跨越空位的情况下到达我们自己的一块。

我尝试过许多不同的功能,但我不能正确地.

下面的链接是我最近的尝试,

链接到github上的git

EN

回答 1

Stack Overflow用户

发布于 2021-10-16 15:59:19

检查板上的位置是否为空

首先想到的是将板表示为字符串,其中字符串中的每个字符都表示该方格的状态,从0开始(左上角)到63 (右下角)。

例如,假设您表示一个由"o""x"和空方块所占用的方块被白色占据,则为。“,对于起始状态,它将是:

board = "...........................ox......xo..........................."

然后,如果要检查正方形是否为空,则检查该字符是否为空:

代码语言:javascript
复制
if board[0] == ".":
    #Square 0 (top left corner) is empty!

检查是否有相反颜色的邻居。

为此,您可以预先存储与所有正方形邻居对应的方向元组(这也将有助于计算可能的移动):

代码语言:javascript
复制
DIRECTIONS = [
    (0, -1),  #Up
    (1, -1),  #Up-Right
    (1, 0),   #Right
    (1, 1),   #Down-Right
    (0, 1),   #Down
    (-1, 1),  #Down-Left
    (-1, 0),  #Left
    (-1, -1), #Up-Left
]

其中元组的第一项是水平移动的数量,第二项是垂直移动的数量。因此,如果您想找到颜色相反的邻居,您将得到当前方框的索引:

代码语言:javascript
复制
row, col = index // 8, index % 8 # To convert from an index from string to (x, y) values

然后循环遍历方向,并检查邻居使用上面的逻辑是什么颜色。

代码语言:javascript
复制
current = board[index]

for x, y in DIRECTIONS:
    r, c = index // (8), index % (8)
    r += y
    c += x
    tile = board[r * 8 + c]

    if tile != current and tile != ".": #Not same color, and not empty, so must be opposite color
         #Do stuff

因为这是非常基本的代码,所以它没有涵盖当前瓷砖位于拐角处边缘的可能性,在那里索引会转到一个不正确的位置,循环。一种可能是只对这些情况进行硬编码,忽略这些方向,但是也可以使用另一种(可能更优雅的方法)。与其将板表示为64个字符的字符串,还可以将其表示为包含如下边框的100个字符字符串:

代码语言:javascript
复制
? ? ? ? ? ? ? ? ? ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? . . . . . . . . ?
? ? ? ? ? ? ? ? ? ?

然后,您可以简单地检查“邻居”是否是边框的一部分(在本例中,“邻居”由问号表示,但除了用来表示空空间和磁盘的内容外,还可以是其他任何内容)。

但是,您需要考虑这样一个事实:您必须适当地将索引从8x8板转换为10x10板(并将其转换回来)。

如果有这样的邻居,继续往那个方向走,看看我们是否能在不跨越空位的情况下到达我们自己的一块。

这非常简单,一旦您实现了上述逻辑,您将只需要一个will循环来检查某个方向的瓷砖,以及如果我们达到原始的颜色,是否可以使用它们。

代码语言:javascript
复制
SIZE = 8
DIRECTIONS = [....]
BORDERCHAR = "?"

def add_border(board):
    edge = BORDERCHAR * (SIZE + 2)
    new_board = edge
    for i in range(0, SIZE ** 2, SIZE):
        new_board += BORDERCHAR + board[i:i + SIZE] + BORDERCHAR   
    new_board += edge
    return new_board

def possible_moves(board, token):
    board = add_border(board) #Converting to 10x10 
    moves = []
    if token == "x":
        other = "o"
    else:
        other = "x"

    for space in [i for i, j in enumerate(board) if j == "."]:

        for x, y in DIRECTIONS:
            r, c = space // (SIZE + 2), space % (SIZE + 2)
            r += y
            c += x
            tile = board[r * (SIZE + 2) + c]

            #Checking to see if we reach one of the original discs
            entered = False
            while tile == other:
                entered = True
                r += y
                c += x
                tile = board[r * (SIZE + 2) + c]

            if entered is True and tile == token:
                moves.append((space // (SIZE + 2), space % (SIZE + 2)))
                break

    moves = [(r - 1) * (SIZE) + (c - 1) for r, c in moves] #Converting back to 8x8

    return moves
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40740615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档