如何用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; }
关键改动说明
- 新增
countPieces函数:通过嵌套for循环遍历整个棋盘,统计指定字符('B'或'R')的出现次数,这就是你需要的核心计数逻辑。 - 简化
gamePiece函数:不再接收固定的棋子数量参数,而是调用countPieces获取实时数据并打印,确保每次显示的都是棋盘当前的真实状态。 - 修复玩家编号初始化问题:main函数中给
player1和player2赋值为1和2,避免打印出随机值。 - 模拟棋子被吃掉的场景:示例中修改了棋盘的一个位置,调用
gamePiece后就能看到计数自动递减,验证功能有效。
额外优化建议
如果想彻底移除全局棋盘变量,可以将board改为在main中定义,然后通过指针传递给printBoard、countPieces等函数,例如:
void printBoard(char (*board)[8]) { // 函数体逻辑不变,board作为参数传入 } int countPieces(char (*board)[8], char target) { // 函数体逻辑不变,board和target作为参数传入 }
这样完全符合不使用全局变量的要求。
内容的提问来源于stack exchange,提问作者Dustin Minrod
相关产品推荐
相关产品推荐

