일단 지난 번에 제가 바꿔 놓은 코드에 좀 문제가 있습니다.
누가 이겼는지 안 나오더군요.. 잘 되더니 왜 그러지;;
뭐 좀 바꿨더니 다시 됩니다만.
멋지군요-_-
이번에는 계획을 멋대로 벗어나서 함수를 하나 더 만들어 보겠습니다.
그러면 소스를 이따구로 바꿀 수 있겠죠.
커서가 처음부터 뜹니다.
누가 이겼는지 안 나오더군요.. 잘 되더니 왜 그러지;;
뭐 좀 바꿨더니 다시 됩니다만.
/* five_in_a_row.h * by ZFanta & UNique */ #ifndef FIVE_IN_A_ROW #define FIVE_IN_A_ROW #include "tool.h" #define UP 72 #define DOWN 80 #define LEFT 75 #define RIGHT 77 #define ENTER 13 #define ESC 27 #define BOARD_SIZE 19 int x = 0, y = 0; int oldx = 0, oldy = 0; int board[BOARD_SIZE][BOARD_SIZE]; int turn = 1; char who[3][3] = {"", "흑", "백"}; char stone[3][3] = {"", "○", "●"}; int check(int x, int y, int turn) { int px, py; int count; // 가로로 오목이 있는지 검사 px = x; py = y; count = 0; while(px > 1 && board[px-1][y] == turn) px--; while(px < BOARD_SIZE && board[px][y] == turn) { px++; count++; } if(count == 5) return 1; // 세로로 오목이 있는지 검사 px = x; py = y; count = 0; while(py > 0 && board[x][py-1] == turn) py--; while(py < BOARD_SIZE && board[x][py++] == turn) count++; if(count == 5) return 1; // 좌상우하로 오목이 있는지 검사 px = x; py = y; count = 0; while(px > 0 && py > 0 && board[px-1][py-1] == turn) px--, py--; while(px < BOARD_SIZE && py < BOARD_SIZE && board[px][py++] == turn) { px++; count++; } if(count == 5) return 1; // 우상좌하로 오목이 있는지 검사 px = x; py = y; count = 0; while(px < BOARD_SIZE && py > 0 && board[px+1][py-1] == turn) px++, py--; while(px >= 0 && py < BOARD_SIZE && board[px][py++] == turn) { px--; count++; } if(count == 5) return 1; return 0; } int knock(int x, int y) { if(board[x][y] != 0) { gotoxy(x * 2, y); puts(stone[board[x][y]]); return 0; } else return 1; } void board_write(int x, int y) { x *= 2; gotoxy(x, y); if (x == 0) { if (y == 0) puts("┌"); else if (y == (BOARD_SIZE - 1)) puts("└"); else puts("├"); } else if (x == (BOARD_SIZE - 1) * 2) { if (y == 0) puts("┐"); else if (y == (BOARD_SIZE - 1)) puts("┘"); else puts("┤"); } else { if (y == 0) puts("┬"); else if (y == (BOARD_SIZE - 1)) puts("┴"); else puts("┼"); } } void draw() { int i, j; for (i = 0; i < BOARD_SIZE; i++) for (j = 0; j < BOARD_SIZE; j++) board_write(i, j); } int move() { char input = 0; input = getch(); switch(input) { case UP : if(y > 0) { oldy = y--; gotoxy(x * 2, y); puts("⊙"); if(knock(x, oldy)) board_write(x, oldy); } return 1; break; case DOWN : if(y < BOARD_SIZE - 1) { oldy = y++; gotoxy(x * 2, y); puts("⊙"); if(knock(x, oldy)) board_write(x, oldy); } return 1; break; case LEFT : if(x > 0) { oldx = x--; gotoxy(x * 2, y); puts("⊙"); if(knock(oldx, y)) board_write(oldx, y); } return 1; break; case RIGHT : if(x < BOARD_SIZE - 1) { oldx = x++; gotoxy(x * 2, y); puts("⊙"); if(knock(oldx, y)) board_write(oldx, y); } return 1; break; case ENTER : if(board[x][y] == 0) { board[x][y] = turn; gotoxy(x * 2, y); puts(stone[turn]); if(check(x, y, turn)) { return 0; } turn++; if(turn == 3) turn = 1; } return 1; break; } return 1; } int five_in_a_row() { /* If user wants to re-match, returns 0; or not, returns 1. * (only if one game successfully ended) */ int i, j; system("CLS"); draw(); for (i = 0; i < BOARD_SIZE; i++) for (j = 0; j < BOARD_SIZE; j++) board[i][j] = 0; while (move()); system("CLS"); printf("%s 승리.\n계속하려면 아무 키나 누르십시오(종료 Esc):", who[turn]); if (getch() == ESC) return 1; else return 0; } #endif그나저나 제 VC++에서 갑자기 system(CLS)가 안 먹습니다. 하하하하하....
멋지군요-_-
이번에는 계획을 멋대로 벗어나서 함수를 하나 더 만들어 보겠습니다.
void load(int x, int y) { gotoxy(x * 2, y); puts("⊙"); }
그러면 소스를 이따구로 바꿀 수 있겠죠.
/* five_in_a_row.h * by ZFanta & UNique */ #ifndef FIVE_IN_A_ROW #define FIVE_IN_A_ROW #include "tool.h" #define UP 72 #define DOWN 80 #define LEFT 75 #define RIGHT 77 #define ENTER 13 #define ESC 27 #define BOARD_SIZE 19 int x = 0, y = 0; int oldx = 0, oldy = 0; int board[BOARD_SIZE][BOARD_SIZE]; int turn = 1; char who[3][3] = {"", "흑", "백"}; char stone[3][3] = {"", "○", "●"}; int check(int x, int y, int turn) { int px, py; int count; // 가로로 오목이 있는지 검사 px = x; py = y; count = 0; while(px > 1 && board[px-1][y] == turn) px--; while(px < BOARD_SIZE && board[px][y] == turn) { px++; count++; } if(count == 5) return 1; // 세로로 오목이 있는지 검사 px = x; py = y; count = 0; while(py > 0 && board[x][py-1] == turn) py--; while(py < BOARD_SIZE && board[x][py++] == turn) count++; if(count == 5) return 1; // 좌상우하로 오목이 있는지 검사 px = x; py = y; count = 0; while(px > 0 && py > 0 && board[px-1][py-1] == turn) px--, py--; while(px < BOARD_SIZE && py < BOARD_SIZE && board[px][py++] == turn) { px++; count++; } if(count == 5) return 1; // 우상좌하로 오목이 있는지 검사 px = x; py = y; count = 0; while(px < BOARD_SIZE && py > 0 && board[px+1][py-1] == turn) px++, py--; while(px >= 0 && py < BOARD_SIZE && board[px][py++] == turn) { px--; count++; } if(count == 5) return 1; return 0; } int knock(int x, int y) { if(board[x][y] != 0) { gotoxy(x * 2, y); puts(stone[board[x][y]]); return 0; } else return 1; } void load(int x, int y) { gotoxy(x * 2, y); puts("⊙"); } void board_write(int x, int y) { x *= 2; gotoxy(x, y); if (x == 0) { if (y == 0) puts("┌"); else if (y == (BOARD_SIZE - 1)) puts("└"); else puts("├"); } else if (x == (BOARD_SIZE - 1) * 2) { if (y == 0) puts("┐"); else if (y == (BOARD_SIZE - 1)) puts("┘"); else puts("┤"); } else { if (y == 0) puts("┬"); else if (y == (BOARD_SIZE - 1)) puts("┴"); else puts("┼"); } } void draw() { int i, j; for (i = 0; i < BOARD_SIZE; i++) for (j = 0; j < BOARD_SIZE; j++) board_write(i, j); } int move() { char input = 0; input = getch(); switch(input) { case UP : if(y > 0) { oldy = y--; load(x, y); if(knock(x, oldy)) board_write(x, oldy); } return 1; break; case DOWN : if(y < BOARD_SIZE - 1) { oldy = y++; load(x, y); if(knock(x, oldy)) board_write(x, oldy); } return 1; break; case LEFT : if(x > 0) { oldx = x--; load(x, y); if(knock(oldx, y)) board_write(oldx, y); } return 1; break; case RIGHT : if(x < BOARD_SIZE - 1) { oldx = x++; load(x, y); if(knock(oldx, y)) board_write(oldx, y); } return 1; break; case ENTER : if(board[x][y] == 0) { board[x][y] = turn; gotoxy(x * 2, y); puts(stone[turn]); if(check(x, y, turn)) { return 0; } turn++; if(turn == 3) turn = 1; } return 1; break; } return 1; } int five_in_a_row() { /* If user wants to re-match, returns 0; or not, returns 1. * (only if one game successfully ended) */ int i, j; system("CLS"); draw(); for (i = 0; i < BOARD_SIZE; i++) for (j = 0; j < BOARD_SIZE; j++) board[i][j] = 0; load(x, y); while (move()); system("CLS"); printf("%s 승리.\n계속하려면 아무 키나 누르십시오(종료 Esc):", who[turn]); if (getch() == ESC) return 1; else return 0; } #endif
커서가 처음부터 뜹니다.
'Sablog Models > 자작자작' 카테고리의 다른 글
환타 오목 게임 재구성. (5) (0) | 2009.11.12 |
---|---|
C 언어로 .cdic 파일을 xml로 만드는 프로그램 만드는 중. (0) | 2009.09.21 |
환타 오목 게임 재구성. (4) (0) | 2009.09.17 |
환타 오목 게임 재구성. (2) (0) | 2009.06.07 |
환타 오목 게임 재구성. (1) (1) | 2009.06.06 |