프로그래밍 project/C언어

기말과제 - C언어로 오목 프로그램 (전체 소스코드)

EATSTAR 2023. 6. 18. 00:29
반응형
* 본문은 Microsoft Visual Studio 2022 버전 17.6.3를 사용하였으므로 다른 버전의 비쥬얼 스튜디오나 다른 C언어 작동 프로그램으로 작동할 경우 오류가 생길 수 있음을 양지해주세요.

해설은 다음 링크를 참조하세요.

C언어로 오목 프로그램 만들기 상 편

https://eatstar.tistory.com/21

 

기말과제 - C언어로 오목 프로그램 만들기 (上- 헤더 파일과 사용자 정의함수)

* 본문은 Microsoft Visual Studio 2022 버전 17.6.3를 사용하였으므로 다른 버전의 비쥬얼 스튜디오나 다른 C언어 작동 프로그램으로 작동할 경우 오류가 생길 수 있음을 양지해주세요. 1학기 과목에서 학

eatstar.tistory.com

C언어로 오목 프로그램 만들기 하 편

https://eatstar.tistory.com/22

 

기말과제 - C언어로 오목 프로그램 만들기 (下-전체적 프로그램 진행)

https://eatstar.tistory.com/21 기말과제 - C언어로 오목 프로그램 만들기 (上- 헤더 파일과 사용자 정의함수) * 본문은 Microsoft Visual Studio 2022 버전 17.6.3를 사용하였으므로 다른 버전의 비쥬얼 스튜디오나

eatstar.tistory.com


아래는 C언어 오목 프로그램의 전체 소스 코드입니다.

#include <stdio.h>
// 유니코드 출력을 위한 헤더 파일
#include <wchar.h>
#include <locale.h>
// cls(초기화) 작업을 위한 헤더 파일
#include <windows.h>
// 난수 랜덤을 위한 헤더 파일
#include <stdlib.h>
#include <time.h>

#define SIZE 19

// 유니코드 출력을 위한 배열 선언 wprint도 그것을 위한 것이다.
wchar_t s[SIZE][SIZE];
void printgame();
void editgame();
void whowin();

int main(void) {
	int playmode;
	int x = -1;
	int y = -1; // 오목 행렬 변수

	setlocale(LC_ALL, ""); // 유니코드 문자 출력을 위한 코드

	printf("오목게임에 오신 것을 환영합니다!\n");
	printf("2인용 게임을 하시겠습니까? AI 게임을 하시겠습니까? (2인용(프리 룰): 1번 / AI게임: 2번)\n");
	printf("이 프로그램에서는 프리룰만 지원합니다. 프리룰은, 3.3 4.4 6목 등 모든 수가 허용됩니다.\n\n");
	printf("플레이 모드 : ");
	scanf_s("%d", &playmode);

	if (playmode == 1) {
		system("cls");
		printf("\t<< 오목게임 >>\t<< 2인용 >>\n");
		printgame();

		while (1) {
			black:
			printf("당신은 어느 곳에 수를 놓겠습니까? (x,y)\n");
			scanf_s("%d %d", &x, &y);
			// 흑 중복수 방지, 기존 행렬에서 보기 좋게 x,y로 표기할 수있게 배열상 순서 변경
			if (s[y - 1][x - 1] == L'●' || s[y - 1][x - 1] == L'○') {
				printf("중복수입니다. 다시 하십시오.");
				goto black;
			}
			// 흑 오좌표 방지
			else if (x < 1 || x> SIZE) {
				printf("좌표가 잘못되었습니다. 다시 선택하십시오.");
				goto black;
			}
			else if (y < 1 || y> SIZE) {
				printf("좌표가 잘못되었습니다. 다시 선택하십시오.");
				goto black;
			}
			else {
				s[y - 1][x - 1] = L'●';
			}
			// 판 초기화 및 재생성
			system("cls");
			printf("\t<< 오목게임 >>\t<< 2인용 >>\n");
			editgame();
			// 게임 종료 여부 판단
			whowin();
			
			white:
			printf("당신은 어느 곳에 수를 놓겠습니까? (x,y)\n");
			scanf_s("%d %d", &x, &y);
			// 백 중복수 방지
			if (s[y - 1][x - 1] == L'●' || s[y - 1][x - 1] == L'○') {
				printf("중복수입니다. 다시 하십시오.");
				goto white;
			}
			// 백 오좌표 방지
			else if (x < 1 || x > SIZE) {
				printf("좌표가 잘못되었습니다. 다시 선택하십시오.");
				goto white;
			}
			else if (y < 1 || y > SIZE) {
				printf("좌표가 잘못되었습니다. 다시 선택하십시오.");
				goto white;
			}
			else {
				s[y - 1][x - 1] = L'○';
			}
			// 판 초기화 및 재생성
			system("cls");
			printf("\t<< 오목게임 >>\t<< 2인용 >>\n");
			editgame();
			// 게임 종료 여부 판단
			whowin();
		}
	}
	else {
		system("cls");
		printf("\t<< 오목게임 >>\t<< AI 게임 >>\n");
		printgame();

		while (1) {
		black2:
			printf("당신은 어느 곳에 수를 놓겠습니까? (x,y)\n");
			scanf_s("%d %d", &x, &y);
			// 흑 중복수 방지, 기존 행렬에서 보기 좋게 x,y로 표기할 수있게 배열상 순서 변경
			if (s[y - 1][x - 1] == L'●' || s[y - 1][x - 1] == L'○') {
				printf("중복수입니다. 다시 하십시오.");
				goto black2;
			}
			// 흑 오좌표 방지
			else if (x < 1 || x> SIZE) {
				printf("좌표가 잘못되었습니다. 다시 선택하십시오.");
				goto black2;
			}
			else if (y < 1 || y> SIZE) {
				printf("좌표가 잘못되었습니다. 다시 선택하십시오.");
				goto black2;
			}
			else {
				s[y - 1][x - 1] = L'●';
			}
			// 판 초기화 및 재생성
			system("cls");
			printf("\t<< 오목게임 >>\t<< AI 게임 >>\n");
			editgame();
			// 게임 종료 여부 판단
			whowin();

		white2:
			//컴퓨터 턴
			printf("컴퓨터가 수를 선택하고 있습니다.");
			Sleep(1000);
			printf(".");
			Sleep(1000);
			printf(".");
			Sleep(1000);

			srand(time(NULL)); // 난수 랜덤화
			x = rand() % 19;
			y = rand() % 19;

			// 백(컴퓨터) 중복수 방지, 기존 행렬에서 보기 좋게 x,y로 표기할 수있게 배열상 순서 변경
			if (s[y - 1][x - 1] == L'●' || s[y - 1][x - 1] == L'○') {
				printf("컴퓨터의 중복수입니다. 잠시 기다려주세요.\n");
				goto white2;
			}
			else {
				s[y][x] = L'○';
			}
			// 판 초기화 및 재생성
			system("cls");
			printf("\t<< 오목게임 >>\t<< AI 게임 >>\n");
			editgame();
			// 게임 종료 여부 판단
			whowin();
		}
	}
}

