오목프로그램에서 질문있습니다.
깜찏한그1녀
질문 내용 : 오목 기본 게임은 드디어 완성을 했습니다. ! 아직 완벽하진않지만..
처음이라 너무 뿌듯하네요
여기에서 이제 메뉴를 추가시키고 싶은데요
플레이어수를 여러명 받아서 토너먼트 방식으로 구현,
해보고 싶은데 팁좀 얻을 수 있을까요?
소스코드첨부.!
#include stdio.h
#include string.h
#include stdlib.h
#include conio.h
#define LENGTH 19// 가로
#define BREADTH19// 세로
/* 현재 배열의 상태를 프린트하는 함수원형 */
void omokPan(char omok_pan[LENGTH][BREADTH], int start_LENGTH, int start_BREADTH);
/* 돌의 색과 바둑판 출력 */
void output(char omok_pan[LENGTH][BREADTH], int i, int k, int n);
/* 오목을 판별하는 함수*/
int Findomok(char omok_pan[LENGTH][BREADTH]);
/* 특수문자 배열*/
// 0 1 2 3 4 5 6 7 8
char specialChar[9][3]={┌,┬,┐,├,┤,┼,└,┴,┘};
/* 전역변수 */
int stone_Color = 1;// 바둑돌의 색 구별 변수.
/* 메인함수 */
int main() {
int key;// 키값 변수
int start_LENGTH = 0;// 키값에 따라 행의 변화를 갖는 변수
int start_BREADTH = 0;// 키값에 따라 열의 변화를 갖는 변수
int W_determine; // 승자를 판별하는 변수
char omok_pan[LENGTH][BREADTH]={1};// 현재 오목판을 그려주는 배열// 무한루프 사용자가 종료하지 않는 한 계속 반복
while(1) {
// 현재 비어있는 오목판을 그림
omokPan(omok_pan, start_LENGTH, start_BREADTH);
printf(이동 : ↑ (상), ↓ (하) , ← (좌), → (우)\n);
printf(오목놓기 : Enter \n);
printf(게임종료 : Esc\n);
// 눌린 키값을 key 에 저장
key = getch();
// 만약 224 라는 방향키가 눌렸다면 한번 더 저장
// 처음값이 224고 뒤에오는 값이 방향키값이니까.
if(key == 224){
key = getch();
}
switch(key) {
// 왼쪽 방향
case 75 :
// 왼쪽으로 최소값이 0이 마지막.. 0이하면 바둑돌은 움직이지 않음.
if(start_LENGTH 0) {
// 현재 이동하고자 하는 방향에 오목돌이 없으면 움직이고 있으면 움직이지 못함
if(omok_pan[start_LENGTH][start_BREADTH-1] == 0) {
// 왼쪽으로 이동을 위하여 현재 자리는 특수문자를 찍고 다음의 자리는 오목돌을 표시
// 0은 아무것도 없으니까 특수문자를 찍고 , 1은 검은돌을 찍고, 2는 백색돌을 찍는다.
omok_pan[start_LENGTH][start_BREADTH] = 0;
start_BREADTH -= 1;
omok_pan[start_LENGTH][start_BREADTH] = stone_Color;
omokPan(omok_pan, start_LENGTH, start_BREADTH);
} else {
printf(\n현재 돌이 위치하여 이동하실 수 없습니다..\n);
system(pause);
}
}
break;
// 위쪽방향
case 72 :
if(LENGTH 0) {
if(omok_pan[start_LENGTH-1][start_BREADTH] == 0) {
omok_pan[start_LENGTH][start_BREADTH] = 0;
start_LENGTH -= 1;
omok_pan[start_LENGTH][start_BREADTH] = stone_Color;
omokPan(omok_pan, start_LENGTH, start_BREADTH);
} else {
printf(\n현재 돌이 위치하여 이동하실 수 없습니다..\n);
system(pause);
}
}
break;
// 오른쪽방향
case 77 :
if(start_BREADTH BREADTH-1) {
if(omok_pan[start_LENGTH][start_BREADTH+1] == 0) {
omok_pan[start_LENGTH][start_BREADTH] = 0;
start_BREADTH += 1;
omok_pan[start_LENGTH][start_BREADTH] = stone_Color;
omokPan(omok_pan, start_LENGTH, start_BREADTH);
} else {
printf(\n현재 돌이 위치하여 이동하실 수 없습니다..\n);
system(pause);
}
}
break;
// 아래쪽방향
case 80:
if(start_LENGTH BREADTH-1) {
if(omsp;if(omok_pan[start_LENGTH+1][start_BREADTH] == 0) {
omok_pan[start_LENGTH][start_BREADTH] = 0;
start_LENGTH += 1;
omok_pan[start_LENGTH][start_BREADTH] = stone_Color;
omokPan(omok_pan, start_LENGTH, start_BREADTH);
} else {
printf(\n현재 돌이 위치하여 이동하실 수 없습니다..\n);
system(pause);
}
}
break;
// Enter 키
case 13 :
W_determine = Findomok(omok_pan);
if(W_determine==1)
{
printf(흑돌의 승리!\n);
return 0;
}
if(W_determine==2)
{
printf(백돌의 승리!\n);
return 0;
}// 오목을 두고자 하는 위치에 와서 Enter 를 치면 현재 위치에 흑인지 백인지 구분하여 저장
omok_pan[start_LENGTH][start_BREADTH] = stone_Color;
// 키값에 따라서 변하는 행과 열의 변수를 다시 원점에서 시작하기 위해 초기화
start_LENGTH = 0;
start_BREADTH = 0;
// 흑이 저장되면 다음차례는 백이 오게 설정
if(stone_Color == 1) {
stone_Color = 2;
} else {
stone_Color = 1;
}
// 흑이 놓여 졌다면 그다음 시작하는 [0][0]의 위치의 색깔을 다음차례 색깔로 변경
omok_pan[0][0] = stone_Color;
break;
// Esc 키를 누르면 시스템 종료
case 27 :
printf(\n);
exit(0);
}
}
}
/* 현재 배열의 상태를 프린트하는 함수*/
void omokPan(char omok_pan[LENGTH][BREADTH], int pointer_row, int pointer_column) {
int i, k;
// 현재 콘솔창을 싹 지움
system(cls);
printf( ★★♣♣♣오 목 게 임♣♣♣★★ \t\t\n);
for(i = 0; i LENGTH; i++) {
for(k = 0; k BREADTH; k++) {
// 첫번째 열이면 ┏,┳,┓ 를 찍기
if(i == 0) {
// 첫번째 열이고.. 시작점이라면 ┏ 찍기
if(k == 0) {
output(omok_pan, i, k, 0);
// 첫번째 열이고.. 마지막 이라면 ┓ 찍기
} else if (k == (BREADTH-1)) {
output(omok_pan, i, k, 2);
// 첫번째 열이고.. 첫번째와 마지막의 중간이라면 이라면 ┳ 찍기
} else if (k 0) {
output(omok_pan, i, k, 1);
}
// 마지막 열이면 ┗,┻,┛ 를 찍기
} else if (i == (LENGTH-1)) {
if(k == 0) {
output(omok_pan, i, k, 6);
} else if (k == (BREADTH-1)) {
output(omok_pan, i, k, 8);
} else if (k 0) {
output(omok_pan, i, k, 7);
}
// 처음과 마지막 열이 아니면 ┣,┫,╋ 를 찍기
} else if (i 0) {
if(k == 0) {
output(omok_pan, i, k, 3);
} else if (k == (BREADTH-1)) {
output(omok_pan, i, k, 4);
} else if (k 0) {
output(omok_pan, i, k, 5);
}
}
}
printf(\n);
}
}
/* 흑백판단 및 특수문자를 판별해서 찍어주는 함수 */
void output(char omok_pan[LENGTH][BREADTH], int i, int k, int n){
// 현재 0 은 특수문자, 1은 검은돌, 2는 백색돌
// 현재 배열에 0이 있으면 특수문자를 찍고, 1이 있으면 검은돌을 찍고, 2가 있으면 백색돌을 찍는다.
if(omok_pan[i][k] == 1) {
printf(○);
} else if (omok_pan[i][k] == 2) {
printf(●);
} else {
printf(%s, specialChar[n]);
}
}
int Findomok(char omok_pan[LENGTH][BREADTH])
{
int i,j;
for(i=0;i19;i++) // 흑돌이 오목일때
{
for(j=0;j19;j++)
{
if(omok_pan[i][j]==1 && omok_pan[i+1][j+1]==1 && omok_pan[i+2][j+2]==1 && omok_pan[i+3][j+3]==1 && omok_pan[i+4][j+4]==1)
return 1;
else if(omok_pan[i][j]==1 && omok_pan[i-1][j+1]==1 && omok_pan[i-2][j+2]==1 && omok_pan[i-3][j+3]==1 && omok_pan[i-4][j+4]==1)
return 1;
else if(omok_pan[i][j]==1 && omok_pan[i-1][j+1]==1 && omok_pan[i-2][j+2]==1 && omok_pan[i-3][j+3]==1 && omok_pan[i-4][j+4]==1)
return 1;
else if(omok_pan[i][j]==1 && omok_pan[i][j+1]==1 && omok_pan[i][j+2]==1 && omok_pan[i][j+3]==1 && omok_pan[i][j+4]==1)
return 1;
else if(omok_pan[i][j]==1 && omok_pan[i+1][j]==1 && omok_pan[i+2][j]==1 && omok_pan[i+3][j]==1 && omok_pan[i+4][j]==1)
return 1;
}
}
for(i=0;i19;i++) // 백돌이 오목일때
{
for(j=0;j19;j++)
{
if(omok_pan[i][j]==2 && omok_pan[i+1][j+1]==2 && omok_pan[i+2][j+2]==2 && omok_pan[i+3][j+3]==2 && omok_pan[i+4][j+4]==2)
return 2;
else if(omok_pan[i][j]==2 && omok_pan[i-1][j+1]==2 && omok_pan[i-2][j+2]==1 && omok_pan[i-3][j+3]==2 && omok_pan[i-4][j+4]==2)
return 2;
else if(omok_pan[i][j]==2 && omok_pan[i-1][j+1]==2 && omok_pan[i-2][j+2]==2 && omok_pan[i-3][j+3]==2 && omok_pan[i-4][j+4]==2)
return 2;
else if(omok_pan[i][j]==2 && omok_pan[i][j+1]==2 && omok_pan[i][j+2]==2 && omok_pan[i][j+3]==2 && omok_pan[i][j+4]==2)
return 2;
else if(omok_pan[i][j]==2 && omok_pan[i+1][j]==2 && omok_pan[i+2][j]==2 && omok_pan[i+3][j]==2 && omok_pan[i+4][j]==2)
return 2;
p; }
}
return 0;
}
-
찬솔나라
감사합니다 !
-
별글
흠...흰돌이든 검은돌이든 0행에선 왼쪽으로 갈수없네요.. ㄷㄷ?
무조건 아래쪽으로 한번내려간후에만 1행부터 왼쪽으로움직일수잇는?;
if(start_LENGTH = 0) 이렇게해주면 되네염. -
놓아주세요
글을 함부로 지우시면안됩니다.
답변이 달린글이었다면 강퇴를 당했을겁니다.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692374 | 고수님들 댓글 마니부탁해요!!! (2) | 엄지 | 2025-04-22 |
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |
2691678 | C언어 함수 질문이요~!!! | 연보라 | 2025-04-15 |
2691650 | 반복문 | 돋가이 | 2025-04-15 |