|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3377 [복사]
아래 코드를 잘 이해 못하겠습니다. 대충 중요한 부분에 주석을 달아주세요
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define NONE 0
#define LEFT 1
#define UP 2
#define RIGHT 3
#define DOWN 4
#define SET 5
#define DRAW -1
#define NONE 0
#define WINO 1
#define WINX 2
#define SETN 0
#define SETO 1
#define SETX 2
int arr[3][3];
int turn=SETO;
int px=2, py=2;
#define CT(x) (x==SETO ? SETX : x==SETX ? SETO : x )
#define CC(x) (x==SETO ? 'O' : x==SETX ? 'X' : ' ' )
#define over(x,y) ( (x<1) || (x>3) || (y<1) || (y>3) )
int chkwin()
{
int i,j,so,sx, dchk=0;
for ( i=0,j,so=0,sx=0 ; i < 3 ; i++,so=0,sx=0)
{
for (j=0 ; j < 3 ; j++ )
{
if(arr[i][j]==SETO) so++;
if(arr[i][j]==SETX) sx++;
}
if(so==3) return WINO;
if(sx==3) return WINX;
}
for ( i=0,j,so=0,sx=0 ; i < 3 ; i++,so=0,sx=0)
{
for (j=0 ; j < 3 ; j++ )
{
if(arr[j][i]==SETO) so++;
if(arr[j][i]==SETX) sx++;
}
if(so==3) return WINO;
if(sx==3) return WINX;
}
for( i=0 ; i<3 ; i++)
{
if(arr[i][i]==SETO) so++;
if(arr[i][i]==SETX) sx++;
}
if(so==3) return WINO;
if(sx==3) return WINX;
so=0,sx=0;
for( i=2, j=0 ; j<3 ; i--, j++ )
{
if(arr[i][j]==SETO) so++;
if(arr[i][j]==SETX) sx++;
}
if(so==3) return WINO;
if(sx==3) return WINX;
so=0,sx=0;
for ( i=0 ; i<3 ; i++ )
for ( j=0 ; j<3 ; j++ )
if(arr[i][j]) dchk++;
if(dchk==9) return DRAW;
return NONE;
}
int inputkey()
{
int t=_getch();
if(t==75) return LEFT;
if(t==72) return UP;
if(t==77) return RIGHT;
if(t==80) return DOWN;
if(t=='A' || t=='a') return SET;
return NULL;
}
void output()
{
system("cls");
for(int i=0,j=0 ; i < 3 ; i++ )
{
for (j=0 ; j < 3 ; j++ )
printf("%c ",CC(arr[j][i]));
if(py-1==i) printf("←");
printf("\n");
}
if(px==1)printf("↑\n");
if(px==2)printf(" ↑\n");
if(px==3)printf(" ↑\n");
printf("방향키:이동, A:놓기. [%c차례]\n",CC(turn));
}
int set()
{
if(arr[px-1][py-1])
return false;
arr[px-1][py-1]=turn;
turn=CT(turn);
return true;
}
int main()
{
int key, tx=px, ty=py;
while(1)
{
output();
if(chkwin()) break;
key = inputkey();
tx=px,ty=py;
if(key==LEFT) px--;
if(key==UP) py--;
if(key==RIGHT) px++;
if(key==DOWN) py++;
if(key==SET) set();
if(over(px,py)) px=tx, py=ty;
}
if(chkwin()>0)
printf("%c의 승리입니다.",CC(chkwin()));
else
printf("무승부입니다.");
printf("종료하겠습니다.\n");
system("pause");
return 0;
} |
Hit : 4606 Date : 2012/04/02 11:18
|