我在和Ncurses图书馆合作五子棋游戏.目前,我正在处理在棋盘上设置棋子的问题.我的 idea 是将两个c样式字符串传递给print_pawns():第一个字符串告诉谁是占用的字段,第二个字符串告诉我们该字段上有多少棋子.我将print_pawns()分成两个季度,因为条形.现在,前两个循环(13<=i<=24)可以正常工作,但另外两个循环会删除除前三行之外的所有内容.看起来我覆盖了黑板的某一部分,但我找不到它.

#include <ncurses.h>
#define BOARD_WIDTH 53
#define BOARD_HEIGHT 19
#define START_X 9
#define START_Y 6
#define CENTER (BOARD_WIDTH/2+START_X)
#define WHITE 'W'
#define RED 'R'
#define EMPTY ' '
#define PAWNS 30
#define FIELDS 24

typedef struct board{
    char pawn_color[FIELDS];
    int pawn_count[FIELDS];
}Board;

typedef struct player{
    char name[50];
    char color;
    int score;
}Player;

void frame(){
    int i;
    mvprintw(BOARD_HEIGHT/2+START_Y, CENTER-1, "BAR");
    for(i=0;i<BOARD_HEIGHT-1;i++){
        mvprintw(i+START_Y, START_X,"|");
        mvprintw(i+START_Y,BOARD_WIDTH+START_X-1,"|");
        mvprintw(i+START_Y,CENTER-2,"|");
        mvprintw(i+START_Y,CENTER+2,"|");
    }
    for(i=0;i<BOARD_WIDTH-1;i++){
        mvprintw(START_Y,i+START_X,"-");
        mvprintw(BOARD_HEIGHT+START_Y-1,i+START_X,"-");
    }
    mvprintw(START_Y,START_X,"+");
    mvprintw(START_Y,BOARD_WIDTH+START_X-1,"+");
    mvprintw(BOARD_HEIGHT+START_Y-1, START_X,"+");
    mvprintw(BOARD_HEIGHT+START_Y-1,BOARD_WIDTH+START_X-1,"+");
}

void lower_numbers(){
    for(int i=12, j=START_X+2; i>6; i--,j+=4){
        mvprintw(START_Y+BOARD_HEIGHT, j,"%d",i);
    }
    for(int i=6, j=CENTER+4; i>0; i--,j+=4){
        mvprintw(START_Y+BOARD_HEIGHT, j,"%d",i);
    }
    
}
void upper_numbers(){
    for(int i=13, j=START_X+2; i<19; i++,j+=4){
        mvprintw(START_Y-1, j,"%d",i);
    }
    for(int i=19, j=CENTER+4; i<25; i++, j+=4){
        mvprintw(START_Y-1, j,"%d", i);
    }
}
void board(){
    initscr();
    mvprintw(0,CENTER-4,"BACKGAMMON");
    mvprintw(2,START_X,"Author: Oskar Wisniewski 198058");
    mvprintw(3,START_X,"Score:  Player1: 0 Player2: 0");
    upper_numbers();
    frame();
    lower_numbers();
    refresh();
}
void print_pawns(Board *board){
    for(int i=13, j=START_X+2; i<=3*FIELDS/4; i++, j+=4){
       for(int k=START_Y+1; k<START_Y+1+board->pawn_count[i-1]; k++){
                mvprintw(k,j,"%c",board->pawn_color[i-1]);
            } 
    } 
    for(int i=19, j=CENTER+4; i<=FIELDS; i++, j+=4){
        for(int k=START_Y+1; k<START_Y+1+board->pawn_count[i-1]; k++){
                mvprintw(k,j,"%c",board->pawn_color[i-1]);
            }
    }
    for(int i=1, j=BOARD_WIDTH+START_X-3; i<=FIELDS/4; i++, j-=4){
            for(int k=BOARD_HEIGHT+START_Y-2; k>BOARD_HEIGHT+START_Y-2+board->pawn_count[i-1]; k--){
                mvprintw(k,j,"%c",board->pawn_color[i-1]);
            }
    }
    for(int i=7, j=CENTER-4; i<=FIELDS/2; i++, j-=4){
            for(int k=BOARD_HEIGHT+START_Y-2; k>BOARD_HEIGHT+START_Y-2+board->pawn_count[i-1]; k--){
                mvprintw(k,j,"%c",board->pawn_color[i-1]);
            }
    } 
    
}

int main(){
    board();
    Board board={
        .pawn_color={WHITE, EMPTY, EMPTY, EMPTY, EMPTY, RED, EMPTY, RED, EMPTY, EMPTY, EMPTY, WHITE, RED, EMPTY, EMPTY, EMPTY, WHITE, EMPTY, WHITE, EMPTY, EMPTY,EMPTY, EMPTY, RED},
        .pawn_count={2,0,0,0,0,5,0,3,0,0,0,5,5,0,0,0,3,0,5,0,0,0,0,2}
    };
    print_pawns(&board);
    refresh();
    return 0;
}

我try 了基本调试--打印出k和j的值,但循环不显示它.我还多次重新判断循环中的值,也没有发现问题.我想也许打印出循环的顺序才是问题所在,但反转迭代和更改顺序并没有改变任何事情.

EDIT个 我将此函数和 struct 实例移动到board().现在它显示整个电路板,但根本不打印下半部分.当我try 移动它的输出时,出现的是空格而不是‘-’,因此它打印出空列.

推荐答案

你搞错了两个标志.在print_pawn的最后两个for循环中,你应该减go board->pawn_count. 下面是完成的固定代码:

