我正在使用 ncurses 库开发双陆棋游戏。目前,我正在处理在棋盘上设置棋子的问题。我的想法是将两个 c 风格的字符串传递给 print_pawns():第一个字符串告诉谁占据了场地,第二个字符串告诉了场地上有多少个棋子。由于酒吧的原因,我将 print_pawns() 分成四等分。现在,前两个循环 (13<=i<=24) work properly, but the other two delete everything beside first three lines of the board. It looks like I'm overwriting some part of the board, but I can't find it.
#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;
}
我尝试了基本的调试 - 打印出 k 和 j 的值,但循环不显示它。我也多次重新检查循环中的值,但找不到问题。我认为也许打印循环的顺序是问题所在,但是反转迭代和更改顺序并没有改变任何东西。
编辑 我将此函数和结构实例移至 board()。现在它显示整个板,但根本不打印下部。当我尝试移动它的输出时,有空格而不是“-”,因此它打印出空列。
你有两个标志错误。在最后两个
for
循环中,您应该减去 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;
}