diff options
author | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2005-08-08 22:00:40 +0800 |
---|---|---|
committer | kcwu <kcwu@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2005-08-08 22:00:40 +0800 |
commit | 72fa46586658fa5a7e797e66167583b17cb5a858 (patch) | |
tree | 94f45384e659aa3d8cf2d7722b997f8ad7ab5252 /mbbsd | |
parent | c0ffbd8f8c761ca8a86b463686c8a54202ddc2b9 (diff) | |
download | pttbbs-72fa46586658fa5a7e797e66167583b17cb5a858.tar pttbbs-72fa46586658fa5a7e797e66167583b17cb5a858.tar.gz pttbbs-72fa46586658fa5a7e797e66167583b17cb5a858.tar.bz2 pttbbs-72fa46586658fa5a7e797e66167583b17cb5a858.tar.lz pttbbs-72fa46586658fa5a7e797e66167583b17cb5a858.tar.xz pttbbs-72fa46586658fa5a7e797e66167583b17cb5a858.tar.zst pttbbs-72fa46586658fa5a7e797e66167583b17cb5a858.zip |
fix chess internal coordinate.
!! NOTE !!, not compatible with older revision.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3009 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd')
-rw-r--r-- | mbbsd/chc.c | 182 | ||||
-rw-r--r-- | mbbsd/chess.c | 30 |
2 files changed, 111 insertions, 101 deletions
diff --git a/mbbsd/chc.c b/mbbsd/chc.c index 21f536f5..1b9a01d1 100644 --- a/mbbsd/chc.c +++ b/mbbsd/chc.c @@ -42,7 +42,7 @@ static void chc_init_board(const ChessInfo* info, board_t board); static void chc_drawline(const ChessInfo* info, int line); static void chc_movecur(int r, int c); static void chc_prepare_play(ChessInfo* info); -static int chc_select(ChessInfo* info, rc_t location, ChessGameResult* result); +static int chc_select(ChessInfo* info, rc_t scrloc, ChessGameResult* result); static void chc_prepare_step(ChessInfo* info, const void* step); static int chc_movechess(board_t board, const drc_t* move); static void chc_drawstep(ChessInfo* info, const drc_t* move); @@ -99,7 +99,7 @@ static char * const hint_str[] = { static const ChessActions chc_actions = { &chc_init_user, - (void (*) (const ChessInfo*, void*)) &chc_init_board, + (void (*) (void*)) &chc_init_board, &chc_drawline, &chc_movecur, &chc_prepare_play, @@ -136,7 +136,7 @@ chc_movecur(int r, int c) } static char * -getstep(board_t board, int my, const rc_t *from, const rc_t *to, char buf[]) +getstep(board_t board, const rc_t *from, const rc_t *to, char buf[]) { int turn, fc, tc; char *dir; @@ -154,8 +154,8 @@ getstep(board_t board, int my, const rc_t *from, const rc_t *to, char buf[]) } } } - fc = (turn == (my ^ 1) ? from->c + 1 : 9 - from->c); - tc = (turn == (my ^ 1) ? to->c + 1 : 9 - to->c); + fc = (turn == BLK ? from->c + 1 : 9 - from->c); + tc = (turn == BLK ? to->c + 1 : 9 - to->c); if (from->r == to->r) dir = "平"; else { @@ -164,8 +164,8 @@ getstep(board_t board, int my, const rc_t *from, const rc_t *to, char buf[]) if (tc < 0) tc = -tc; - if ((turn == (my ^ 1) && to->r > from->r) || - (turn == my && to->r < from->r)) + if ((turn == BLK && to->r > from->r) || + (turn == RED && to->r < from->r)) dir = "進"; else dir = "退"; @@ -176,7 +176,7 @@ getstep(board_t board, int my, const rc_t *from, const rc_t *to, char buf[]) /* 傌二|前傌 */ if(twin) { len+=sprintf(buf+len, "%s%s", - ((from->r>twin_r)==(turn==(my^1)))?"前":"後", + ((from->r>twin_r)==(turn==(BLK)))?"前":"後", chess_str[turn][CHE_P(board[from->r][from->c])]); } else { len+=sprintf(buf+len, "%s%s", @@ -218,8 +218,14 @@ chc_drawline(const ChessInfo* info, int line) if (line == CHESS_DRAWING_TURN_ROW) line = info->photo ? PHOTO_TURN_ROW : REAL_TURN_ROW; else if (line == CHESS_DRAWING_TIME_ROW) { - chc_drawline(info, info->photo ? PHOTO_TIME_ROW1 : REAL_TIME_ROW1); - line = info->photo ? PHOTO_TIME_ROW2 : REAL_TIME_ROW2; + if(info->photo) { + chc_drawline(info, PHOTO_TIME_ROW1); + chc_drawline(info, PHOTO_TIME_ROW2); + } else { + chc_drawline(info, REAL_TIME_ROW1); + chc_drawline(info, REAL_TIME_ROW2); + } + return; } else if (line == CHESS_DRAWING_WARN_ROW) line = info->photo ? PHOTO_WARN_ROW : REAL_WARN_ROW; else if (line == CHESS_DRAWING_STEP_ROW) @@ -235,10 +241,10 @@ chc_drawline(const ChessInfo* info, int line) } else if (line >= 3 && line <= 21) { outs(" "); for (i = 0; i < 9; i++) { - j = board[RTL(line)][i]; + j = board[RTL(info->myturn,line)][CTL(info->myturn,i)]; if ((line & 1) == 1 && j) { if (tag->selected && - tag->select.r == RTL(line) && tag->select.c == i) { + tag->select.r == RTL(info->myturn,line) && tag->select.c == CTL(info->myturn,i)) { prints("%s%s" ANSI_RESET, CHE_O(j) == BLK ? BLACK_REVERSE : RED_REVERSE, chess_str[CHE_O(j)][CHE_P(j)]); @@ -274,7 +280,7 @@ chc_drawline(const ChessInfo* info, int line) if (line == PHOTO_TURN_ROW) prints("%s%s" ANSI_RESET, TURN_COLOR, - info->my == info->turn ? "輪到你下棋了" : "等待對方下棋"); + info->myturn == info->turn ? "輪到你下棋了" : "等待對方下棋"); else if (line == PHOTO_TIME_ROW1) { if (info->mode == CHESS_MODE_WATCH) { if (!info->timelimit) @@ -317,12 +323,12 @@ chc_drawline(const ChessInfo* info, int line) outs(hint_str[line - 3]); } else if (line == SIDE_ROW) { prints(ANSI_COLOR(1) "你是%s%s" ANSI_RESET, - turn_color[(int) info->my], - turn_str[(int) info->my]); + turn_color[(int) info->myturn], + turn_str[(int) info->myturn]); } else if (line == REAL_TURN_ROW) { prints("%s%s" ANSI_RESET, TURN_COLOR, - info->my == info->turn ? "輪到你下棋了" : "等待對方下棋"); + info->myturn == info->turn ? "輪到你下棋了" : "等待對方下棋"); } else if (line == STEP_ROW && info->last_movestr) { showstep(info); } else if (line == REAL_TIME_ROW1) { @@ -369,11 +375,11 @@ chc_drawline(const ChessInfo* info, int line) * Start of the log function. */ void -chc_log_step(FILE* fp, board_t board, int my, const drc_t *step) +chc_log_step(FILE* fp, board_t board, const drc_t *step) { char buf[80]; buf[0] = buf[1] = ' '; - getstep(board, my, &step->from, &step->to, buf + 2); + getstep(board, &step->from, &step->to, buf + 2); fputs(buf, fp); fputc('\n', fp); } @@ -424,7 +430,7 @@ chc_genlog(ChessInfo* info, FILE* fp, ChessGameResult result) board_t board; int i; - if (info->my == RED) + if (info->myturn == RED) fprintf(fp, "%s V.S. %s\n", info->user1.userid, info->user2.userid); else fprintf(fp, "%s V.S. %s\n", info->user2.userid, info->user1.userid); @@ -432,7 +438,7 @@ chc_genlog(ChessInfo* info, FILE* fp, ChessGameResult result) chc_init_board(info, board); for (i = 0; i < nStep; ++i) { const drc_t *move = (const drc_t*) ChessHistoryRetrieve(info, i); - chc_log_step(fp, board, info->my, move); + chc_log_step(fp, board, move); chc_movechess(board, move); } @@ -440,7 +446,7 @@ chc_genlog(ChessInfo* info, FILE* fp, ChessGameResult result) fprintf(fp, "=> 和局\n"); else if (result == CHESS_RESULT_WIN || result == CHESS_RESULT_LOST) fprintf(fp, "=> %s 勝\n", - (info->my == RED) == (result== CHESS_RESULT_WIN) ? + (info->myturn == RED) == (result== CHESS_RESULT_WIN) ? "紅" : "黑"); fputs("\n--\n\n", fp); @@ -458,33 +464,31 @@ chc_genlog(ChessInfo* info, FILE* fp, ChessGameResult result) static void chc_init_board(const ChessInfo* info, board_t board) { - const int my = info->my; - memset(board, 0, sizeof(board_t)); - board[0][4] = CHE(KIND_K, my ^ 1); /* 將 */ - board[0][3] = board[0][5] = CHE(KIND_A, my ^ 1); /* 士 */ - board[0][2] = board[0][6] = CHE(KIND_E, my ^ 1); /* 象 */ - board[0][0] = board[0][8] = CHE(KIND_R, my ^ 1); /* 車 */ - board[0][1] = board[0][7] = CHE(KIND_H, my ^ 1); /* 馬 */ - board[2][1] = board[2][7] = CHE(KIND_C, my ^ 1); /* 包 */ + board[0][4] = CHE(KIND_K, BLK); /* 將 */ + board[0][3] = board[0][5] = CHE(KIND_A, BLK); /* 士 */ + board[0][2] = board[0][6] = CHE(KIND_E, BLK); /* 象 */ + board[0][0] = board[0][8] = CHE(KIND_R, BLK); /* 車 */ + board[0][1] = board[0][7] = CHE(KIND_H, BLK); /* 馬 */ + board[2][1] = board[2][7] = CHE(KIND_C, BLK); /* 包 */ board[3][0] = board[3][2] = board[3][4] = - board[3][6] = board[3][8] = CHE(KIND_P, my ^ 1); /* 卒 */ - - board[9][4] = CHE(KIND_K, my); /* 帥 */ - board[9][3] = board[9][5] = CHE(KIND_A, my); /* 仕 */ - board[9][2] = board[9][6] = CHE(KIND_E, my); /* 相 */ - board[9][0] = board[9][8] = CHE(KIND_R, my); /* 車 */ - board[9][1] = board[9][7] = CHE(KIND_H, my); /* 傌 */ - board[7][1] = board[7][7] = CHE(KIND_C, my); /* 炮 */ + board[3][6] = board[3][8] = CHE(KIND_P, BLK); /* 卒 */ + + board[9][4] = CHE(KIND_K, RED); /* 帥 */ + board[9][3] = board[9][5] = CHE(KIND_A, RED); /* 仕 */ + board[9][2] = board[9][6] = CHE(KIND_E, RED); /* 相 */ + board[9][0] = board[9][8] = CHE(KIND_R, RED); /* 車 */ + board[9][1] = board[9][7] = CHE(KIND_H, RED); /* 傌 */ + board[7][1] = board[7][7] = CHE(KIND_C, RED); /* 炮 */ board[6][0] = board[6][2] = board[6][4] = - board[6][6] = board[6][8] = CHE(KIND_P, my); /* 兵 */ + board[6][6] = board[6][8] = CHE(KIND_P, RED); /* 兵 */ } static void chc_prepare_step(ChessInfo* info, const void* step) { const drc_t* move = (const drc_t*) step; - getstep((board_p) info->board, info->my, + getstep((board_p) info->board, &move->from, &move->to, info->last_movestr); } @@ -502,8 +506,8 @@ chc_movechess(board_t board, const drc_t* move) static void chc_drawstep(ChessInfo* info, const drc_t* move) { - info->actions->drawline(info, LTR(move->from.r)); - info->actions->drawline(info, LTR(move->to.r)); + info->actions->drawline(info, LTR(info->myturn, move->from.r)); + info->actions->drawline(info, LTR(info->myturn, move->to.r)); } /* 求兩座標行或列(rowcol)的距離 */ @@ -539,11 +543,18 @@ between(board_t board, rc_t from, rc_t to, int rowcol) } static int -chc_canmove(board_t board, int my, rc_t from, rc_t to) +chc_canmove(board_t board, rc_t from, rc_t to) { int i; int rd, cd, turn; + if(0 || + !(0<=from.r && from.r<BRD_ROW) || + !(0<=from.c && from.c<BRD_COL) || + !(0<=to.r && to.r<BRD_ROW) || + !(0<=to.c && to.c<BRD_COL)) + return 0; + rd = dist(from, to, 0); cd = dist(from, to, 1); turn = CHE_O(board[from.r][from.c]); @@ -558,24 +569,24 @@ chc_canmove(board_t board, int my, rc_t from, rc_t to) if (!(rd == 1 && cd == 0) && !(rd == 0 && cd == 1)) return 0; - if ((turn == (my ^ 1) && to.r > 2) || - (turn == my && to.r < 7) || + if ((turn == BLK && to.r > 2) || + (turn == RED && to.r < 7) || to.c < 3 || to.c > 5) return 0; break; case KIND_A: /* 士 仕 */ if (!(rd == 1 && cd == 1)) return 0; - if ((turn == (my ^ 1) && to.r > 2) || - (turn == my && to.r < 7) || + if ((turn == BLK && to.r > 2) || + (turn == RED && to.r < 7) || to.c < 3 || to.c > 5) return 0; break; case KIND_E: /* 象 相 */ if (!(rd == 2 && cd == 2)) return 0; - if ((turn == (my ^ 1) && to.r > 4) || - (turn == my && to.r < 5)) + if ((turn == BLK && to.r > 4) || + (turn == RED && to.r < 5)) return 0; /* 拐象腿 */ if (board[CENTER(from.r, to.r)][CENTER(from.c, to.c)]) @@ -615,12 +626,12 @@ chc_canmove(board_t board, int my, rc_t from, rc_t to) if (!(rd == 1 && cd == 0) && !(rd == 0 && cd == 1)) return 0; - if (((turn == (my ^ 1) && to.r < 5) || - (turn == my && to.r > 4)) && + if (((turn == BLK && to.r < 5) || + (turn == RED && to.r > 4)) && cd != 0) return 0; - if ((turn == (my ^ 1) && to.r < from.r) || - (turn == my && to.r > from.r)) + if ((turn == BLK && to.r < from.r) || + (turn == RED && to.r > from.r)) return 0; break; } @@ -629,11 +640,11 @@ chc_canmove(board_t board, int my, rc_t from, rc_t to) /* 找 turn's king 的座標 */ static void -findking(board_t board, int my, int turn, rc_t * buf) +findking(board_t board, int turn, rc_t * buf) { int i, r, c; - r = (turn == (my ^ 1) ? 0 : 7); + r = (turn == BLK ? 0 : 7); for (i = 0; i < 3; r++, i++) for (c = 3; c < 6; c++) if (CHE_P(board[r][c]) == KIND_K && @@ -645,29 +656,28 @@ findking(board_t board, int my, int turn, rc_t * buf) } static int -chc_iskfk(board_t board, int my) +chc_iskfk(board_t board) { rc_t from, to; - /* the `my' here doesn't matter */ - findking(board, my, BLK, &to); - findking(board, my, RED, &from); + findking(board, BLK, &to); + findking(board, RED, &from); if (from.c == to.c && between(board, from, to, 0) == 0) return 1; return 0; } static int -chc_ischeck(board_t board, int my, int turn) +chc_ischeck(board_t board, int turn) { rc_t from, to; - findking(board, my, turn, &to); + findking(board, turn, &to); for (from.r = 0; from.r < BRD_ROW; from.r++) for (from.c = 0; from.c < BRD_COL; from.c++) if (board[from.r][from.c] && CHE_O(board[from.r][from.c]) != turn) - if (chc_canmove(board, my, from, to)) + if (chc_canmove(board, from, to)) return 1; return 0; } @@ -701,7 +711,7 @@ chc_init_user(const userec_t *userec, ChessUser *user) static void chc_prepare_play(ChessInfo* info) { - if (chc_ischeck((board_p) info->board, info->my, info->turn)) { + if (chc_ischeck((board_p) info->board, info->turn)) { strlcpy(info->warnmsg, ANSI_COLOR(1;31) "將軍!" ANSI_RESET, sizeof(info->warnmsg)); bell(); @@ -709,63 +719,63 @@ chc_prepare_play(ChessInfo* info) info->warnmsg[0] = 0; } -inline static void -chc_reverse(rc_t* coor) -{ - coor->r = BRD_ROW - 1 - coor->r; - coor->c = BRD_COL - 1 - coor->c; -} - static int -chc_select(ChessInfo* info, rc_t location, ChessGameResult* result) +chc_select(ChessInfo* info, rc_t scrloc, ChessGameResult* result) { chc_tag_data_t* tag = (chc_tag_data_t*) info->tag; board_p board = (board_p) info->board; + rc_t loc; assert(tag); + /* transform from screen to internal coordinate */ + if(info->myturn == RED) { + loc = scrloc; + } else { + loc.r = BRD_ROW-scrloc.r-1; + loc.c = BRD_COL-scrloc.c-1; + } + if (!tag->selected) { /* trying to pick something */ - if (board[location.r][location.c] && - CHE_O(board[location.r][location.c]) == info->turn) { + if (board[loc.r][loc.c] && + CHE_O(board[loc.r][loc.c]) == info->turn) { /* they can pick up this */ tag->selected = 1; - tag->select = location; - chc_drawline(info, LTR(location.r)); + tag->select = loc; + chc_drawline(info, LTR(info->myturn, loc.r)); } return 0; - } else if (tag->select.r == location.r && tag->select.c == location.c) { + } else if (tag->select.r == loc.r && tag->select.c == loc.c) { /* cancel selection */ tag->selected = 0; - chc_drawline(info, LTR(location.r)); + chc_drawline(info, LTR(info->myturn, loc.r)); return 0; - } else if (chc_canmove(board, info->my, tag->select, location)) { + } else if (chc_canmove(board, tag->select, loc)) { /* moving the chess */ - drc_t moving = { CHESS_STEP_NORMAL, tag->select, location }; + drc_t moving = { CHESS_STEP_NORMAL, tag->select, loc }; board_t tmpbrd; int valid_step = 1; - if (CHE_P(board[location.r][location.c]) == KIND_K) + if (CHE_P(board[loc.r][loc.c]) == KIND_K) /* 移到對方將帥 */ *result = CHESS_RESULT_WIN; else { memcpy(tmpbrd, board, sizeof(board_t)); chc_movechess(tmpbrd, &moving); - valid_step = !chc_iskfk(tmpbrd, info->my); + valid_step = !chc_iskfk(tmpbrd); } if (valid_step) { - getstep(board, info->my, &moving.from, &moving.to, info->last_movestr); + getstep(board, &moving.from, &moving.to, info->last_movestr); chc_movechess(board, &moving); - chc_drawline(info, LTR(moving.from.r)); - chc_drawline(info, LTR(moving.to.r)); + chc_drawline(info, LTR(info->myturn, moving.from.r)); + chc_drawline(info, LTR(info->myturn, moving.to.r)); ChessHistoryAppend(info, &moving); ChessStepBroadcast(info, &moving); - chc_reverse(&moving.from); - chc_reverse(&moving.to); ChessStepSendOpposite(info, &moving); tag->selected = 0; @@ -867,7 +877,7 @@ chc_gameend(ChessInfo* info, ChessGameResult result) ChessUser* const user2 = &info->user2; if (info->mode == CHESS_MODE_VERSUS) { - if (info->my == RED) { + if (info->myturn == RED) { /* 由紅方作 log. 記的是下棋前的原始分數 */ /* NOTE, 若紅方斷線則無 log */ time_t t = time(NULL); diff --git a/mbbsd/chess.c b/mbbsd/chess.c index 3ff21ab3..f866d4c4 100644 --- a/mbbsd/chess.c +++ b/mbbsd/chess.c @@ -470,7 +470,7 @@ ChessPlayFuncWatch(ChessInfo* info) /* TODO: implement without re-apply all steps */ int current = info->current_step; - info->actions->init_board(info, info->board); + info->actions->init_board(info->board); info->current_step = 0; if (current > 1) @@ -499,7 +499,7 @@ ChessPlayFuncWatch(ChessInfo* info) /* TODO: implement without re-apply all steps */ int current = info->current_step; - info->actions->init_board(info, info->board); + info->actions->init_board(info->board); info->current_step = 0; if (current > 10) @@ -523,7 +523,7 @@ ChessPlayFuncWatch(ChessInfo* info) if (info->current_step == 0) bell(); else { - info->actions->init_board(info, info->board); + info->actions->init_board(info->board); info->current_step = 0; ChessRedraw(info); } @@ -559,7 +559,7 @@ ChessWatchRequest(int sig) node->sock = sock; #define SEND(X) write(sock, &(X), sizeof(X)) - SEND(CurrentPlayingGameInfo->my); + SEND(CurrentPlayingGameInfo->myturn); SEND(CurrentPlayingGameInfo->turn); if (!CurrentPlayingGameInfo->timelimit) @@ -581,7 +581,7 @@ ChessReceiveWatchInfo(ChessInfo* info) { char time_mode; #define RECV(X) read(info->sock, &(X), sizeof(X)) - RECV(info->my); + RECV(info->myturn); RECV(info->turn); RECV(time_mode); @@ -648,7 +648,7 @@ ChessGenLogUser(ChessInfo* info, ChessGameResult result) fclose(fp); strlcpy(log_header.owner, "[楚河漢界]", sizeof(log_header.owner)); - if(info->my == 0) + if(info->myturn == 0) sprintf(log_header.title, "%s V.S. %s", info->user1.userid, info->user2.userid); else @@ -667,7 +667,7 @@ ChessGenLogUser(ChessInfo* info, ChessGameResult result) static void ChessGenLog(ChessInfo* info, ChessGameResult result) { - if (info->mode == CHESS_MODE_VERSUS && info->my == 0 && + if (info->mode == CHESS_MODE_VERSUS && info->myturn == 0 && info->constants->log_board) { ChessGenLogGlobal(info, result); } @@ -994,12 +994,12 @@ ChessPhotoInitial(ChessInfo* info) fclose(fp); sprintf(PHOTO(6), " %s%2.2s棋" ANSI_RESET, - info->constants->turn_color[(int) info->my], - info->constants->turn_str[(int) info->my]); + info->constants->turn_color[(int) info->myturn], + info->constants->turn_str[(int) info->myturn]); strcpy(PHOTO(7), " V.S "); sprintf(PHOTO(8), " %s%2.2s棋" ANSI_RESET, - info->constants->turn_color[info->my ^ 1], - info->constants->turn_str[info->my ^ 1]); + info->constants->turn_color[info->myturn ^ 1], + info->constants->turn_str[info->myturn ^ 1]); getuser(info->user2.userid, &xuser); sethomefile(genbuf, info->user2.userid, "photo_cchess"); @@ -1060,8 +1060,8 @@ ChessInitPlayFunc(ChessInfo* info) { switch (info->mode) { case CHESS_MODE_VERSUS: - info->play_func[(int) info->my] = &ChessPlayFuncMy; - info->play_func[info->my ^ 1] = &ChessPlayFuncHis; + info->play_func[(int) info->myturn] = &ChessPlayFuncMy; + info->play_func[info->myturn ^ 1] = &ChessPlayFuncHis; break; case CHESS_MODE_WATCH: @@ -1095,9 +1095,9 @@ NewChessInfo(const ChessActions* actions, const ChessConstants* constants, info->sock = sock; if (mode == CHESS_MODE_VERSUS) - info->my = currutmp->turn; + info->myturn = currutmp->turn; else if (mode == CHESS_MODE_PERSONAL) - info->my = 1; + info->myturn = 1; else if (mode == CHESS_MODE_WATCH) ChessReceiveWatchInfo(info); |