/* 主程序,控制游戏流程。 */ int main (int argc, char * argv[]) { int put; int in_x,in_y; int judge=0; /*显示欢迎语句,清空并显示棋盘。*/ printf ("Welcome to play!\n"); board_clear(); board_display(); while (1)//主循环,由内部break语句控制退出。或许有更好的处理方式。 { /*用户输入落子坐标*/ scanf("%d",&in_x); scanf("%d",&in_y); printf("your input number is x=%d, y=%d\n",in_x,in_y); /*调用落子函数,由用户落下一子*/ //这里,落子函数接受的有效坐标为0~2,为了照顾人类习惯,人类输入的坐标有效值为1~3,在此转换 board_put(in_x-1,in_y-1,USER); /*用户落子后显示棋盘*/ board_display(); /*判断是否取胜*/ judge=board_judge(); if (judge!=0)//如果取胜,打印并退出 { printf("User %d win!\n",judge); break; } /*有AI计算落子位置*/ put=ai_think(&in_x,&in_y); printf("AI put: x=%d,y=%d\n",in_x,in_y); /*调用落子函数,由AI落下一子*/ board_put(in_x,in_y,AI); /*AI落子后显示棋盘*/ board_display(); /*判断是否取胜*/ judge=board_judge(); if (judge!=0)//如果取胜,打印并退出 { printf("User %d win!\n",judge); break; } } return 0; }
int main(int argc, char **argv) { board *board = board_new(); FILE *f; if (argc < 2 || strcmp(argv[argc-1], "--") == 0) { f = stdin; } else { f = fopen(argv[argc-1], "r"); if (f == NULL) { perror("open"); return 1; } } if (strcmp(argv[1], "-d") == 0 || strcmp(argv[1], "--debug") == 0) debugflag = 1; char c; int x = 0; int y = 0; while ((c = fgetc(f)) != EOF) { if (c == '\n') { y++; x = 0; continue; } else { board_put(board, x, y, c); } if (x > BOARD_WIDTH || y > BOARD_HEIGHT) { fprintf(stderr, "Error: File too large (%i, %i)", x, y); return 1; } x++; } if (f != stdin) { fclose(f); } if (debugflag) { debugstream = tmpfile(); } process(board); if (debugflag) { fclose(debugstream); } return 0; }
void process(board *board) { FILE *out; if (debugflag) out = debugstream; else out = stdout; while (1) { char c = board_get(board, board->pointer->x, board->pointer->y); if (board->pointer->strmode && c != '"') { stack_push(board->pointer->stack, c); } else { switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': stack_push(board->pointer->stack, (char) atoi(&c)); break; case '+': { char a = stack_pop(board->pointer->stack); char b = stack_pop(board->pointer->stack); stack_push(board->pointer->stack, a + b); break; } case '-': { char a = stack_pop(board->pointer->stack); char b = stack_pop(board->pointer->stack); stack_push(board->pointer->stack, b - a); break; } case '*': { char a = stack_pop(board->pointer->stack); char b = stack_pop(board->pointer->stack); stack_push(board->pointer->stack, a * b); break; } case '/': { char a = stack_pop(board->pointer->stack); char b = stack_pop(board->pointer->stack); stack_push(board->pointer->stack, b / a); break; } case '%': { char a = stack_pop(board->pointer->stack); char b = stack_pop(board->pointer->stack); stack_push(board->pointer->stack, b % a); break; } case '!': stack_push(board->pointer->stack, !stack_pop(board->pointer->stack)); break; case '`': { char a = stack_pop(board->pointer->stack); char b = stack_pop(board->pointer->stack); stack_push(board->pointer->stack, (b > a)); break; } case '>': board->pointer->dx = 1; board->pointer->dy = 0; break; case '<': board->pointer->dx = -1; board->pointer->dy = 0; break; case '^': board->pointer->dx = 0; board->pointer->dy = -1; break; case 'v': board->pointer->dx = 0; board->pointer->dy = 1; break; case '?': { srand((unsigned)time(NULL)); int r = rand() % 4; switch (r) { case 0: board->pointer->dx = 1; board->pointer->dy = 0; break; case 1: board->pointer->dx = -1; board->pointer->dy = 0; break; case 2: board->pointer->dx = 0; board->pointer->dy = -1; break; case 3: board->pointer->dx = 0; board->pointer->dy = 1; break; } break; } case '_': { char x = stack_pop(board->pointer->stack); if (x == 0) { board->pointer->dx = 1; board->pointer->dy = 0; } else { board->pointer->dx = -1; board->pointer->dy = 0; } break; } case '|': { char x = stack_pop(board->pointer->stack); if (x == 0) { board->pointer->dx = 0; board->pointer->dy = 1; } else { board->pointer->dx = 0; board->pointer->dy = -1; } break; } case '"': board->pointer->strmode = !board->pointer->strmode; break; case ':': stack_push(board->pointer->stack, stack_peek(board->pointer->stack)); break; case '\\': { char a = stack_pop(board->pointer->stack); char b = stack_pop(board->pointer->stack); stack_push(board->pointer->stack, a); stack_push(board->pointer->stack, b); break; } case '$': stack_pop(board->pointer->stack); break; case '.': fprintf(out, "%i ", stack_pop(board->pointer->stack)); break; case ',': fprintf(out, "%c", stack_pop(board->pointer->stack)); break; case '#': pointer_move(board->pointer); break; case 'p': { int y = stack_pop(board->pointer->stack); int x = stack_pop(board->pointer->stack); char v = stack_pop(board->pointer->stack); board_put(board, x, y, v); break; } case 'g': { int y = stack_pop(board->pointer->stack); int x = stack_pop(board->pointer->stack); stack_push(board->pointer->stack, board_get(board, x, y)); break; } case '&': { int i; scanf("%d", &i); stack_push(board->pointer->stack, (char) i); break; } case '~': stack_push(board->pointer->stack, getchar()); break; case '@': return; } } pointer_move(board->pointer); if (board->pointer->x < 0) { board->pointer->x += BOARD_WIDTH; } if (board->pointer->x >= BOARD_WIDTH) { board->pointer->x -= BOARD_WIDTH; } if (board->pointer->y < 0) { board->pointer->y += BOARD_HEIGHT; } if (board->pointer->y >= BOARD_HEIGHT) { board->pointer->y -= BOARD_HEIGHT; } if (debugflag) { debug(board); } } }