[1번 문제]
/*
응용 7.2.2에서는 컴퓨터나 사용자가 1~10 사이의 중복되지 않는 숫자를 생성하거나 입력하도록 되어 있는데,
이를 변형하여 상대방이 사용한 숫자는 사용할 수 없도록 제어하여 최초로 50이 넘으면 게임의 승자가 되도록 프로그램을 수정하시오
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <conio.h>
void intro_game(void);
void game_control(void);
int computer_number(int i, int com_array[]);
int user_number(int i, int user_array[]);
void number_display(int i, int com_array[], int user_array[], int sum);
void conclusion(int win);
void gotoxy(int x, int y);
void press_any_key(void);
int visit[10] = { 0, };
int main(void)
{
srand((unsigned)time(NULL));
intro_game();
game_control();
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명 출력 함수
*/
void intro_game(void)
{
system("cls");
printf("50을 넘어라 게임\n\n");
printf("컴퓨터와 사용자가 번갈아가며\n");
printf("숫자를 입력하되 1~10 사이의 \n");
printf("중복되지 않는 숫자를 입력하여 \n\n");
printf("최초로 50을 넘기면 승자가 됩니다. \n\n");
printf("컴퓨터가 먼저 시작합니다. \n");
printf("아무키나 누르면 시작합니다.");
getch();
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
컴퓨터가 제시하는 난수를 생성하는 함수
*/
int computer_number(int i, int com_array[])
{
int again = 0, random;
while (!again)
{
random = rand() % 10 + 1;
if (visit[random-1])
again = 0;
else
{
again = 1;
visit[random-1] = 1;
}
}
com_array[i] = random;
return com_array[i];
}
/*
사용자가 제시하는 숫자의 입력과 처리 함수
*/
int user_number(int i, int user_array[])
{
int number, again = 0;
while (!again)
{
gotoxy(1, 7);
printf("사용자 숫자 입력후 Enter>");
scanf("%d", &number);
if (visit[number-1])
{
again = 0;
gotoxy(1, 7);
printf(" "); //글자를 지운다
}
else
{
again = 1;
visit[number-1] = 1;
}
}
user_array[i] = number;
return user_array[i];
}
/*
컴퓨터와 사용자가 제시한 숫자를 화면에 출력하는 함수
*/
void number_display(int i, int com_array[], int user_array[], int sum)
{
int j;
gotoxy(1, 2);
printf("컴퓨터 숫자: ");
for (j = 0; j <= i; j++)
printf("%2d ", com_array[j]);
gotoxy(1, 3);
printf("사용자 숫자: ");
for (j = 0; j <= i; j++)
if (user_array[j] == 0)
continue;
else
printf("%2d ", user_array[j]);
gotoxy(1, 5);
printf("현재 합계: %3d\n", sum);
}
/*
게임의 결과(승패)를 출력하는 함수
*/
void conclusion(int check)
{
if (check == 1)
printf("컴퓨터가 이겼습니다. \n");
else
printf("사용자가 이겼습니다. \n");
}
/*
프로그램의 진행을 멈추게 하는 함수
*/
void press_any_key(void)
{
gotoxy(1, 10);
printf("아무키나 누르시오..");
getch();
}
/*
100을 넘어라 게임을 제어하는 함수
*/
void game_control(void)
{
int max = 50;
int com_array[10] = { 0 }, user_array[10] = { 0 }, number;
int i, sum = 0, win;
for (i = 0; i < 10; i++)
{
system("cls");
number = computer_number(i, com_array);
sum += number;
number_display(i, com_array, user_array, sum);
if (max < sum)
{
win = 1;
break;
}
number = user_number(i, user_array);
sum += number;
number_display(i, com_array, user_array, sum);
if (max < sum)
{
win = 2;
break;
}
press_any_key();
}
conclusion(win);
}
[2번 문제]
/*
응용 7.2.2에서 홀수와 짝수를 번갈아가며 입력하도록 합니다.
먼저 입력한 숫자가 짝수라면 다음에는 홀수만을 입력하도록 수정하시오
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <conio.h>
void intro_game(void);
void game_control(void);
int computer_number(int i, int com_array[]);
int user_number(int i, int user_array[]);
void number_display(int i, int com_array[], int user_array[], int sum);
void conclusion(int win);
void gotoxy(int x, int y);
void press_any_key(void);
int main(void)
{
srand((unsigned)time(NULL));
intro_game();
game_control();
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명 출력 함수
*/
void intro_game(void)
{
system("cls");
printf("100을 넘어라 게임\n\n");
printf("컴퓨터와 사용자가 번갈아가며\n");
printf("숫자를 입력하되 1~10 사이의 \n");
printf("중복되지 않는 숫자를 입력하여 \n\n");
printf("최초로 100을 넘기면 승자가 됩니다. \n\n");
printf("또한 홀수번 째 차례에는 홀수, 짝수번 째 차례에는 짝수를 입력해야합니다\n");
printf("컴퓨터가 먼저 시작합니다. \n");
printf("아무키나 누르면 시작합니다.");
getch();
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
컴퓨터가 제시하는 난수를 생성하는 함수
*/
int computer_number(int i, int com_array[])
{
int j, number;
again:;
if (i % 2 == 1)
{
do
{
number = rand() % 10 + 1;
} while (number % 2 == 1);
}
else
{
do
{
number = rand() % 10 + 1;
} while (number % 2 == 0);
}
for (j = 0; j < i; j++)
if (com_array[j] == number)
goto again;
com_array[i] = number;
return com_array[i];
}
/*
사용자가 제시하는 숫자의 입력과 처리 함수
*/
int user_number(int i, int user_array[])
{
int j, number;
again:;
gotoxy(1, 7);
printf("사용자 숫자 입력후 Enter>");
scanf("%d", &number);
if (i % 2 == 1)
{
if (number % 2 == 0)
{
gotoxy(1, 8);
printf("홀수를 입력할 차례입니다\n");
goto again;
}
for (j = 0; j < i; j++)
if (user_array[j] == number)
{
gotoxy(1, 8);
printf("중복된 숫자를 입력했습니다\n");
goto again;
}
}
else
{
if (number % 2 == 1)
{
gotoxy(1, 8);
printf("짝수를 입력할 차례입니다\n");
goto again;
}
for (j = 0; j < i; j++)
if (user_array[j] == number)
{
gotoxy(1, 8);
printf("중복된 숫자를 입력했습니다\n");
goto again;
}
}
user_array[i] = number;
return user_array[i];
}
/*
컴퓨터와 사용자가 제시한 숫자를 화면에 출력하는 함수
*/
void number_display(int i, int com_array[], int user_array[], int sum)
{
int j;
gotoxy(1, 2);
printf("컴퓨터 숫자: ");
for (j = 0; j <= i; j++)
printf("%2d ", com_array[j]);
gotoxy(1, 3);
printf("사용자 숫자: ");
for (j = 0; j <= i; j++)
if (user_array[j] == 0)
continue;
else
printf("%2d ", user_array[j]);
gotoxy(1, 5);
printf("현재 합계: %3d\n", sum);
}
/*
게임의 결과(승패)를 출력하는 함수
*/
void conclusion(int check)
{
if (check == 1)
printf("컴퓨터가 이겼습니다. \n");
else
printf("사용자가 이겼습니다. \n");
}
/*
프로그램의 진행을 멈추게 하는 함수
*/
void press_any_key(void)
{
gotoxy(1, 10);
printf("아무키나 누르시오..");
getch();
}
/*
100을 넘어라 게임을 제어하는 함수
*/
void game_control(void)
{
int max = 100;
int com_array[10] = { 0 }, user_array[10] = { 0 }, number;
int i, sum = 0, win;
for (i = 0; i < 10; i++)
{
system("cls");
number = computer_number(i, com_array);
sum += number;
number_display(i, com_array, user_array, sum);
if (max < sum)
{
win = 1;
break;
}
number = user_number(i, user_array);
sum += number;
number_display(i, com_array, user_array, sum);
if (max < sum)
{
win = 2;
break;
}
press_any_key();
}
conclusion(win);
}
[3번 문제]
/*
컴퓨터가 아닌 두 사람이 번갈아 입력하면서 게임의 승자를 구분하도록 프로그램을 수정하시오
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <conio.h>
void intro_game(void);
void game_control(void);
int user1_number(int i, int user1_array[]);
int user2_number(int i, int user2_array[]);
void number_display(int i, int user1_array[], int user2_array[], int sum);
void conclusion(int win);
void gotoxy(int x, int y);
void press_any_key(void);
int main(void)
{
srand((unsigned)time(NULL));
intro_game();
game_control();
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명 출력 함수
*/
void intro_game(void)
{
system("cls");
printf("100을 넘어라 게임\n\n");
printf("사용자끼리 번갈아가며\n");
printf("숫자를 입력하되 1~10 사이의 \n");
printf("중복되지 않는 숫자를 입력하여 \n\n");
printf("최초로 100을 넘기면 승자가 됩니다. \n\n");
printf("사용자1 님이 먼저 시작합니다. \n");
printf("아무키나 누르면 시작합니다.");
getch();
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
컴퓨터가 제시하는 난수를 생성하는 함수
*/
int user1_number(int i, int user1_array[])
{
int j, number;
again:;
gotoxy(1, 7);
printf("첫 번째 사용자 숫자 입력후 Enter>");
scanf("%d", &number);
for (j = 0; j < i; j++)
if (user1_array[j] == number)
{
gotoxy(1, 8);
printf("중복된 숫자를 입력했습니다\n");
goto again;
}
user1_array[i] = number;
return user1_array[i];
}
/*
사용자가 제시하는 숫자의 입력과 처리 함수
*/
int user2_number(int i, int user2_array[])
{
int j, number;
again:;
gotoxy(1, 10);
printf("두 번째 사용자 숫자 입력후 Enter>");
scanf("%d", &number);
for (j = 0; j < i; j++)
if (user2_array[j] == number)
{
gotoxy(1, 11);
printf("중복된 숫자를 입력했습니다\n");
goto again;
}
user2_array[i] = number;
return user2_array[i];
}
/*
컴퓨터와 사용자가 제시한 숫자를 화면에 출력하는 함수
*/
void number_display(int i, int user1_array[], int user2_array[], int sum)
{
int j;
gotoxy(1, 2);
printf("첫 번째 사용자 숫자: ");
for (j = 0; j <= i; j++)
if (user1_array[j] == 0)
continue;
else
printf("%2d ", user1_array[j]);
gotoxy(1, 3);
printf("두 번째 사용자 숫자: ");
for (j = 0; j <= i; j++)
if (user2_array[j] == 0)
continue;
else
printf("%2d ", user2_array[j]);
gotoxy(1, 5);
printf("현재 합계: %3d\n", sum);
}
/*
게임의 결과(승패)를 출력하는 함수
*/
void conclusion(int check)
{
gotoxy(1, 24);
if (check == 1)
printf("사용자1 님이 이겼습니다. \n");
else
printf("사용자2 님이 이겼습니다. \n");
}
/*
프로그램의 진행을 멈추게 하는 함수
*/
void press_any_key(void)
{
gotoxy(1, 15);
printf("아무키나 누르시오..");
getch();
}
/*
100을 넘어라 게임을 제어하는 함수
*/
void game_control(void)
{
int max = 100;
int user1_array[10] = { 0 }, user2_array[10] = { 0 }, number;
int i, sum = 0, win;
for (i = 0; i < 10; i++)
{
system("cls");
number = user1_number(i, user1_array);
sum += number;
number_display(i, user1_array, user2_array, sum);
if (max < sum)
{
win = 1;
break;
}
number = user2_number(i, user2_array);
sum += number;
number_display(i, user1_array, user2_array, sum);
if (max < sum)
{
win = 2;
break;
}
press_any_key();
}
conclusion(win);
}
[5번 문제]
/*
함수 7.2.6과 함수 7.2.7에 대해 goto문을 사용하지 않는 사용자 정의함수로 작성하시오
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <conio.h>
void intro_game(void);
void game_control(void);
int computer_number(int i, int com_array[]);
int user_number(int i, int user_array[]);
void number_display(int i, int com_array[], int user_array[], int sum);
void conclusion(int win);
void gotoxy(int x, int y);
void press_any_key(void);
int main(void)
{
srand((unsigned)time(NULL));
intro_game();
game_control();
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명 출력 함수
*/
void intro_game(void)
{
system("cls");
printf("100을 넘어라 게임\n\n");
printf("컴퓨터와 사용자가 번갈아가며\n");
printf("숫자를 입력하되 1~10 사이의 \n");
printf("중복되지 않는 숫자를 입력하여 \n\n");
printf("최초로 100을 넘기면 승자가 됩니다. \n\n");
printf("컴퓨터가 먼저 시작합니다. \n");
printf("아무키나 누르면 시작합니다.");
getch();
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
/*
컴퓨터가 제시하는 난수를 생성하는 함수
*/
int computer_number(int i, int com_array[])
{
int random, again;
do
{
again = 1;
random = rand() % 10 + 1;
for (int j = 0; j < i; j++)
if (com_array[j] == random)
again = 0;
} while (!again);
com_array[i] = random;
return com_array[i];
}
/*
사용자가 제시하는 숫자의 입력과 처리 함수
*/
int user_number(int i, int user_array[])
{
int number, again;
do
{
again = 1;
gotoxy(1, 7);
printf("사용자 숫자 입력 후 Enter >");
scanf("%d", &number);
for (int j = 0; j < i; j++)
if (user_array[j] == number)
{
gotoxy(1, 8);
printf("중복된 숫자를 입력했습니다\n");
again = 0;
}
} while (!again);
user_array[i] = number;
return user_array[i];
}
/*
컴퓨터와 사용자가 제시한 숫자를 화면에 출력하는 함수
*/
void number_display(int i, int com_array[], int user_array[], int sum)
{
int j;
gotoxy(1, 2);
printf("컴퓨터 숫자: ");
for (j = 0; j <= i; j++)
printf("%2d ", com_array[j]);
gotoxy(1, 3);
printf("사용자 숫자: ");
for (j = 0; j <= i; j++)
if (user_array[j] == 0)
continue;
else
printf("%2d ", user_array[j]);
gotoxy(1, 5);
printf("현재 합계: %3d\n", sum);
}
/*
게임의 결과(승패)를 출력하는 함수
*/
void conclusion(int check)
{
if (check == 1)
printf("컴퓨터가 이겼습니다. \n");
else
printf("사용자가 이겼습니다. \n");
}
/*
프로그램의 진행을 멈추게 하는 함수
*/
void press_any_key(void)
{
gotoxy(1, 10);
printf("아무키나 누르시오..");
getch();
}
/*
100을 넘어라 게임을 제어하는 함수
*/
void game_control(void)
{
int max = 100;
int com_array[10] = { 0 }, user_array[10] = { 0 }, number;
int i, sum = 0, win;
for (i = 0; i < 10; i++)
{
system("cls");
number = computer_number(i, com_array);
sum += number;
number_display(i, com_array, user_array, sum);
if (max < sum)
{
win = 1;
break;
}
number = user_number(i, user_array);
sum += number;
number_display(i, com_array, user_array, sum);
if (max < sum)
{
win = 2;
break;
}
press_any_key();
}
conclusion(win);
}
[6번 문제]
/*
네 명(A, B, C, D)이 순서대로 주사위를 던져서 제일 높은 눈금과 제일 낮은 눈금을 곱하고,
나머지 눈금을 곱하여 곱한 숫자가 낮은 두 사람을 우승자로 하는 게임 프로그램을 작성하시오.
눈금이 같을 경우, 던진 순서를 우선으로 결정하고, 다음 번 순서는 낮은 눈금의 사람부터 시작하되 총 10회를 반복하시오
*/
/*
100을 넘어라 게임 프로그램
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#include <conio.h>
void intro_game(void);
void game_control(void);
int roll_dice(int j);
void gotoxy(int x, int y);
void press_any_key();
void conclusion(int A, int B, int C, int D);
int a = 0, b = 0, c = 0, d = 0;
int main(void)
{
srand((unsigned)time(NULL));
intro_game();
game_control();
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명 출력 함수
*/
void intro_game(void)
{
system("cls");
printf("주사위 게임\n");
printf("2:2 팀 게임입니다\n");
printf("제일 높은 눈금과 제일 낮은 눈금의 곱 vs 나머지 두 눈금의 곱\n");
printf("둘 중 낮은 점수를 가진 팀이 이기는 게임입니다\n");
printf("10번을 진행하며 팀은 매번 바뀔 수 있습니다\n");
printf("네 명 중 제일 많이 우승한 사람이 이깁니다\n");
printf("인지하셨다면 키보드를 누르세요\n");
getch();
}
void gotoxy(int x, int y)
{
COORD Pos = { x - 1, y - 1 };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
int roll_dice(int j)
{
int num = 0;
num = rand() % 6 + 1;
printf("%d번째 %d\n", j, num);
return num;
}
void press_any_key(void)
{
gotoxy(1, 10);
printf("인지하였다면 아무키나 누르세요\n");
getch();
}
void game_control(void)
{
int i, j, k, next = 1;
int multiple = 1;
int max, min;
int current[4]; //현재 게임 진행자들
int repeat;
for (i = 0; i<10; i++)
{
int check1 = 0, check2 = 1;
int check3 = 2, check4 = 3;
system("cls");
for (j = 0; j<4; j++)
{
current[j] = roll_dice(j);
if (j == 1)
{
while (current[1] == current[0]) //숫자가 겹치지 않도록 했습니다
{
current[1] = roll_dice(j);
}
}
else if (j == 2)
{
while (current[2] == current[1] || current[2] == current[0]) //숫자가 겹치지 않도록 했습니다
{
current[2] = roll_dice(j);
}
}
else if (j == 3)
{
while (current[3] == current[2] || current[3] == current[1] || current[3] == current[0]) //숫자가 겹치지 않도록 했습니다
{
current[3] = roll_dice(j);
}
}
}
system("cls");
for (j = 0; j<4; j++)
{
printf("%d번째 주사위:%d\n", j + 1, current[j]);
}
max = 0; //최대는 0으로
min = 6; //최소는 6으로 설정하고
for (j = 0; j<4; j++)
{
if (current[j]>max)
{
max = current[j]; //최대를 찾는다
check1 = j;
}
}
for (j = 0; j<4; j++)
{
if (current[j]<min) //최소를 찾는다
{
min = current[j];
check2 = j;
}
}
printf("최대:%d, 최소:%d\n", max, min);
printf("최대 최소 곱:%d\n", max*min);
for (j = 0; j<4; j++)
{
if (j != check1 && j != check2)
{
check3 = j;
break;
}
}
for (j = 0; j<4; j++)
{
if (j != check1 && j != check2 && j != check3)
check4 = j;
}
printf("A:%d 번째 주사위, B:%d 번째 주사위, C:%d 번째 주사위, D:%d 번째 주사위\n", check1+1, check2+1, check3+1, check4+1);
multiple = (current[check3] * current[check4]);
printf("최대도 최소도 아닌 곱: %d \n", multiple);
if (multiple>max*min)
{
printf("%c와 %c가 이겼다\n", (char)(check1+65), (char)(check2+65));
switch (check1)
{
case 0:
a++;
break;
case 1:
b++;
break;
case 2:
c++;
break;
case 3:
d++;
break;
}
switch (check2)
{
case 0:
a++;
break;
case 1:
b++;
break;
case 2:
c++;
break;
case 3:
d++;
break;
}
conclusion(a, b, c, d);
}
else if(multiple<max*min)
{
printf("%c와 %c가 이겼다\n", (char)(check3+65), (char)(check4+65));
switch (check3)
{
case 0:
a++;
break;
case 1:
b++;
break;
case 2:
c++;
break;
case 3:
d++;
break;
}
switch (check4)
{
case 0:
a++;
break;
case 1:
b++;
break;
case 2:
c++;
break;
case 3:
d++;
break;
}
conclusion(a, b, c, d);
}
else
{
printf("비겼습니다\n");
a++;
b++;
c++;
d++;
conclusion(a, b, c, d);
}
press_any_key();
}
}
void conclusion(int A, int B, int C, int D)
{
gotoxy(1, 20);
printf("우승한 횟수:\nA:%d, B:%d, C:%d, D:%d\n", a, b, c, d);
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 명품 C언어 프로젝트 안기수 저
*4번 문제는 토의 문제였기 때문에 생략했습니다.
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 간단한 오목 (14) | 2017.08.29 |
---|---|
명품 C언어 프로젝트 8.1장 예제 (0) | 2017.08.29 |
명품 C언어 프로젝트 7.2.1장 개선과 확장 (0) | 2017.08.27 |
명품 C언어 프로젝트 6.3장 연습문제 (0) | 2017.08.26 |
명품 C언어 프로젝트 6.2장 연습문제 (0) | 2017.08.22 |