diff options
Diffstat (limited to 'mbbsd/chc_play.c')
-rw-r--r-- | mbbsd/chc_play.c | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/mbbsd/chc_play.c b/mbbsd/chc_play.c new file mode 100644 index 00000000..86c17fbc --- /dev/null +++ b/mbbsd/chc_play.c @@ -0,0 +1,277 @@ +/* $Id: chc_play.c,v 1.1 2002/03/07 15:13:48 in2 Exp $ */ +#include <stdio.h> +#include <time.h> +#include <unistd.h> +#include <sys/types.h> +#include <string.h> +#include "config.h" +#include "pttstruct.h" +#include "common.h" +#include "modes.h" +#include "proto.h" + +extern userinfo_t *currutmp; +extern int usernum; + +typedef int (*play_func_t)(int, board_t, board_t); + +static int chc_ipass = 0, chc_hepass = 0; +int chc_lefttime; +int chc_my, chc_turn, chc_selected, chc_firststep; +char chc_warnmsg[64], *chc_mateid; +rc_t chc_from, chc_to, chc_select, chc_cursor; +int chc_hiswin, chc_hislose, chc_histie; + +#define CHC_TIMEOUT 300 +#define SIDE_ROW 10 +#define TURN_ROW 11 +#define STEP_ROW 12 +#define TIME_ROW 13 +#define WARN_ROW 15 +#define MYWIN_ROW 17 +#define HISWIN_ROW 18 + +static int hisplay(int s, board_t board, board_t tmpbrd) { + int start_time; + int endgame = 0, endturn = 0; + + start_time = time(NULL); + while(!endturn) { + chc_lefttime = CHC_TIMEOUT - (time(NULL) - start_time); + if(chc_lefttime < 0) { + chc_lefttime = 0; + + /* to make him break out igetkey() */ + chc_from.r = -2; + chc_sendmove(s); + } + chc_drawline(board, TIME_ROW); + move(1, 0); + oflush(); + switch(igetkey()) { + case 'q': + endgame = 2; + endturn = 1; + break; + case 'p': + if(chc_hepass) { + chc_from.r = -1; + chc_sendmove(s); + endgame = 3; + endturn = 1; + } + break; + case I_OTHERDATA: + if(chc_recvmove(s)) { /* disconnect */ + endturn = 1; + endgame = 1; + } else { + if(chc_from.r == -1) { + chc_hepass = 1; + strcpy(chc_warnmsg, "\033[1;33m要求和局!\033[m"); + chc_drawline(board, WARN_ROW); + } else { + chc_from.r = 9 - chc_from.r, chc_from.c = 8 - chc_from.c; + chc_to.r = 9 - chc_to.r, chc_to.c = 8 - chc_to.c; + chc_cursor = chc_to; + if(CHE_P(board[chc_to.r][chc_to.c]) == 1) + endgame = 2; + endturn = 1; + chc_hepass = 0; + chc_drawline(board, STEP_ROW); + chc_movechess(board); + chc_drawline(board, LTR(chc_from.r)); + chc_drawline(board, LTR(chc_to.r)); + } + } + break; + } + } + return endgame; +} + +static int myplay(int s, board_t board, board_t tmpbrd) { + int ch, start_time; + int endgame = 0, endturn = 0; + + chc_ipass = 0, chc_selected = 0; + start_time = time(NULL); + chc_lefttime = CHC_TIMEOUT - (time(NULL) - start_time); + bell(); + while(!endturn) { + chc_drawline(board, TIME_ROW); + chc_movecur(chc_cursor.r, chc_cursor.c); + oflush(); + ch = igetkey(); + chc_lefttime = CHC_TIMEOUT - (time(NULL) - start_time); + if(chc_lefttime < 0) + ch = 'q'; + switch(ch) { + case I_OTHERDATA: + if(chc_recvmove(s)) { /* disconnect */ + endgame = 1; + endturn = 1; + } else if(chc_from.r == -1 && chc_ipass) { + endgame = 3; + endturn = 1; + } + break; + case KEY_UP: + chc_cursor.r--; + if(chc_cursor.r < 0) + chc_cursor.r = BRD_ROW - 1; + break; + case KEY_DOWN: + chc_cursor.r++; + if(chc_cursor.r >= BRD_ROW) + chc_cursor.r = 0; + break; + case KEY_LEFT: + chc_cursor.c--; + if(chc_cursor.c < 0) + chc_cursor.c = BRD_COL - 1; + break; + case KEY_RIGHT: + chc_cursor.c++; + if(chc_cursor.c >= BRD_COL) + chc_cursor.c = 0; + break; + case 'q': + endgame = 2; + endturn = 1; + break; + case 'p': + chc_ipass = 1; + chc_from.r = -1; + chc_sendmove(s); + strcpy(chc_warnmsg, "\033[1;33m要求和棋!\033[m"); + chc_drawline(board, WARN_ROW); + bell(); + break; + case '\r': + case '\n': + case ' ': + if(chc_selected) { + if(chc_cursor.r == chc_select.r && + chc_cursor.c == chc_select.c) { + chc_selected = 0; + chc_drawline(board, LTR(chc_cursor.r)); + } else if(chc_canmove(board, chc_select, chc_cursor)) { + if(CHE_P(board[chc_cursor.r][chc_cursor.c]) == 1) + endgame = 1; + chc_from = chc_select; + chc_to = chc_cursor; + if(!endgame) { + memcpy(tmpbrd, board, sizeof(board_t)); + chc_movechess(tmpbrd); + } + if(endgame || !chc_iskfk(tmpbrd)) { + chc_drawline(board, STEP_ROW); + chc_movechess(board); + chc_sendmove(s); + chc_selected = 0; + chc_drawline(board, LTR(chc_from.r)); + chc_drawline(board, LTR(chc_to.r)); + endturn = 1; + } else { + strcpy(chc_warnmsg, "\033[1;33m不可以王見王\033[m"); + bell(); + chc_drawline(board, WARN_ROW); + } + } + } else if(board[chc_cursor.r][chc_cursor.c] && + CHE_O(board[chc_cursor.r][chc_cursor.c]) == chc_turn) { + chc_selected = 1; + chc_select = chc_cursor; + chc_drawline(board, LTR(chc_cursor.r)); + } + break; + } + } + return endgame; +} + +extern userec_t cuser; + +static void mainloop(int s, board_t board) { + int endgame; + board_t tmpbrd; + play_func_t play_func[2]; + + play_func[chc_my] = myplay; + play_func[chc_my ^ 1] = hisplay; + for(chc_turn = 1, endgame = 0; !endgame; chc_turn ^= 1) { + chc_firststep = 0; + chc_drawline(board, TURN_ROW); + if(chc_ischeck(board, chc_turn)) { + strcpy(chc_warnmsg, "\033[1;31m將軍!\033[m"); + bell(); + } else + chc_warnmsg[0] = 0; + chc_drawline(board, WARN_ROW); + endgame = play_func[chc_turn](s, board, tmpbrd); + } + + if(endgame == 1) { + strcpy(chc_warnmsg, "對方認輸了!"); + cuser.chc_win++; + } else if(endgame == 2) { + strcpy(chc_warnmsg, "你認輸了!"); + cuser.chc_lose++; + } else { + strcpy(chc_warnmsg, "和棋"); + cuser.chc_tie++; + } + cuser.chc_lose--; + passwd_update(usernum, &cuser); + chc_drawline(board, WARN_ROW); + bell(); + oflush(); +} + +extern userec_t xuser; + +static void chc_init(int s, board_t board) { + userinfo_t *my = currutmp; + + setutmpmode(CHC); + clear(); + chc_warnmsg[0] = 0; + chc_my = my->turn; + chc_mateid = my->mateid; + chc_firststep = 1; + chc_init_board(board); + chc_redraw(board); + chc_cursor.r = 9, chc_cursor.c = 0; + add_io(s, 0); + + if(my->turn) chc_recvmove(s); + passwd_query(usernum, &xuser); + cuser.chc_win = xuser.chc_win; + cuser.chc_lose = xuser.chc_lose + 1; + cuser.chc_tie = xuser.chc_tie; + cuser.money = xuser.money; + passwd_update(usernum, &cuser); + + getuser(chc_mateid); + chc_hiswin = xuser.chc_win; + chc_hislose = xuser.chc_lose; + chc_histie = xuser.chc_tie; + + if(!my->turn) { + chc_sendmove(s); + chc_hislose++; + } + + chc_redraw(board); +} + +void chc(int s) { + board_t board; + + chc_init(s, board); + mainloop(s, board); + close(s); + add_io(0, 0); + if(chc_my) pressanykey(); +} |