2019-02-01

Hyeonu_Chun·2021년 6월 21일
0

HW4

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#pragma warning (disable : 4996)

int random(int);
void myflush();

void praGame(void);
void figGame(void);

void printBin(int**, int);
void printBin_2(int **, int **, int N);

void compareData(int**, int);
void compareData_2(int **, int **, int);

void makeRanBin(int**, int);
void dataClear(int**, int);
int whoWin(int **, int **, int);
int winBin(int**, int);
void inputInt(const char *, int *, int, int);

int main() {
	srand(unsigned int(time(NULL)));
	int menu;
	while (1) {
		printf("1. 연습게임(개인 연습용)\n2. 대전게임(컴퓨터와 대전용)\n3. 종료\n\n");
		inputInt("# 메뉴선택 : ", &menu, 1, 3);
		switch (menu) {
		case 1: praGame(); getchar(); break;
		case 2: figGame(); getchar(); break;
		case 3: return 0;
		}
	}
	return 0;
}

// practice game
void praGame(void) {
	int N;
	printf("연습용 빙고게임을 시작합니다.\n\n");
	inputInt("# 빙고판의 가로, 세로 크기를 입력해주세요(양수값 입력) : ", &N, 2, 10);

	int **bin = (int**)calloc(N, sizeof(int*));
	for (int i = 0; i < N;i++) {
		bin[i] = (int*)calloc(N, sizeof(int));
	}

	makeRanBin(bin, N);
	printBin(bin, N);

	compareData(bin, N);

	dataClear(bin, N);
	printf("\n");
}

// fight game
void figGame(void) {
	int N;
	printf("컴퓨터 대전 빙고게임을 시작합니다.\n\n");
	inputInt("# 빙고판의 가로, 세로 크기를 입력해주세요(양수값 입력) : ", &N, 2, 10);
	printf("\n사용자 빙고게임판 내용을 생성중입니다.\n");
	printf("컴퓨터 빙고게임판 내용을 생성중입니다.\n\n");

	int **uBin = (int**)calloc(N, sizeof(int*));
	int **cBin = (int**)calloc(N, sizeof(int*));
	for (int i = 0; i < N;i++) {
		uBin[i] = (int*)calloc(N, sizeof(int));
	}
	for (int i = 0; i < N;i++) {
		cBin[i] = (int*)calloc(N, sizeof(int));
	}

	makeRanBin(uBin, N);
	makeRanBin(cBin, N);
	printBin_2(uBin, cBin, N);

	compareData_2(uBin, cBin, N);

	dataClear(uBin, N);
	dataClear(cBin, N);
	printf("\n");
}

// compare data - practice game
void compareData(int **bin, int N) {
	int cData;
	for (int i = 0; i < N*N;i++) {
		inputInt("\n# 지울 숫자 입력(1~%d) : ", &cData, 1, N*N);
		for (int j = 0; j < N;j++) {
			for (int k = 0;k < N;k++) {
				if (bin[j][k] == cData) {
					bin[j][k] = -cData;
					printBin(bin, N);
					if (winBin(bin, N) == 1) { 
						printf("\n# 아무 키나 치면 주 메뉴로 돌아갑니다.");
						return; 
					}
					break;
				}
				else if (bin[j][k] == -cData) {
					printf("* 이미 지워진 숫자 입니다. 다시 입력하세요.\n");
					i--;
				}
			}
		}
	}
}

// compare data - fight game
void compareData_2(int **ubin,int **cbin, int N) {
	int cData, num = 0;
	for (int i = 0; i < N*N;i++) {
		if (i % 2 == 0) {
			inputInt("\n# 지울 숫자 입력(1~%d) : ", &cData, 1, N*N);
			for (int j = 0; j < N;j++) {
				for (int k = 0;k < N;k++) {
					if (ubin[j][k] == -cData || cbin[j][k] == -cData) {
						num = 1;
						break;
					}
					if (ubin[j][k] == cData) ubin[j][k] = -cData;
					if (cbin[j][k] == cData) cbin[j][k] = -cData;
				}
			}
			if (num == 1) {
				printf("* 이미 지워진 숫자 입니다. 다시 입력하세요.\n");
				i--;
				num = 0;
			}
			else {
				printBin_2(ubin, cbin, N);
				cData = whoWin(ubin, cbin, N);
				if (cData == 1) return;
			}
		}
		else {
			while (1) {
				int num = 0;
				cData = random(N*N) + 1;
				for (int i = 0; i < N;i++) {
					for (int j = 0;j < N;j++) {
						if (ubin[i][j] == -cData) num++;
					}
				}
				if (num == 0)break;
			}
			printf("\n# 컴퓨터가 선택한 숫자는 (%d)입니다.\n", cData);
			for (int j = 0; j < N;j++) {
				for (int k = 0;k < N;k++) {
					if (ubin[j][k] == cData) ubin[j][k] = -cData;
					if (cbin[j][k] == cData) cbin[j][k] = -cData;
				}
			}
			printBin_2(ubin, cbin, N);
			cData = whoWin(ubin, cbin, N);
			if (cData == 1) return;
		}
	}
}

