/* $Id: go.c,v 2.55 2006/12/15 23:55:20 starfish Exp $ */ #include "bbs.h" static const char *num_str[19] = { "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T" }; static const char *num_str2[19] = { "¢Ï", "¢Ð", "¢Ñ", "¢Ò", "¢Ó", "¢Ô", "¢Õ", "¢Ö", "¢Ø", "¢Ù", "¢Ú", "¢Û", "¢Ü", "¢Ý", "¢Þ", "¢ß", "¢à", "¢á", "¢â" }; static int go_nowx; static int go_nowy; static int go_count; static int boardsize; static int now_side; static int go_board[20][20]; static int ai_board[20][20]; static char log_x[361]; static int log_y[361]; static char user1[20]; static char user2[20]; static int played; static void indigestion(int i) { fprintf(stderr, "ÄY­«¤º¶Ë %d\n", i); } static void go_write_header(FILE * fp) { char *ptr; struct { char author[IDLEN + 1]; char board[IDLEN + 1]; char title[66]; time_t date; /* last post's date */ int number; /* post number */ } postlog; fprintf(fp, "%s %s (%s)\n", str_author1, cuser->userid, cuser->username); memset(&postlog, 0, sizeof(postlog)); strlcpy(postlog.author, cuser->userid, sizeof(postlog.author)); strlcpy(postlog.board, currboard, sizeof(postlog.board)); if (go_count > 1) { snprintf(save_title, sizeof(save_title), "Re: [³ò´Ñ] %s ¹ï %s", user1, user2); } else { snprintf(save_title, sizeof(save_title), "[³ò´Ñ] %s ¹ï %s", user1, user2); } ptr = save_title; strncpy(postlog.title, ptr, 65); postlog.date = now; postlog.number = 1; append_record(".post", (fileheader_t *) & postlog, sizeof(postlog)); save_title[72] = '\0'; fprintf(fp, "¼ÐÃD: %s\n®É¶¡: %s\n", save_title, ctime(&now)); } static void freturn_grid(FILE *fp, int x, int y) { char k[3]; char k2[3]; int placed = 0; strcpy(k, "¢q"); if (boardsize < 12) { if (((x==2 || x==boardsize-3) && (y==2 || y==boardsize-3)) || (x==boardsize/2 && y == boardsize/2)) strcpy(k, "ùá"); } else { if ((x==3 || x==boardsize/2 || x==boardsize-4) && (y==3 || y==boardsize/2 || y==boardsize-4)) strcpy(k, "ùá"); } if (x==0) strcpy(k, "¢u"); if (x==boardsize-1) strcpy(k, "¢t"); if (y==0) strcpy(k, "¢s"); if (y==boardsize-1) strcpy(k, "¢r"); if ((x==0) && (y==0)) strcpy(k, "¢z"); if ((x==boardsize-1) && (y==0)) strcpy(k, "¢{"); if ((x==boardsize-1) && (y==boardsize-1)) strcpy(k, "¢}"); if ((x==0) && (y==boardsize-1)) strcpy(k, "¢|"); if (x == boardsize) { if (y < boardsize) { if (y > boardsize - 10) strcpy(k, " "); else strcpy(k, ""); sprintf(k2, "%d", boardsize - y); strcat(k, k2); } else strcpy(k, " "); } if ((x > boardsize) || (y >= boardsize)) strcpy(k, " "); if (x < boardsize) if (y < boardsize) { placed = 0; if (go_count > 0) if (num_str[x][0] == log_x[go_count - 1]) if (y == log_y[go_count - 1]) { if (go_board[x][y] == 1) fprintf(fp, "¡º"); if (go_board[x][y] == 2) fprintf(fp, "¡»"); placed = 1; } if (placed == 0) { if (go_board[x][y] == 1) fprintf(fp, "¡³"); if (go_board[x][y] == 2) fprintf(fp, "¡´"); } } if (go_board[x][y] == 0) fprintf(fp, "%s", k); return; } static int go_write_file(char *fpath, int *islocal) { FILE *fp = NULL; int aborted = 0; int i; int i2; int j; int k; int log; int go_start; if (!*fpath) { sethomepath(fpath, cuser->userid); strcpy(fpath, tempnam(fpath, "ve_")); } if ((fp = fopen(fpath, "w")) == NULL) { indigestion(5); abort_bbs(0); } go_write_header(fp); for (i=0; i<=20; i++) { if (i<20) { /* ¼g¤J¥ª§¤¼Ð */ if (i boardsize-10) fprintf(fp, " "); fprintf(fp, "%d", boardsize-i); } else { fprintf(fp, " "); } /* ¼g¤J¤U§¤¼Ð */ if (i==boardsize) { for (j=0; j<19; j++) { if (j 80) { go_start = (go_count / 8 * 8) - 72; fprintf(fp, " -(³Ì³»¬°²Ä %d µÛ)---------------", go_start); } else { fprintf(fp, " --------------------------------"); } } if (i==19) fprintf(fp, " --------------------------------"); if ((i>8) && (i<19)) { i2 = i - 9; go_start = 0; if (go_count > 80) go_start = (go_count / 8 * 8) - 72; fprintf(fp, " "); for (k=0; k<8; k++) { log = i2*8+k + go_start; if (log < go_count) { if (log_x[log] == '-') { fprintf(fp, "-- "); } else { fprintf(fp, "%c%d", log_x[log], boardsize-log_y[log]); if (log_y[log]>boardsize - 10) fprintf(fp, " "); fprintf(fp, " "); } } } } fprintf(fp, "\n"); } fclose(fp); return aborted; } void return_grid(int x, int y) { char k[3]; char k2[3]; strcpy(k, "¢q"); if (boardsize < 12) { if (((x==2 || x==boardsize-3) && (y==2 || y==boardsize-3)) || (x==boardsize/2 && y == boardsize/2)) strcpy(k, "ùá"); } else { if ((x==3 || x==boardsize/2 || x==boardsize-4) && (y==3 || y==boardsize/2 || y==boardsize-4)) strcpy(k, "ùá"); } if (x==0) strcpy(k, "¢u"); if (x==boardsize-1) strcpy(k, "¢t"); if (y==0) strcpy(k, "¢s"); if (y==boardsize-1) strcpy(k, "¢r"); if ((x==0) && (y==0)) strcpy(k, "¢z"); if ((x==boardsize-1) && (y==0)) strcpy(k, "¢{"); if ((x==boardsize-1) && (y==boardsize-1)) strcpy(k, "¢}"); if ((x==0) && (y==boardsize-1)) strcpy(k, "¢|"); if (x == boardsize) { if (y < boardsize) { if (y > boardsize - 10) strcpy(k, " "); else strcpy(k, ""); sprintf(k2, "%d", boardsize - y); strcat(k, k2); } else strcpy(k, " "); } if ((x > boardsize) || (y >= boardsize)) strcpy(k, " "); if (x < boardsize) if (y < boardsize) if ((go_board[x][y] > 0) && (go_board[x][y] < 3)) { prints("\033[1;37m"); if (go_count > 0) if (num_str[x][0] == log_x[go_count - 1]) if (y == log_y[go_count - 1]) prints("\033[1;33m"); if (go_board[x][y] == 1) prints("¡³"); if (go_board[x][y] == 2) prints("¡´"); } if (go_board[x][y] == 0) { prints("\033[0m"); prints(k); } return; } static void import_go() { FILE *inf; char buf[256]; char pi[10]; int i; int j; int k; int k2; int cline = 0; int go_start; int dpoint = 0; pi[2] = '\0'; if ((inf = fopen(quote_file, "r"))) { while (fgets(buf, 256, inf) && buf[0] != '\n'); while (fgets(buf, 256, inf)) { if (cline == 0) { pi[0] = buf[0]; pi[1] = buf[1]; pi[2] = '\0'; boardsize = atoi(pi); } if (cline < 19) { for (i = 0; i<19; i++) { pi[0] = buf[2 + i*2]; pi[1] = buf[3 + i*2]; pi[2] = '\0'; trim(pi); go_board[i][cline] = 0; if (strcmp(pi, "¡³")==0 || strcmp(pi, "¡º")==0) go_board[i][cline] = 1; if (strcmp(pi, "¡´")==0 || strcmp(pi, "¡»")==0) go_board[i][cline] = 2; } } if ((cline == 2) || (cline == 3)) { for (dpoint=52; !((buf[dpoint]==' ') || (buf[dpoint]=='\0')); dpoint++); for (j=0; j 8) && (cline < 19)) { go_start = 0; if (go_count > 80) go_start = (go_count / 8 * 8) - 72; for (k=0; k<8; k++) { k2 = (cline - 9) * 8 + k + go_start; if (k2 < go_count) { if (log_x[44 + k*4] == '-') { log_x[k2] = '-'; log_y[k2] = 1; } else { log_x[k2] = buf[44 + k*4]; if (buf[46 + k*4] == ' ') { pi[0] = buf[45 + k*4]; pi[1] = '\0'; } else { pi[0] = buf[45 + k*4]; pi[1] = buf[46 + k*4]; pi[2] = '\0'; } log_y[k2] = boardsize - atoi(pi); } // end check --- } } } cline++; } } } static void new_board() { int i; int j; for (i=0; i<19; i++) for (j=0; j<19; j++) go_board[i][j] = 0; } static void go_movecur() { move(go_nowy + 3, go_nowx*2 + 4); } static void go_drawline(int line) { int i, i2, log, k; int go_start; move(line, 0); clrtoeol(); prints(" "); if (line == 0) { if (played > 1) { prints("ª`·N: §A¦b³o¦¸½s¿è¤¤¤U¤l¦h¹L¤@µÛ"); } else prints("\033[33;44m °Q½×°Ï³ò´Ñ \033[0m"); } if (line == 2) { prints(" "); for (i=0; i<19; i++) { if (i < boardsize) { prints("%s", num_str2[i]); } else prints(" "); } prints(" "); } if ((line >= 3) && (line <=21)) { if (line - 3 < boardsize) { if (line > boardsize - 7) prints(" "); prints("%d", 3 + boardsize - line); } else prints(" "); for (i=0; i<20; i++) return_grid(i, line-3); prints("\033[0m"); } if (line == 4) { prints(" "); if (now_side == 1) { prints("¡÷"); } else prints(" "); if (strcmp(user1, "???")==0) { prints("¶Â¡³¡GINSERT-COIN "); } else prints("¶Â¡³¡G%s ", user1); } if (line == 5) { prints(" "); if (now_side == 2) { prints("¡÷"); } else prints(" "); if (strcmp(user2, "???")==0) { prints("¥Õ¡´¡GINSERT-COIN "); } else prints("¥Õ¡´¡G%s ", user2); } if (line == 7) { prints(" ²Ä %d µÛ", go_count+1); } if (line == 8) { if (now_side == 1) { prints(" ½ü¨ì¶Â¤è¤U¤l"); } else prints(" ½ü¨ì¥Õ¤è¤U¤l"); } if (line==10) { go_start = 0; if (go_count > 80) { go_start = (go_count / 8 * 8) - 72; prints(" -(³Ì³»¬°²Ä %d µÛ)---------------", go_start); } else { prints(" --------------------------------"); } } if (line==21) prints(" --------------------------------"); if ((line>10) && (line<21)) { i2 = line - 11; go_start = 0; if (go_count > 80) go_start = (go_count / 8 * 8) - 72; { prints(" "); for (k=0; k<8; k++) { log = i2*8+k + go_start; if (log < go_count) { if (log_x[log] == '-') { prints("-- "); } else { prints("%c%d", log_x[log], boardsize-log_y[log]); if (log_y[log]>boardsize - 10) prints(" "); prints(" "); } } } } } if (line == 22) { if (go_count == 0) { prints(" «e³]§G¸m: [\033[1;33mM\033[0m] ½Õ¾ã´Ñ½L "); prints("[\033[1;33mA\033[0m] ©ñ¸m¶Â¤l "); prints("[\033[1;33mB\033[0m] ©ñ¸m¥Õ¤l "); prints("[\033[1;33mC\033[0m] ­«³]´Ñ½L "); } } if (line == 23) { prints(" «ö [\033[1;32m2846\033[0m] ¤è¦V±±¨î [" "\033[1;32mP\033[0m] PASS [" "\033[1;32mSPACE\033[0m] "); if (played > 0) { prints("¨M©w¤U¤l "); } else prints("¤U¤l¨Ã¶}©l¹CÀ¸ "); if (played > 0) prints("[\033[1;32mS\033[0m] Àx¦s¨Ã°h¥X "); prints("[\033[1;32mQ\033[0m] ¨ú®ø¨Ã°h¥X" ); } return; } static int kill_go(int x, int y, int c) { int count = 0; if (c==3) c = go_board[x][y]; if (c==0) return 0; if (ai_board[x][y] != 0) return 0; ai_board[x][y] = 1; go_board[x][y] = 0; if (x>0) if (go_board[x-1][y] == c) count = count + kill_go(x-1, y, c); if (x0) if (go_board[x][y-1] == c) count = count + kill_go(x, y-1, c); if (y= boardsize) return 0; if (y >= boardsize) return 0; if (ai_board[x][y] != 0) return 0; ai_board[x][y] = 1; if (go_board[x][y] == 0) return 1; if (go_board[x][y] == c) { ki_pt = ki_pt + ki(x-1, y, c); ki_pt = ki_pt + ki(x+1, y, c); ki_pt = ki_pt + ki(x, y-1, c); ki_pt = ki_pt + ki(x, y+1, c); } return ki_pt; } static int firstki(int x, int y, int c) { int o; int kpp; init_ai(); if (c == 3) c = go_board[x][y]; if (c == 0) return 1; o = go_board[x][y]; go_board[x][y] = c; kpp = ki(x, y, c); go_board[x][y] = o; return kpp; } static void pass(int side) { go_count++; played++; if (side == 1) strcpy(user1, currutmp->userid); if (side == 2) strcpy(user2, currutmp->userid); if (side == 1) { now_side = 2; } else now_side = 1; } static void put_go(int side) { int original; int ki_pt; if (go_board[go_nowx][go_nowy] != 0) return; original = go_board[go_nowx][go_nowy]; go_board[go_nowx][go_nowy] = side; if (go_nowx > 0) if (go_board[go_nowx-1][go_nowy] != side) if (firstki(go_nowx-1, go_nowy, 3) == 0) { init_ai(); kill_go(go_nowx-1,go_nowy,3); }; if (go_nowx < boardsize-1) if (go_board[go_nowx+1][go_nowy] !=side) if (firstki(go_nowx+1, go_nowy, 3) == 0) { init_ai(); kill_go(go_nowx+1,go_nowy,3); }; if (go_nowy > 0) if (go_board[go_nowx][go_nowy-1] !=side) if (firstki(go_nowx, go_nowy-1, 3) == 0) { init_ai(); kill_go(go_nowx,go_nowy-1,3); }; if (go_nowy < boardsize-1) if (go_board[go_nowx][go_nowy+1] !=side) if (firstki(go_nowx, go_nowy+1, 3) == 0) { init_ai(); kill_go(go_nowx,go_nowy+1,3); }; init_ai(); ki_pt = firstki(go_nowx, go_nowy, side); if (ki_pt==0) { go_board[go_nowx][go_nowy] = original; return; } log_x[go_count] = num_str[go_nowx][0]; log_y[go_count] = go_nowy; pass(side); } static void display_go() { int i; for (i=0; i<24; i++) go_drawline(i); /* 19¢z¢s¢s¢s¢s¢s¢s¢s¢s¢s¢s¢s¢s¢s¢s¢s¢s¢s¢{19 18¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t18 ¡÷ ¶Â¡³¡GUserA 17¢u¢q¡³¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t17 ¥Õ¡´¡GUserB 16¢u¢q¢q¡Ï¢q¢q¢q¢q¢q¡Ï¢q¢q¢q¢q¢q¡Ï¢q¢q¢t16 15¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t15 ²Ä 5 µÛ 14¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t14 ½ü¨ì¶Â¤è¤U¤l 13¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t13 12¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t12 11¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t11 ¶Â¤è±o¤l¡G0 10¢u¢q¢q¡Ï¢q¢q¢q¢q¢q¡Ï¢q¢q¢q¢q¢q¡Ï¢q¢q¢t10 ¥Õ¤è±o¤l¡G0 9¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t 9 8¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t 8 7¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t 7 ¶Â¤èpass 0 ¦¸ 6¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t 6 ¥Õ¤èpass 0 ¦¸ 5¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t 5 4¢u¢q¢q¡Ï¢q¢q¢q¢q¢q¡Ï¢q¢q¢q¢q¢q¡Ï¢q¢q¢t 4 3¢u¢q¢q¡´¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¡»¢q¢t 3 ­pÂIªk¡GªÅ¦a´î¦º¤l 2¢u¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢q¢t 2 ¶ÂÅý 0 ¤l¡A¶K 3.5 ¥Ø 1¢|¢r¢r¢r¢r¢r¢r¢r¢r¢r¢r¢r¢r¢r¢r¢r¢r¢r¢} 1 ¢Ï¢Ð¢Ñ¢Ò¢Ó¢Ô¢Õ¢Ö¢Ø¢Ù¢Ú¢Û¢Ü¢Ý¢Þ¢ß¢à¢á¢â*/ } /* ¥Dµ{¦¡¡BÁä½L³B²z */ int vedit_go(char *fpath, int saveheader, int *islocal) { int ch; int exit_flag = 0; boardsize = 19; go_nowx = 0; go_nowy = 0; now_side = 1; go_count = 0; played = 0; new_board(); strcpy(user1, "???"); strcpy(user2, "???"); if (*quote_file) { import_go(); } clear(); display_go(); while (exit_flag == 0) { go_movecur(); oflush(); ch = igetkey(); switch (ch) { case 'M' : case 'm' : if (go_count ==0) { boardsize = boardsize + 2;; if (boardsize > 19) boardsize = 9; display_go(); } break; case KEY_UP : case '8' : go_nowy--; if (go_nowy < 0) go_nowy = boardsize-1; break; case KEY_DOWN : case '2' : go_nowy++; if (go_nowy >= boardsize) go_nowy = 0; break; case KEY_LEFT : case '4' : go_nowx--; if (go_nowx < 0) go_nowx = boardsize-1; break; case KEY_RIGHT : case '6' : go_nowx++; if (go_nowx >= boardsize) go_nowx = 0; break; case ' ' : put_go(now_side); display_go(); break; case 'A': case 'a': if (go_count > 0) break; if (go_board[go_nowx][go_nowy] == 1) { go_board[go_nowx][go_nowy] = 0; } else go_board[go_nowx][go_nowy] = 1; go_drawline(go_nowy + 3); break; case 'B': case 'b': if (go_count > 0) break; if (go_board[go_nowx][go_nowy] == 2) { go_board[go_nowx][go_nowy] = 0; } else go_board[go_nowx][go_nowy] = 2; go_drawline(go_nowy + 3); break; case 'C': case 'c': if (go_count > 0) break; new_board(); display_go(); break; case 'P': case 'p': log_x[go_count] = '-'; log_y[go_count] = 1; pass(now_side); display_go(); break; case 'S': case 's': if (played > 0) { go_write_file(fpath, NULL); return 0; } else { move(0,0); clrtoeol(); prints("§A¥¼¤U´Ñ¤£¯àÀx¦s"); } break; case 'Q': case 'q': exit_flag = 1; return -1; break; } } return -1; }