#include <ncurses.h>
#include <unistd.h>
#define BOARD_WIDTH 53
#define BOARD_HEIGHT 19
#define START_X 9
#define START_Y 6
#define CENTER (BOARD_WIDTH/2+START_X)
#define WHITE 'W'
#define RED 'R'
#define EMPTY ' '
#define PAWNS 30
#define FIELDS 24

typedef struct board{
    char pawn_color[FIELDS];
    int pawn_count[FIELDS];
}Board;

typedef struct player{
    char name[50];
    char color;
    int score;
}Player;

void frame(){
    int i;
    mvprintw(BOARD_HEIGHT/2+START_Y, CENTER-1, "BAR");
    for(i=0;i<BOARD_HEIGHT-1;i++){
        mvprintw(i+START_Y, START_X,"|");
        mvprintw(i+START_Y,BOARD_WIDTH+START_X-1,"|");
        mvprintw(i+START_Y,CENTER-2,"|");
        mvprintw(i+START_Y,CENTER+2,"|");
    }
    for(i=0;i<BOARD_WIDTH-1;i++){
        mvprintw(START_Y,i+START_X,"-");
        mvprintw(BOARD_HEIGHT+START_Y-1,i+START_X,"-");
    }
    mvprintw(START_Y,START_X,"+");
    mvprintw(START_Y,BOARD_WIDTH+START_X-1,"+");
    mvprintw(BOARD_HEIGHT+START_Y-1, START_X,"+");
    mvprintw(BOARD_HEIGHT+START_Y-1,BOARD_WIDTH+START_X-1,"+");
}

void lower_numbers(){
    for(int i=12, j=START_X+2; i>6; i--,j+=4){
        mvprintw(START_Y+BOARD_HEIGHT, j,"%d",i);
    }
    for(int i=6, j=CENTER+4; i>0; i--,j+=4){
        mvprintw(START_Y+BOARD_HEIGHT, j,"%d",i);
    }
    
}
void upper_numbers(){
    for(int i=13, j=START_X+2; i<19; i++,j+=4){
        mvprintw(START_Y-1, j,"%d",i);
    }
    for(int i=19, j=CENTER+4; i<25; i++, j+=4){
        mvprintw(START_Y-1, j,"%d", i);
    }
}
void board(){
    initscr();
    mvprintw(0,CENTER-4,"BACKGAMMON");
    mvprintw(2,START_X,"Author: Oskar Wisniewski 198058");
    mvprintw(3,START_X,"Score:  Player1: 0 Player2: 0");
    upper_numbers();
    frame();
    lower_numbers();
    refresh();
}
void print_pawns(Board *board){
    for(int i=13, j=START_X+2; i<=3*FIELDS/4; i++, j+=4){
       for(int k=START_Y+1; k<START_Y+1+board->pawn_count[i-1]; k++){
                mvprintw(k,j,"%c",board->pawn_color[i-1]);
            } 
    } 
    for(int i=19, j=CENTER+4; i<=FIELDS; i++, j+=4){
        for(int k=START_Y+1; k<START_Y+1+board->pawn_count[i-1]; k++){
                mvprintw(k,j,"%c",board->pawn_color[i-1]);
            }
    }
    for(int i=1, j=BOARD_WIDTH+START_X-3; i<=FIELDS/4; i++, j-=4){
            for(int k=BOARD_HEIGHT+START_Y-2; k>BOARD_HEIGHT+START_Y-2-board->pawn_count[i-1]; k--){
                mvprintw(k,j,"%c",board->pawn_color[i-1]);
            }
    }
    for(int i=7, j=CENTER-4; i<=FIELDS/2; i++, j-=4){
            for(int k=BOARD_HEIGHT+START_Y-2; k>BOARD_HEIGHT+START_Y-2-board->pawn_count[i-1]; k--){
                mvprintw(k,j,"%c",board->pawn_color[i-1]);
            }
    } 
}

int main(){
    board();
    Board board={
        .pawn_color={WHITE, EMPTY, EMPTY, EMPTY, EMPTY, RED, EMPTY, RED, EMPTY, EMPTY, EMPTY, WHITE, RED, EMPTY, EMPTY, EMPTY, WHITE, EMPTY, WHITE, EMPTY, EMPTY,EMPTY, EMPTY, RED},
        .pawn_count={2,0,0,0,0,5,0,3,0,0,0,5,5,0,0,0,3,0,5,0,0,0,0,2}
    };
    print_pawns(&board);
    refresh();
    sleep(1);
    return 0;
}

我还在最后增加了一个睡眠,这样我们就可以完整地看到棋盘了.

C++相关问答推荐

根据工具链文件中的定义替换单个函数定义

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

字符串令牌化xpath表达式

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

返回一个包含数组的 struct

如何设置指针指向在函数中初始化的复合文字中的整数?

C中是否有语法可以直接初始化一个常量文本常量数组的 struct 成员?

如何一次获取一个字符

如果我释放其他内容,返回值就会出错

Ruby C Api处理异常

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

当内存来自Malloc时,将char*转换为另一个指针类型是否违反了严格的别名规则?

具有正确标头的C struct 定义问题

为什么我在我的代码中得到错误和退出代码-1073741819(0xC0000005),但如果我添加了一个不相关的打印语句,它仍然有效?

在Ubuntu上使用库部署C程序的最佳实践

如何打印循环调度问题的时间表

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

子进程不会修改父进程中的统计信息