// who win : compare bingo that succes 'Bingo' first
int whoWin(int **ubin, int **cbin, int N) {
	int unum = 0, cnum = 0;
	if ((unum = winBin(ubin, N)) > 0 || (cnum = winBin(cbin, N)) > 0) {
		if (unum > cnum) printf("\n# 사용자 승!");
		else if (unum < cnum) printf("\n# 컴퓨터 승!");
		else printf("\n# 사용자, 컴퓨터 !");
		printf("\n# 아무 키나 치면 주 메뉴로 돌아갑니다.");
		return 1;
	}
	return 0;
}

// win bingo : count 'Bingo' line
int winBin(int **bin, int N) {
	int sum = 0;
	int val[4] = { 0, };
	for (int i = 0; i < N;i++) {
		val[0] = val[1] = 0;
		for (int j = 0;j < N;j++) {
			if (bin[i][j] < 0) val[0]++;
			if (bin[j][i] < 0) val[1]++;
			if (i == j) {
				if (bin[i][j] < 0) val[2]++;
			}
			if (i == N - j - 1) {
				if (bin[i][j] < 0) val[3]++;
			}
		}
		for (int k = 0;k < 4;k++) {
			if (val[k] == N) sum++;
		}
	}
	if (sum >= N) return 1;
	return 0;
}

// print practice game bingo
void printBin(int **bin, int N) {
	printf("\n|");
	for (int i = 0; i < N;i++) {
		for (int j = 0;j < N;j++) {
			if (bin[i][j] < 0) printf("    X");
			else printf("%5d", bin[i][j]);
		}
		printf("  |\n|");
	}
	printf("\b ");
}

// print fight game bingo
void printBin_2(int **ubin, int **cbin, int N) {
	
	printf("[user]\t\t\t\t[couputer]\n|");
	for (int i = 0; i < N;i++) {
		for (int j = 0;j < N;j++) {
			if (ubin[i][j] < 0) printf("    X");
			else printf("%5d", ubin[i][j]);
		}
		printf("  |\t|");
		for (int k = 0;k < N;k++) {
			if (cbin[i][k] < 0) printf("    X");
			else printf("%5d", cbin[i][k]);
		}
		printf("  |\n|");
	}
	printf("\b ");
}

// make random bingo : put random number in bingo 
void makeRanBin(int**bin, int N)
{
	int temp;
	int *cBin = (int*)calloc(N*N, sizeof(int));
	for (int i = 0; i < N*N;i++) {
			cBin[i] = i + 1;
	}
	for (int i = 0; i < N*N;i++) {
		int *num1 = cBin + random(N*N);
		int *num2 = cBin + random(N*N);
		temp = *num1; *num1 = *num2; *num2 = temp;
	}
	for (int i = 0; i < N;i++) {
		for (int j = 0; j < N;j++) {
			bin[i][j] = cBin[i*N + j];
		}
	}
	memset(cBin, 0, N*N);
	free(cBin);
}

// input integer : put integer that user select in data and do exception handling
void inputInt(const char *msg, int *p, int min, int max) {
	while (1) {
		printf(msg, max);
		scanf("%d", p);
		if (getchar() == '\n') {
			if (*p >= min && *p <= max) return;
			else printf("* 올바르지 못한 숫자입니다.\n");
		}
		else {
			printf("* 올바르지 못한 숫자입니다.\n");
			myflush();
		}
	}
}

// data clear
void dataClear(int **bin, int N) {
	for (int i = 0; i < N;i++) {
		memset(bin[i], 0, N);
		free(bin[i]);
	}
	memset(bin, 0, N);
	free(bin);
}

// make radom integer
int random(int num) {
	int res;
	res = rand() % num;
	return res;
}

// myflush
void myflush() {
	while (getchar() != '\n');
}
profile
Stay hungry, stay foolish

0개의 댓글