#include
#include
#include
#include
int main() {
int rnd_num[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, shuffle, x, y, temp;// 랜덤수를 만들기 위한 rnd_num배열의 초기화
int sm[50], bm[50], count = 0, cnt = 0, sc = 0, bc = 0, tc = 0, ans = 0, fc = 0, no, fix[10], ch = 0;
int i, j, k, error = 0, opp, op, sign, strike, ball, rn, rn2, temm[50], tlm[50], as[10], ac = 0;
char ans[10], YN, tem;
char memory[200];
tem = '\0';
srand(time(0));// 초기화
fix[10] = 0;
temm[50] = 0;
tlm[50] = 0;
for (i = 0; i < 50; i++) {
sm[i] = 0;
bm[i] = 0;
}
for (i = 0; i < 10; i++) {
ans[i] = '\0';
as[i] = 0;
}
for (i = 0; i < 200; i++)
memory[i] = '\0';
for (shuffle = 0; shuffle < 5000; shuffle++) {// rnd_num 배열의 0 ~ 9 숫자 5000번 섞기
x = rand() % 10;
y = rand() % 10;
temp = rnd_num[x];
rnd_num[x] = rnd_num[y];
rnd_num[y] = temp;
}
printf("[ 숫자야구게임 - AI대전 ]\n\n");
printf(" 몇 번의 기회를 주실 건가요? \n");
printf("\n [ 기회 ]:");
scanf("%d", &opp);
op = opp;
if (opp == 0) {// 기회를 안주면 재시작
printf("0번이요..? 기회는 주시면 안될까요..? [재시작]\n\n");
Sleep(500);
main();
}
if (opp > 50) {// 기회를 너무 주면 재시작
printf("50번 이상이나 주실 필요 없어요!! [재시작]\n\n");
Sleep(500);
main();
}
printf("\n당신이 주신 기회 : %d번\n\n", opp);
printf("[1] - 게임 시작\n");
printf("[0] - 게임 종료\n\n");
printf("4자리 숫자를 생각하신 후 게임을 시작해주세요! - ");
scanf("%d", &sign);
if (sign == 1) {
printf("\n--------------------[ 게임 규칙 ]----------------------\n");
printf("* 자신이 생각한 수와 일치하고 자리도 같다면 [s]\n");
printf("* 자신이 생각한 수와 일치하지만 자리가 다르다면 [b]\n");
printf("* s,b 의 갯수를 문자 앞에 입력해주세요! [예시 : 2s 1b]\n");
printf("-------------------------------------------------------\n");
Sleep(400);
printf("\n게임을 시작합니다...\n");// 게임 시작
for (i = 0; i < 4; i++) {// 처음 ai가 시도할 4자리 수
ans[i] = rnd_num[i] + '0';
printf("%c", ans[i]);
memory[cnt] = ans[i];// 첫 번째 저장
cnt++;
}printf(" - ");
scanf("%*c%d%*c%d%*c", &strike, &ball);
sm[sc] = strike; sc++;
bm[bc] = ball; bc++;
count++;
for (i = 4; i < 10; i++) {// 나머지 수 저장
ans[i] = rnd_num[i] + '0';
}
while (1) {
if (op == opp)
op = opp;
else
error = 1;
if ((sm[sc - 1] + bm[bc - 1]) > 4)// s + b > 4 이면 오류
error = 1;
if (error == 1) {// 오류 보고 후 종료
printf("ERROR!\n");
exit(1);
}
if (sm[sc - 1] == 4 && bm[bc - 1] == 0) {
printf("답은 [ ");
for (i = 0; i < 4; i++)
printf("%c", ans[i]);
printf(" ] 인가요? [ Y / N ] : ");
scanf("%s", &YN);
if (YN == 'Y' || YN == 'y') {
printf("\n\n정답이군요!! 게임 끝!! [사용 기회 : %d번]\n\n", count);
Sleep(500);
exit(1);
}
else if (YN == 'N' || YN == 'n') {
printf("잘못된 정보를 주신 것 같아요... ㅜ.ㅜ\n게임을 다시 시작합니다..\n\n");
Sleep(500);
main();
}
}
if (count >= opp) {// 시도횟수 가 초과했을 때 게임오버 & 재도전
printf("\n아쉽게도 주어진 기회안에 정답을 맞추지 못했습니다... ㅜ.ㅜ\n\n");
printf("%d번의 기회를 다 쓰셨습니다! 다시 시작하시겠습니까? [ Y / N ] :", op);
scanf("%s", &YN);
if (YN == 'Y' || YN == 'y') {
printf("게임을 다시 시작합니다..\n\n");
Sleep(500);
main();
}
else if (YN == 'N' || YN == 'n') {
printf("게임을 종료합니다..");
Sleep(500);
exit(1);
} // 입력에 따라 재도전 혹은 종료
}
while (1) {
if ((sm[sc - 1] > sm[sc - 2] && bm[bc - 1] == bm[bc - 2]) || (sm[sc - 1] == sm[sc - 2] && bm[bc - 1] > bm[bc - 2]) || (sm[sc - 1] > sm[sc - 2] && bm[bc - 1] < bm[bc - 2])) {// s,b 변화가 긍정적일 때 고정하기
if (sm[sc - 1] + bm[bc - 1] != 4) {
fix[fc] = j;
fc++;
}
if (sm[sc - 1] > sm[sc - 2] && bm[bc - 1] == bm[bc - 2]) {
as[ac] = j;
ac++;
printf("\nb'\n");
}
printf("\nb\n");
}
if (sm[sc - 1] < sm[sc - 2] && bm[bc - 1] > bm[bc - 2] && ans == 0) {// 스트라이크 감소 & 볼 증가 (변화가 부정적)일 때 되돌리기
j = temm[tc - 1];
k = tlm[tc - 1];
if (sm[sc - 1] + bm[bc - 1] != 4) {
fix[fc] = j;
fc++;
}
as[ac] = j;
ac++;
tem = ans[j];
ans[j] = ans[k];
ans[k] = tem;
sm[sc - 1] = sm[sc - 2];
bm[bc - 1] = bm[bc - 2];
printf("\n2\n");
}
else if (sm[sc - 1] + bm[bc - 1] < sm[sc - 2] + bm[bc - 2]) {// s,b의 변화가 안좋으면 되돌리기
j = temm[tc - 1];
k = tlm[tc - 1];
if (sm[sc - 1] + bm[bc - 1] != 4) {
fix[fc] = j;
fc++;
}
tem = ans[j];
ans[j] = ans[k];
ans[k] = tem;
sm[sc - 1] = sm[sc - 2];
bm[bc - 1] = bm[bc - 2];
printf("\nc\n");
if ((sm[sc - 1] < sm[sc - 2] && bm[bc - 1] == bm[bc - 2]) || (sm[sc - 1] < sm[sc - 2] && bm[bc - 1] > bm[bc - 2])) {
as[ac] = j;
ac++;
printf("\nc'\n");
}
}
for (i = 0; i < fc; i++)// 답으로 확인되는 위치는 고정 [s,b 둘다]
printf("[%d]", fix[i]);
for (i = 0; i // 답으로 확인되는 위치는 고정 [s 만]
printf("{%d}", as[i]);
if (sm[sc - 1] + bm[bc - 1] != 4 && ans == 0) {// 숫자 바꾸기
//rn = rand() % 4;
no = 0;
rn = 0;
rn2 = rand() % 6 + 4;
if (tc != 0 && rn == temm[tc - 1])
rn = (rn + 1) % 4;
for (i = 0; i <= fc - 1; i++) {
for (j = i + 1; j <= fc; j++) {
printf("[%d]", fix[i]);
printf("->[%d]", fix[j]);
if (fix[i] > fix[j]) {
temp = fix[j];
fix[j] = fix[i];
fix[i] = temp;
printf("[%d].", fix[i]);
}
}
}
for (i = 0; i < fc; i++) {
if (rn == fix[i] && rn != 3)
rn += 1;
if (fix[i] == 4)
no = 1;
}
if (no == 0) {
tem = ans[rn];
ans[rn] = ans[rn2];// 중복되지 않는 수와 바꾸기
ans[rn2] = tem;
temm[tc] = rn;// 바꿨던 위치 기억
tlm[tc] = rn2;
tc++;
printf("\n6\n");
}
}
else if (sm[sc - 1] + bm[bc - 1] == 4) {// 위치 바꾸기
//rn = rand() % 2;
ans = 1;
no = 0;
rn = 0;
rn2 = rand() % 4;
if (tc != 0 && rn == temm[tc - 1])
rn = (rn + 1) % 4;
//if (sm[sc - 1] == bm[bc - 1]) {
//}
for (i = 0; i
if (rn == as[i] && rn != 3)
rn += 1;
if (as[i] == 4)
no = 1;
}
if (no = 0) {
tem = ans[rn];
ans[rn] = ans[rn2];// 중복되지 않는 수와 바꾸기
ans[rn2] = tem;
temm[tc] = rn;// 바꿨던 위치 기억
tlm[tc] = rn2;
tc++;
printf("\n7\n");
}
}
}
no = 0;
for (i = 3; i < cnt; i += 4) {// 이전 출력과 비교해 중복 확인
if (memory[i - 3] == ans[0] && memory[i - 2] == ans[1] && memory[i - 1] == ans[2] && memory[i] == ans[3]) {
no = 1;
printf("\n8\n");
ch += 1;
}
}if (ch > 2) {
error = 1;
break;
}
if (no == 1) {
//tc--;
continue;
}
for (i = 0; i < 4; i++) {// 숫자 출력
printf("%c", ans[i]);
memory[cnt] = ans[i];// 메모리에 저장
cnt++;
}printf(" - ");
scanf("%d%*c%d%*c", &strike, &ball);
sm[sc] = strike; sc++;
bm[bc] = ball; bc++;
count++;// 출력 직후 사용기회 ++
strike = 0;
ball = 0;
}
}
else if (sign == 0)
exit(1);
else if (sign != 0 && sign != 1) {// 메뉴에서 sign을 0,1 이외의 수를 입력했을 시 다시시작
printf("\n잘못 입력하셨습니다. 오류로 인해 게임이 종료됩니다..\n\n");
Sleep(500);
exit(1);
}
return 0;
}
이거 ans[]배열에서 식에 개체 포인터 형식이 있어야 한다는데.. 뭐죠?
컴파일 안해봤지만 이게 되요? { ans = 0 }, fc = 0, no, fix[10], ch = 0; char { ans[10] }, YN, tem;
앗 그렇네요.. 안지웠군요 감사합니다
뭐 일단 질문할때 탭은 제대로 넣어주세요...가독성이 떨어집니다...자동으로 들여쓰기 되는 에디터에서 복사하세요 그리고 '이거 ans[]배열에서 식에 개체 포인터 형식이 있어야 한다는데.. 뭐죠?' 이렇게 질문하기전에 실제 나오는 컴파일 에러 메세지를 올려주세요 그리고 공부하실때 도움되는것은 컴파일러 한국어 버전 깔지 마세요... 이 정도 질문 정도는 영문으로 나오면 구글에서 검색하면 수십개의 경우의 수가 나옵니다 개체 포인터 형식이 있어야 한다는 것은 보통 ans[10]이라고 배열로 선언 해놓구선 'if (sm[sc - 1] + bm[bc - 1] != 4 && ans == 0) {// 숫자 바꾸기 ' 이렇게 사용안합니다 뭐 컴파일러로 제대로 돌려본게 아니라 정확하지는 않더라도... 정성것 작성해도 답변안해주는게 프로그래밍인데...이렇게 작성하시면....OTL....ㅎㅎ
ㅜ.ㅜ 컴알못이라 죄송합니다..
10라인에 ans라는 변수가 int로 선언되었는데 12라인에 ans가 다시 char[]로 선언되고 있습니다 같은 이름의 변수가 다른 타입으로 중복 선언 되어서 에러가 나옵니다 10라인의 int를 ans2정도로 변경하고 226라인의 ans도 바꿔주면 컴파일 됩니다