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

如何检测Numpy数组中指定值以实现跳棋获胜判定?

跳棋游戏获胜判定逻辑实现及代码修正

一、核心获胜判定逻辑

利用numpy的数组快速检索能力,通过检测棋盘上是否还存在某一方棋子来判定胜负:

  • 检查数组中是否存在1:判断玩家2的对手(玩家1)是否还有剩余棋子
  • 检查数组中是否存在2:判断玩家1的对手(玩家2)是否还有剩余棋子
    只要其中一方棋子全部消失,另一方即获胜。

二、原代码的关键问题修正

  1. 逻辑运算符错误:原代码用&(位运算)代替and(逻辑与),导致移动条件判断失效
  2. 坐标判断笔误:移动逻辑中Y轴条件写成movePieceY - movePieceY ==1(恒为0),修正为movePieceY - movePlaceY ==1
  3. 函数调用参数缺失:printCheckerBoard()调用时未传入棋盘数组参数
  4. return语句缩进错误:tmiall函数中return缩进错误,导致仅在特定分支才返回棋盘状态
  5. 边界检查缺失:吃子跳步后未判断坐标是否越界,新增边界校验避免数组访问错误

三、完整修正后的代码

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

四、代码说明

  1. 胜负检测函数check_win:使用np.any()快速判断数组中是否存在指定值,一旦某方棋子全部消失,打印获胜信息并返回True触发循环退出
  2. 主循环优化:每次玩家移动后立即检测胜负,若已分出胜负则直接退出游戏
  3. 边界检查:新增跳步后的坐标边界判断,避免数组越界访问
  4. 交互提示汉化:将输入提示改为中文,提升易用性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:03:30