프로그래밍 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");
}
}
}
반응형