5번만에 끝나니 좀 아쉬워, 좀 더 우려먹으려고 했는데.
이번에 추가한 건 흑,백추가(이게 전부 ㅡ,.ㅡ)
1. 돌 5개 확인 함수 변경하기.
예전엔 돌 하나로도 잘 놀았지만 이젠 흑,백이 추가됐으니 인자 하나를 더 전달해 주어야 해요.
int check(x,y)함수를 변경해줍니다.
[code]
int check(x,y,turn)
{
int px,py;
int count;
//가로
px=x;
py=y;
count=0;
while(px>1 && board[px-2][y] == turn)px-=2;
while(px<=36 && board[px][y] == turn)
{
count++;
px+=2;
}
if(count==5)
{
return 1;
}
//세로
px=x;
py=y;
count=0;
while(py>0 && board[x][py-1]==turn)py--;
while(py<=18 && board[x][py++]==turn)count++;
if(count==5)
{
return 1;
}
//대각선 ↘
px=x;
py=y;
count=0;
while(px > 0 && py > 0 && board[px-2][py-1]==turn)
{
px-=2;
py--;
}
while(px<=36 && py<=18 && board[px][py++] == turn)
{
px+=2;
count++;
}
if(count==5)
{
return 1;
}
//대각선 ↙
px=x;
py=y;
count=0;
while(px < 36 && py > 0 && board[px+2][py-1]==turn)
{
px+=2;
py--;
}
while(px>=0 && py<=18 && board[px][py++] == turn)
{
px-=2;
count++;
}
if(count==5)
{
return 1;
}
return 0;
}
[/code]
2.문자열 "흑","백"도 추가, 흑돌,백돌도 추가
[code]
int turn=1;
char who[3][3]={"","흑","백"};
char stone[3][3]={"","○","●"};
[/code]
3.case ENTER: 부분도 수정
[code]
case ENTER :
if(board[x][y] == 0)
{
board[x][y]=turn;
gotoxy(x,y);
puts(stone[turn]);
if(check(x,y,turn))
{
system("CLS");
printf("%s 승리",who[turn]);
system("PAUSE");
exit(0);
}
turn++;
if(turn==3)
turn=1;
}
break;
[/code]
4.마지막 오목소스
[code]
#include <stdio.h>
#include <windows.h>
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define ENTER 13
int x=0,y=0;
int oldx=0,oldy=0;
int board[38][19];
int turn=1;
char who[3][3]={"","흑","백"};
char stone[3][3]={"","○","●"};
void gotoxy(int, int);
void draw();
void move();
int knock(int,int);
int check(int,int,int);
int main()
{
draw();
while(1)
{
move();
}
system("PAUSE");
return 0;
}
void gotoxy(int x, int y)
{
COORD XY = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), XY);
}
void draw()
{
char a[39][39]=
{
"┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐",
"├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤",
"└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘"
};
int count;
printf("%s\n",a[0]);
for(count=0;count<17;count++)
printf("%s\n",a[1]);
printf("%s",a[2]);
}
void move()
{
char input=0;
input=getch();
switch(input)
{
case UP :
if(y>0)
{
y-=1;
oldy=y+1;
gotoxy(x,y);
puts("⊙");
if(knock(x,oldy))
{
gotoxy(x,oldy);
if(oldy==18)
{
if(x==0)
{
puts("└");
}
if(x==36)
{
puts("┘");
}
else if(x!=0&&x!=36)
{
puts("┴");
}
}
else if(x==0)
{
puts("├");
}
else if(x==36)
{
puts("┤");
}
else
{
puts("┼");
}
}
}
break;
case DOWN :
if(y<18)
{
y+=1;
oldy=y-1;
gotoxy(x,y);
puts("⊙");
if(knock(x,oldy))
{
gotoxy(x,oldy);
if(oldy==0)
{
if(x==0)
{
puts("┌");
}
if(x==36)
{
puts("┐");
}
else if(x!=0&&x!=36)
{
puts("┬");
}
}
else if(x==0)
{
puts("├");
}
else if(x==36)
{
puts("┤");
}
else
{
puts("┼");
}
}
}
break;
case LEFT :
if(x>0)
{
x-=2;
oldx=x+2;
gotoxy(x,y);
puts("⊙");
if(knock(oldx,y))
{
gotoxy(oldx,y);
if(oldx==36)
{
if(y==0)
{
puts("┐");
}
if(y==18)
{
puts("┘");
}
else if(y!=0&&y!=36)
{
puts("┤");
}
}
else if(y==18)
{
puts("┴");
}
else if(y==0)
{
puts("┬");
}
else
{
puts("┼");
}
}
}
break;
case RIGHT :
if(x<36)
{
x+=2;
oldx=x-2;
gotoxy(x,y);
puts("⊙");
if(knock(oldx,y))
{
gotoxy(oldx,y);
if(oldx==0)
{
if(y==0)
{
puts("┌");
}
if(y==18)
{
puts("└");
}
else if(y!=0&&y!=36)
{
puts("├");
}
}
else if(y==18)
{
puts("┴");
}
else if(y==0)
{
puts("┬");
}
else
{
puts("┼");
}
}
}
break;
case ENTER :
if(board[x][y] == 0)
{
board[x][y]=turn;
gotoxy(x,y);
puts(stone[turn]);
if(check(x,y,turn))
{
system("CLS");
printf("%s 승리",who[turn]);
system("PAUSE");
exit(0);
}
turn++;
if(turn==3)
turn=1;
}
break;
}
}
int knock(x,y)
{
gotoxy(x,y);
puts(stone[board[x][y]]);
if(board[x][y]!=0)
return 0;
else
return 1;
}
int check(x,y,turn)
{
int px,py;
int count;
//가로
px=x;
py=y;
count=0;
while(px>1 && board[px-2][y] == turn)px-=2;
while(px<=36 && board[px][y] == turn)
{
count++;
px+=2;
}
if(count==5)
{
return 1;
}
//세로
px=x;
py=y;
count=0;
while(py>0 && board[x][py-1]==turn)py--;
while(py<=18 && board[x][py++]==turn)count++;
if(count==5)
{
return 1;
}
//대각선 ↘
px=x;
py=y;
count=0;
while(px > 0 && py > 0 && board[px-2][py-1]==turn)
{
px-=2;
py--;
}
while(px<=36 && py<=18 && board[px][py++] == turn)
{
px+=2;
count++;
}
if(count==5)
{
return 1;
}
//대각선 ↙
px=x;
py=y;
count=0;
while(px < 36 && py > 0 && board[px+2][py-1]==turn)
{
px+=2;
py--;
}
while(px>=0 && py<=18 && board[px][py++] == turn)
{
px-=2;
count++;
}
if(count==5)
{
return 1;
}
return 0;
}
[/code]
이걸로 끝.
부족한 점이나 질문 있으시면 아래 리플로 ㄱㄱ
오홋! 드디어 최종버전이 출시된 것입니까?
수고하셨습니다. 대단대단...
한번 번외편으로 컴퓨터랑 1:1하는 모드도 만들어보려고 하는 데 엄청 어렵네요. 흐흐흐, 1년 안에는 인공지능까지 만들어야 하는데.....
다 만들고 나니 벌써 개학 ㅇㅅㅇ
자, 가중치를 적용해보는 겁니다. ㅋㅋㅋ
이론이야 쉽지만, 중요한 것은 님의 코드처럼 "실제 만들어진 코드"죠. 수고하셨습니다.
그럼, 전 컨닝... ^^;;;
중복되는 코드가 많아요..
함수로 빼내세요.
그리고 저걸 클래스화 시켜서 OOP로 구현해보시면 좋은 공부가 될 겁니다.
※중복되는 코드가 많으면, 그만큼 코드의 용량이 커지고, 심한 경우 캐시의 용량보다 커지면 캐시 미스로 인한 성능 하락의 요인이 매우 심합니다.
물론 저 오목 루틴 정도야 몇 바이트 안되기 때문에 상관없지만, 나중에 큰 프로그램 만들 때 매우 중요합니다.
그리고 중요한 것.
가독성이 매우 나쁩니다..
※
x+=2;
oldx=x-2;
이거 그냥
oldx = x;
x += 2;
이게 나을 겁니다. 쓸데없는 연산은 안하게 해야죠..
정기님 오랜만에 뵙네요.
고맙습니다.
전에 방명록에 글 써주신 게 백업실수로 다 지워져서 어떡하죠 ㅡ,.ㅜ
이번엔 번외편을 많이 올려야겠어요.(역시......)
2일전 "열혈강의 C++"구입해서 공부하고 있는데 재밌네요. 으흐흐
우와..컴퓨터 언어를 사용할 줄 아시는군요..왠지 호기심이 자주 당깁니다.. 자주 오겠습니다..ㅋㅋ^^
저는 아직 바닥입니다 ㅋㅋ
앞으로 배울 게 너무 많아요 ㅎㅎ
int board[38][19]; 여기서 왜 x값이 2배인지를 잘모르겠어요;;;
그리고 승패의 확인하는 함수int check 여기에서도 x가 모두 2배씩인지 잘모르겠어요';
////
그리고 char who[3][3] , char stone[3][3] 이거 두개가 모두 3x3배열인지두요;; 그냥 [3]배열로 쓰면 안돼는건가용? 궁금궁금~ ㅎㅎ;char a[39][39] 이것두 비슷하게 ;;; 왜그런지;;;쓰는건 a[0]a[1]a[2]이거뿐인데;; 왜 크게 쓰는지 모르겠어요;;
x값이 2배인 이유는 ┌,└,├,⊙ 등 문자들이 a,b,c,1,2,3같은 문자들보다 가로길이가 2배 더 깁니다.
그래서 커서를 이동할 때 가로 2칸씩 옮겨가면서 위 문자들을 출력해야 깨짐없이 나온답니다. ㅎㅎ
char who[3][3]
문자열은 배열에 하나씩 저장됩니다.
만약 cat을 저장하려면 char a[0]=c, char a[1]=a, char a[2]=t, char a[3]=\0 이렇게 됩니다.
널문자까지 4개의 배열을 선언해야하죠. 한글은 영어와 달리 한 글자에 2바이트니까 널문자까지 배열을 3개 선언해야합니다. 그리고 "","흑",'백" 이렇게 3개가 있으니 [3][3]으로 선언해야하죠.
써놓고보니 어렵네요ㅇㅅㅇ.
문자열 공부를 좀만 하시면 금방 이해 되실거여요. 제소스는 워낙 지저분하니 ㅜㅜ
거의 1주일 가량... 책이랑 이거랑 계속 보니깐 소스는 거의 대충.. 이해는 가게 됐어요 ㅎㅎ//
감사해용ㅎㅎ// 질문에도 대답 다 해주시고 ㅎㅎ////
나중에 또 모르는거 있으면 질문할께요 ㅎㅎ/
일딴// 문자열좀 책좀 봐야겠고.. ㅎㅎ.... 완료하면 이젠.. 바둑돌 곗수를 세는거를 집어넣어봐야징 ㅎㅎ///
학교에서 4년전에 한번 배우고;; 한번도 안쓰다가... 할려니깐 정말 몰라서 미치느줄 알았어요 ㅋㅋ/
저번주에 첨시작했을때 printf도 먼지 몰라서 쩔쩔매다가 ㅎㅎ/
이거 소스 보면서 책보면서 이런식으로 공부하니깐 어느정도 보면은 이해할수는 있는것 같아요 ㅎㅎ.
감사해용 ㅎㅎㅎ/
앞으로 자주자주 들러주세요 ^^