void whowin() {
	int m, n;

	// 흑돌: 가로 줄 5개 완성 여부
	for (m = 0; m < SIZE; m++) {
		for (n = 0; n < SIZE - 4; n++) {
			if (s[m][n] == L'●' && s[m][n + 1] == L'●' && s[m][n + 2] == L'●' && s[m][n + 3] == L'●' && s[m][n + 4] == L'●') {
				printf("\n게임이 종료 되었습니다. 흑의 승리!");
				exit(0);
			}
		}
	}
	// 흑돌: 세로 줄 5개 완성 여부
	for (m = 0; m < SIZE; m++) {
		for (n = 0; n < SIZE - 4; n++) {
			if (s[n][m] == L'●' && s[n + 1][m] == L'●' && s[n + 2][m] == L'●' && s[n + 3][m] == L'●' && s[n + 4][m] == L'●') {
				printf("\n게임이 종료 되었습니다. 흑의 승리!");
				exit(0);
			}
		}
	}
	// 흑돌: 좌->우 대각선 줄 5개 완성 여부
	for (m = 0; m < SIZE - 4; m++) {
		for (n = 0; n < SIZE - 4; n++) {
			if (s[m][n] == L'●' && s[m + 1][n + 1] == L'●' && s[m + 2][n + 2] == L'●' && s[m + 3][n + 3] == L'●' && s[m + 4][n + 4] == L'●') {
				printf("\n게임이 종료 되었습니다. 흑의 승리!");
				exit(0);
			}
		}
	}
	// 흑돌: 우->좌 대각선 줄 5개 완성 여부
	for (m = 0; m < SIZE - 4; m++) {
		for (n = 0; n < SIZE - 4; n++) {
			if (s[m][n + 4] == L'●' && s[m + 1][n + 3] == L'●' && s[m + 2][n + 2] == L'●' && s[m + 3][n + 1] == L'●' && s[m + 4][n] == L'●') {
				printf("\n게임이 종료 되었습니다. 흑의 승리!");
				exit(0);
			}
		}
	}

	// 백돌: 가로 줄 5개 완성 여부
	for (m = 0; m < SIZE; m++) {
		for (n = 0; n < SIZE - 4; n++) {
			if (s[m][n] == L'○' && s[m][n + 1] == L'○' && s[m][n + 2] == L'○' && s[m][n + 3] == L'○' && s[m][n + 4] == L'○') {
				printf("\n게임이 종료 되었습니다. 백의 승리!");
				exit(0);
			}
		}
	}
	// 백돌: 세로 줄 5개 완성 여부
	for (m = 0; m < SIZE; m++) {
		for (n = 0; n < SIZE - 4; n++) {
			if (s[n][m] == L'○' && s[n + 1][m] == L'○' && s[n + 2][m] == L'○' && s[n + 3][m] == L'○' && s[n + 4][m] == L'○') {
				printf("\n게임이 종료 되었습니다. 백의 승리!");
				exit(0);
			}
		}
	}
	// 백돌: 좌->우 대각선 줄 5개 완성 여부
	for (m = 0; m < SIZE - 4; m++) {
		for (n = 0; n < SIZE - 4; n++) {
			if (s[m][n] == L'○' && s[m + 1][n + 1] == L'○' && s[m + 2][n + 2] == L'○' && s[m + 3][n + 3] == L'○' && s[m + 4][n + 4] == L'○') {
				printf("\n게임이 종료 되었습니다. 백의 승리!");
				exit(0);
			}
		}
	}
	// 백돌: 우->좌 대각선 줄 5개 완성 여부
	for (m = 0; m < SIZE - 4; m++) {
		for (n = 0; n < SIZE - 4; n++) {
			if (s[m][n + 4] == L'○' && s[m + 1][n + 3] == L'○' && s[m + 2][n + 2] == L'○' && s[m + 3][n + 1] == L'○' && s[m + 4][n] == L'○') {
				printf("\n게임이 종료 되었습니다. 백의 승리!");
				exit(0);
			}
		}
	}
}

