bool GameState::isDead(){ int totalNum = countBoard(); int count = 0; for(int x = 1; x != board.size(); ++x){ for(int y = 1; y != board[0].size(); ++y) { if(board[y][x]){//如果有子,就看直行跟橫行是否都死了,死的話就是死路 if(board[y][0] < crossOut){ count++; } if(board[0][x] < crossOut){ count++; } if(count == 2){ return true; } } count = 0; } } return false; }
int main(int argc,char** argv) { if(argc < 3) { fprintf(stderr,"error: no input programs\nusage:\nothello PROG1 PROG2\n"); fflush(stderr); exit(EXIT_FAILURE); } else { Board board(DefaultBoard); state_t state = BLACK; bool flag = false; state_t fault = NONE; const char * const PIPENAME = "othello.pipe"; int e = mkfifo(PIPENAME,0666); std::string fault_detail = ""; std::string record; char buf[1024]; char* ret = getcwd(buf,1024); if(ret == nullptr) { std::cout<<"too long path name"<<std::endl; exit(EXIT_FAILURE); } while(1) { auto v = getPuttable(board,state); if(v.empty()) { if(flag) break; else { flag = true; state = invertState(state); continue; } } char* str = (char*)malloc(strlen(argv[state])+11); sprintf(str,"%s > %s",argv[state],PIPENAME); FILE * pp = popen(str,"w"); timeval s,e,d; gettimeofday(&s,NULL); std::string bstr = toStr(board); fprintf(pp,"%c\n%s",(state==BLACK)?'x':'o',bstr.c_str()); printf("%c\n%s\n",(state==BLACK)?'x':'o',bstr.c_str()); FILE * fp = fopen(PIPENAME,"r"); pclose(pp); gettimeofday(&e,NULL); timersub(&e,&s,&d); if(timercmp(&d,&timelimit,>)) { fault = state; fault_detail = "Time Limit Exceeded"; break; } printf("%ldus\n",d.tv_usec); int x,y; fscanf(fp,"%d%d",&x,&y); fclose(fp); if(std::find(v.begin(),v.end(),xyToPos(x,y)) == v.end()) { fault = state; fault_detail = "Wrong Output"; break; } board = put(board,xyToPos(x,y),state); record.append(1,toBase64(x*8+y)); state = invertState(state); flag = false; } printf("--<Game Set>--\n%s\n",toStr(board).c_str()); std::pair<int,int> p; switch(fault) { case NONE: p = countBoard(board); if(p.first > p.second) puts("Winner: Black"); else if(p.first < p.second) puts("Winner: White"); else puts("Draw"); printf("Black: %2d White: %2d\n",p.first,p.second); printf("game record:%s\n",record.c_str()); break; case BLACK: puts("Winner: White"); puts("Black: Foul"); puts(fault_detail.c_str()); break; case WHITE: puts("Winner: Black"); puts("White: Foul"); puts(fault_detail.c_str()); break; default:; } remove(PIPENAME); } return 0; }