ちゃんと読み解ける&なるべく行数を少なくを目指してみた。
まだ省ける{}とかあるけど見にくくなるのでキニシナイ。
勝利判定がお気に入りですw
#include
// NONE 0 : ○ 1 : × 2
int board[3][3],turn,i,win;
int main(){
for(turn=-1; turn");
while(!(scanf("%d",&i) && i>0 && --i<9 && !board[i/3][i%3]))scanf("%*[^\n]%*c");
board[i/3][i%3] = turn%2 + 1;
//勝利判定
for(i=0;i<3;++i){
if((board[0][i] & board[1][i] & board[2][i]) || (board[i][0] & board[i][1] & board[i][2]) ) win = turn%2 + 1;
}
if(board[1][1] & ((board[0][0]&board[2][2]) | (board[0][2]&board[2][0])) ) win = turn%2 + 1;
PRINT:
//盤面表示
for(i=0;i<9;++i){
if(!board[i/3][i%3]) printf((i+1)%3 ? "%2d":"%2d\n",i+1);
else printf((i+1)%3 ? "%s":"%s\n",(board[i/3][i%3]&0x1) ? "○" : "×" );
}
}
//勝敗表示
if(!win) printf("引き分けです\n");
else printf("%sの勝ち!\n", (win&0x01) ? "○" : "×");
return 0;
}