void editgame() {
	int j, k, l;

	// 가로줄 숫자 표시
	printf("  ");
	for (l = 0; l < 9; l++) {
		printf("%d ", l + 1);
	}
	for (l = 9; l < 19; l++) {
		printf("%d", l + 1);
	}
	printf("\n");

	for (j = 0; j < 19; j++) {
		// 세로줄 숫자 표시
		if (j < 9) {
			printf("%d ", j + 1);
		}
		if (j >= 9) {
			printf("%d", j + 1);
		}

		// 오목판 표시
		if (j == 0) {
			for (k = 0; k < 19; k++) {
				if (k == 0) {
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
				else if (k == 18) {
					wprintf(L"%lc", s[j][k]);
				}
				else {
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
			}
			printf("\n");
		}
		if (j == 18) {
			for (k = 0; k < 19; k++) {
				if (k == 0) {
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
				else if (k == 18) {
					wprintf(L"%lc", s[j][k]);
				}
				else {
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
			}
			printf("\n");
		}
		if (j != 0 && j != 18) {
			for (k = 0; k < 19; k++) {
				if (k == 0) {
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
				else if (k == 18) {
					wprintf(L"%lc", s[j][k]);
				}
				else {
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
			}
			printf("\n");
		}
	}
}

void printgame() {
	int j, k, l;

	// 가로줄 숫자 표시
	printf("  ");
	for (l = 0; l < 9; l++) {
		printf("%d ", l + 1);
	}
	for (l = 9; l < 19; l++) {
		printf("%d", l + 1);
	}
	printf("\n");

	for (j = 0; j < 19; j++) {
		// 세로줄 숫자 표시
		if (j < 9) {
			printf("%d ", j + 1);
		}
		if (j >= 9) {
			printf("%d", j + 1);
		}

		// 오목판 생성
		if (j == 0) {
			for (k = 0; k < 19; k++) {
				if (k == 0) {
					s[j][k] = L'┌';
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
				else if (k == 18) {
					s[j][k] = L'┐';
					wprintf(L"%lc", s[j][k]);
				}
				else {
					s[j][k] = L'┬';
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
			}
			printf("\n");
		}
		if (j == 18) {
			for (k = 0; k < 19; k++) {
				if (k == 0) {
					s[j][k] = L'└';
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
				else if (k == 18) {
					s[j][k] = L'┘';
					wprintf(L"%lc", s[j][k]);
				}
				else {
					s[j][k] = L'┴';
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
			}
			printf("\n");
		}
		if (j != 0 && j != 18) {
			for (k = 0; k < 19; k++) {
				if (k == 0) {
					s[j][k] = L'├';
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
				else if (k == 18) {
					s[j][k] = L'┤';
					wprintf(L"%lc", s[j][k]);
				}
				else {
					s[j][k] = L'┼';
					wprintf(L"%lc", s[j][k]);
					printf(" ");
				}
			}
			printf("\n");
		}
	}
}
반응형