You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断Nip棋盘游戏中点击单元格是否为棋盘边缘

问题:判断Nip棋盘游戏中单元格是否为边缘

我正在开发一款名为Nip的棋盘游戏,当玩家点击单元格时,需要判断该单元格是否为棋盘边缘。已能通过floor函数获取点击单元格对应board列表中的行(row)和列(col),但不知道如何利用以下board结构判断边缘:

EMPTY,EDGE = 0,0
BLACK = 1
WHITE = -1

board = [
    [      2,     2, EDGE, EDGE, EDGE, EDGE,     2,     2,],
    [      2, EDGE, EMPTY, EMPTY, EMPTY, EMPTY, EDGE,     2,], 
    [  EDGE, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EDGE,], 
    [  EDGE, EMPTY, EMPTY, BLACK, WHITE, EMPTY, EMPTY, EDGE,], 
    [  EDGE, EMPTY, EMPTY, WHITE, BLACK, EMPTY, EMPTY, EDGE,], 
    [  EDGE, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EDGE,], 
    [      2, EDGE, EMPTY, EMPTY, EMPTY, EMPTY, EDGE,     2,],
    [      2,     2, EDGE, EDGE, EDGE, EDGE,     2,     2,],
]

我尝试通过检测选中单元格的邻格是否为值2来判断,但效果不佳,当前的判断函数如下:

def is_on_the_edge(self,row,col):
    for drow in [-1, 0, 1]:
        for dcol in [-1, 0, 1]:
            if drow == 0 and dcol == 0:
                continue
            check_row, check_col = row + drow, col + dcol
            if board[check_row][check_col] == 2:
                return True
            else:
                continue
    return False

请问该如何解决这个问题?


解决方案

1. 修正核心常量定义

你的代码中EMPTY和EDGE被赋值为同一个值0,导致无法区分空单元格和边缘单元格,这是根本问题。先修改常量定义,让两者取值不同:

EMPTY = 0
EDGE = 3  # 选用与EMPTY、BLACK、WHITE都不同的数值
BLACK = 1
WHITE = -1

同时更新board列表中所有原EDGE的位置为新的EDGE值,保持常量与棋盘标记对应。

2. 简化边缘判断逻辑

修正常量定义后,边缘单元格本身就被标记为EDGE,直接判断当前单元格的值即可:

def is_on_the_edge(self, row, col):
    return self.board[row][col] == EDGE

3. 不修改原board结构的兼容方案

如果不想改动现有board的数值定义,需要解决原函数的索引越界和判断逻辑不准确问题,修正后的函数如下:

def is_on_the_edge(self, row, col):
    # 排除棋盘外的单元格(值为2的区域)
    if self.board[row][col] == 2:
        return False
    
    # 仅检查上下左右四个正方向,避免对角线误判
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    for drow, dcol in directions:
        check_row = row + drow
        check_col = col + dcol
        # 检查邻格是否超出棋盘范围
        if check_row < 0 or check_row >= len(self.board) or check_col < 0 or check_col >= len(self.board[0]):
            # 邻格越界,说明当前单元格在物理边缘
            return True
        # 邻格在棋盘内,检查是否为棋盘外标记(值为2)
        if self.board[check_row][check_col] == 2:
            return True
    return False

关键说明

  • 原函数未处理索引越界情况,点击棋盘最外层单元格时,check_row或check_col会变成负数或超出列表长度,直接引发错误。
  • 原函数用8邻格判断容易误判,角落单元格的对角线邻格为2不代表当前是边缘,正方向判断更符合实际需求。

内容的提问来源于stack exchange,提问作者Igor Bond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:13:12