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

如何用C语言for循环实现棋子计数器,统计数组特定字符并更新数量?

解决棋盘游戏棋子实时计数问题

核心方案

放弃手动维护BluePiece和RedPiece变量,改为遍历棋盘实时统计当前剩余棋子数量。这种方式能保证计数与棋盘状态完全同步,避免手动更新计数时出现的不一致问题,同时符合你对全局变量的使用限制。

修改后的完整代码

#include<stdio.h>

char board[8][8] = {
    {'-', 'B', '-', 'B', '-', 'B', '-', 'B'},
    {'B', '-', 'B', '-', 'B', '-', 'B', '-'},
    {'-', 'B', '-', 'B', '-', 'B', '-', 'B'},
    {' ', '-', ' ', '-', ' ', '-', ' ', '-'},
    {'-', ' ', '-', ' ', '-', ' ', '-', ' '},
    {'R', '-', 'R', '-', 'R', '-', 'R', '-'},
    {'-', 'R', '-', 'R', '-', 'R', '-', 'R'},
    {'R', '-', 'R', '-', 'R', '-', 'R', '-'}};

void printBoard()
{
    int i , j , k ; 
    
    printf("\n    "); 
    
    for(i=0;i<8;i++) 
        printf("    %d", i); 
    printf(" \n");
        
    for(k=0;k<8;k++) 
    {
        printf("     ");
        for(i=0;i<42;i++)
        { 
            printf("-"); 
        } 
        printf("  \n");
         
        printf("   %d ", k); 
        for(j=0;j<8;j++) 
        {
            printf("|| %c ", board[k][j]); 
        }
        printf("|| \n");
    }

    printf("     ");
    for(i=0;i<42;i++)
    { 
        printf("-");
    } 
    printf("  \n");
}

// 统计指定颜色的棋子数量
int countPieces(char target) {
    int count = 0;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            if (board[i][j] == target) {
                count++;
            }
        }
    }
    return count;
}

void gamePiece(int player1, int player2)
{
    // 实时获取当前棋子数量
    int blueCount = countPieces('B');
    int redCount = countPieces('R');
       
    printf("\nGame piece counter:");
    printf("\nPlayer %d = %d", player1, blueCount);
    printf("\nPlayer %d = %d", player2, redCount); 
}

int main(){
    int player1 = 1, player2 = 2;
    
    // 初始状态打印计数与棋盘
    gamePiece(player1, player2);
    printBoard();

    // 模拟吃掉一个蓝棋子的场景
    board[0][1] = '-';
    printf("\n--- 吃掉一个蓝棋子后 ---");
    gamePiece(player1, player2);
    printBoard();

    return 0;
}

关键改动说明

  1. 新增countPieces函数:通过嵌套for循环遍历整个棋盘,统计指定字符('B'或'R')的出现次数,这就是你需要的核心计数逻辑。
  2. 简化gamePiece函数:不再接收固定的棋子数量参数,而是调用countPieces获取实时数据并打印,确保每次显示的都是棋盘当前的真实状态。
  3. 修复玩家编号初始化问题:main函数中给player1和player2赋值为1和2,避免打印出随机值。
  4. 模拟棋子被吃掉的场景:示例中修改了棋盘的一个位置,调用gamePiece后就能看到计数自动递减,验证功能有效。

额外优化建议

如果想彻底移除全局棋盘变量,可以将board改为在main中定义,然后通过指针传递给printBoard、countPieces等函数,例如:

void printBoard(char (*board)[8]) {
    // 函数体逻辑不变,board作为参数传入
}

int countPieces(char (*board)[8], char target) {
    // 函数体逻辑不变,board和target作为参数传入
}

这样完全符合不使用全局变量的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:31:02