如何判断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
相关产品推荐
相关产品推荐

