如何检测Numpy数组中指定值以实现跳棋获胜判定?
跳棋游戏获胜判定逻辑实现及代码修正
一、核心获胜判定逻辑
利用numpy的数组快速检索能力,通过检测棋盘上是否还存在某一方棋子来判定胜负:
- 检查数组中是否存在
1:判断玩家2的对手(玩家1)是否还有剩余棋子 - 检查数组中是否存在
2:判断玩家1的对手(玩家2)是否还有剩余棋子
只要其中一方棋子全部消失,另一方即获胜。
二、原代码的关键问题修正
- 逻辑运算符错误:原代码用
&(位运算)代替and(逻辑与),导致移动条件判断失效 - 坐标判断笔误:移动逻辑中Y轴条件写成
movePieceY - movePieceY ==1(恒为0),修正为movePieceY - movePlaceY ==1 - 函数调用参数缺失:
printCheckerBoard()调用时未传入棋盘数组参数 - return语句缩进错误:
tmiall函数中return缩进错误,导致仅在特定分支才返回棋盘状态 - 边界检查缺失:吃子跳步后未判断坐标是否越界,新增边界校验避免数组访问错误
三、完整修正后的代码
import numpy as np # 初始棋盘状态 positionOfCheckers = np.array([ [0, 2, 0, 2, 0, 2, 0, 2], [2, 0, 2, 0, 2, 0, 2, 0], [0, 2, 0, 2, 0, 2, 0, 2], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0]]) # 打印当前棋盘 def printCheckerBoard(position_of_checkers): posArrayX = 0 posArrayY = 0 checkerBoard = ' 0 1 2 3 4 5 6 7\n0' for x in range(64): currentPiece = position_of_checkers[posArrayY, posArrayX] if currentPiece == 1: checkerBoard += " O " elif currentPiece == 2: checkerBoard += " o " else: checkerBoard += " " if posArrayX == 7: posArrayX = 0 posArrayY += 1 if posArrayY <=7: # 避免最后一行多打印无效行号 checkerBoard += '\n' + str(posArrayY) else: posArrayX += 1 return checkerBoard # 玩家1(棋子1)移动逻辑 def tmialu(): movePieceX = int(input('输入棋子的X坐标:')) movePieceY = int(input('输入棋子的Y坐标:')) movePlaceX = int(input('输入目标位置的X坐标:')) movePlaceY = int(input('输入目标位置的Y坐标:')) # 选中的是玩家1的棋子 if positionOfCheckers[movePieceY, movePieceX] == 1: # 目标位置为空 if positionOfCheckers[movePlaceY, movePlaceX] == 0: # 向上左移动(X减1,Y减1) if (movePieceX - movePlaceX == 1) and (movePieceY - movePlaceY == 1): print('移动条件满足') positionOfCheckers[movePieceY, movePieceX] = 0 positionOfCheckers[movePlaceY, movePlaceX] = 1 # 向上右移动(X加1,Y减1) elif (movePlaceX - movePieceX == 1) and (movePieceY - movePlaceY == 1): print('移动条件满足') positionOfCheckers[movePieceY, movePieceX] = 0 positionOfCheckers[movePlaceY, movePlaceX] = 1 # 目标位置是敌方棋子(可吃子) elif positionOfCheckers[movePlaceY, movePlaceX] == 2: # 吃子后向上左跳 if (movePieceX - movePlaceX == 1) and (movePieceY - movePlaceY == 1): jump_y = movePlaceY - 1 jump_x = movePlaceX - 1 if 0 <= jump_y <8 and 0<= jump_x <8 and positionOfCheckers[jump_y, jump_x] ==0: print('吃子条件满足') positionOfCheckers[movePieceY, movePieceX] =0 positionOfCheckers[movePlaceY, movePlaceX] =0 positionOfCheckers[jump_y, jump_x] =1 # 吃子后向上右跳 elif (movePlaceX - movePieceX ==1) and (movePieceY - movePlaceY ==1): jump_y = movePlaceY -1 jump_x = movePlaceX +1 if 0 <= jump_y <8 and 0<= jump_x <8 and positionOfCheckers[jump_y, jump_x] ==0: print('吃子条件满足') positionOfCheckers[movePieceY, movePieceX] =0 positionOfCheckers[movePlaceY, movePlaceX] =0 positionOfCheckers[jump_y, jump_x] =1 return positionOfCheckers # 玩家2(棋子2)移动逻辑 def tmiall(): movePieceX = int(input('输入棋子的X坐标:')) movePieceY = int(input('输入棋子的Y坐标:')) movePlaceX = int(input('输入目标位置的X坐标:')) movePlaceY = int(input('输入目标位置的Y坐标:')) # 选中的是玩家2的棋子 if positionOfCheckers[movePieceY, movePieceX] == 2: # 目标位置为空 if positionOfCheckers[movePlaceY, movePlaceX] == 0: # 向下左移动(X减1,Y加1) if (movePieceX - movePlaceX ==1) and (movePlaceY - movePieceY ==1): print('移动条件满足') positionOfCheckers[movePieceY, movePieceX] =0 positionOfCheckers[movePlaceY, movePlaceX] =2 # 向下右移动(X加1,Y加1) elif (movePlaceX - movePieceX ==1) and (movePlaceY - movePieceY ==1): print('移动条件满足') positionOfCheckers[movePieceY, movePieceX] =0 positionOfCheckers[movePlaceY, movePlaceX] =2 # 目标位置是敌方棋子(可吃子) elif positionOfCheckers[movePlaceY, movePlaceX] ==1: # 吃子后向下左跳 if (movePieceX - movePlaceX ==1) and (movePlaceY - movePieceY ==1): jump_y = movePlaceY +1 jump_x = movePlaceX -1 if 0 <= jump_y <8 and 0<= jump_x <8 and positionOfCheckers[jump_y, jump_x] ==0: print('吃子条件满足') positionOfCheckers[movePieceY, movePieceX] =0 positionOfCheckers[movePlaceY, movePlaceX] =0 positionOfCheckers[jump_y, jump_x] =2 # 吃子后向下右跳 elif (movePlaceX - movePieceX ==1) and (movePlaceY - movePieceY ==1): jump_y = movePlaceY +1 jump_x = movePlaceX +1 if 0 <= jump_y <8 and 0<= jump_x <8 and positionOfCheckers[jump_y, jump_x] ==0: print('吃子条件满足') positionOfCheckers[movePieceY, movePieceX] =0 positionOfCheckers[movePlaceY, movePlaceX] =0 positionOfCheckers[jump_y, jump_x] =2 return positionOfCheckers # 胜负检测函数 def check_win(board): has_player1 = np.any(board ==1) has_player2 = np.any(board ==2) if not has_player1: print("玩家2获胜!") return True if not has_player2: print("玩家1获胜!") return True return False # 主游戏循环 while True: tmialu() print(printCheckerBoard(positionOfCheckers)) if check_win(positionOfCheckers): break tmiall() print(printCheckerBoard(positionOfCheckers)) if check_win(positionOfCheckers): break
四、代码说明
- 胜负检测函数
check_win:使用np.any()快速判断数组中是否存在指定值,一旦某方棋子全部消失,打印获胜信息并返回True触发循环退出 - 主循环优化:每次玩家移动后立即检测胜负,若已分出胜负则直接退出游戏
- 边界检查:新增跳步后的坐标边界判断,避免数组越界访问
- 交互提示汉化:将输入提示改为中文,提升易用性
内容的提问来源于stack exchange,提问作者GWBrickner
相关产品推荐
相关产品推荐

