首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查棋盘,看玩家是否连续三次。

检查棋盘,看玩家是否连续三次。
EN

Code Review用户
提问于 2013-04-26 21:10:59
回答 2查看 385关注 0票数 2

代码会检查更多的条件,如下所示。我想把它写成回忆录,但我想不出(作家们怎么阻止)。不然我怎么能优化这个呢?我知道这听起来很傻,但我的代码大部分时间都花在了函数上。

代码语言:javascript
复制
def has_three(p, board):
    """Checks if player p has three in a row"""
    # For every position on the board
    for i in xrange(6):
        for j in xrange(7):
            if board[i][j] == p:
                if i<=2 and board[i+1][j]==p and board[i+2][j]==p and board[i+3][j]==0:
                    return True
                if i>=3 and board[i-1][j]==p and board[i-2][j]==p and board[i-3][j]==0:
                    return True
                if j<=3 and board[i][j+1]==p and board[i][j+2]==p and board[i][j+3]==0:
                    return True
                if j>=3 and board[i][j-1]==p and board[i][j-2]==p and board[i][j-3]==0:
                    return True
                if i<=2 and j<=3 and board[i+1][j+1]==p and board[i+2][j+2]==p and board[i+3][j+3]==0:
                    return True
                if i<=2 and j>=3 and board[i+1][j-1]==p and board[i+2][j-2]==p and board[i+3][j-3]==0:
                    return True
                if i>=3 and j<=3 and board[i-1][j+1]==p and board[i-2][j+2]==p and board[i-3][j+3]==0:
                    return True
                if i>=3 and j>=3 and board[i-1][j-1]==p and board[i-2][j-2]==p and board[i-3][j-3]==0:
                    return True
    return False
EN

回答 2

Code Review用户

发布于 2013-04-26 23:04:36

我们真的需要更多的了解游戏,以帮助你正确。另外,为什么您的程序在这个函数上花费了那么多时间?(您是否在进行某种展望,此函数是评估的一部分?)

如果这是一个像高木库这样的游戏,玩家轮流,在每个回合中,一个玩家在棋盘上放置一块,第一个在一条线中获得n的玩家获胜,那么棋盘能有一条获胜线的唯一方法是,如果这条线包括刚玩过的那块。因此,看董事会的其他观点是没有意义的。

所以在这种情况下,你会写这样的东西:

代码语言:javascript
复制
DIRECTIONS = [(1,0),(1,1),(0,1),(-1,1)]

def legal_position(i, j, board):
    """Return True if position (i, j) is a legal position on 'board'."""
    return 0 <= i < len(board) and 0 <= j < len(board[0])

def winning_move(player, move, board, n = 3):
    """Return True if 'move' is part of a line of length 'n' or longer for 'player'."""
    for di, dj in DIRECTIONS:
        line = 0
        for sign in (-1, 1):
            i, j = move
            while legal_position(i, j, board) and board[i][j] == player:
                i += sign * di
                j += sign * dj
                line += 1
        if line > n: # move was counted twice
            return True
    return False

但是如果不了解你的游戏规则,我就不可能知道这种方法是否有意义。

票数 1
EN

Code Review用户

发布于 2013-04-28 09:29:26

如果只循环遍历行、列和对角线,并在执行过程中计算连续的p's,则可以减少比较的次数。

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

https://codereview.stackexchange.com/questions/25550

复制
相关文章

相似问题

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