2019-02-01
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');
}
Author And Source
이 문제에 관하여(2019-02-01), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@hyeonu_chun/2019-02-01
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#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');
}
Author And Source
이 문제에 관하여(2019-02-01), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyeonu_chun/2019-02-01저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)