#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <conio.h>
#define MAX 5
#define ESC 27
void start_metrix();
void restart_end_metrix();
void exit_function(char metrix[][MAX]);
void user_end(char metrix[][MAX]);
void sleep(int nbr_seconds) {
clock_t goal;
goal = (nbr_seconds*CLOCKS_PER_SEC) + clock();
while(goal>clock()){;}
}
void sleep_computer() {
for(int p=0;p<1;p++) {
printf("\nComputer Thinking >");
sleep((int)1);
}
}
void user_end(char metrix[][MAX]) {//user가 끝나는 경우를 조사
int i,j;
int cnt=0;
for(i=0;i<MAX;i++) {
for(j=0;j<MAX;j++) {
if(metrix[i][j]=='O') {
cnt++; //가로로 conut
}
if(cnt==MAX) {
printf("\nUser1 win");
restart_end_metrix();
}
}
cnt=0;
}
cnt=0;
for(j=0;j<MAX;j++) {
for(i=0;i<MAX;i++) {
if(metrix[i][j]=='O') {
cnt++; //세로로 conut
}
if(cnt==MAX) {
printf("\nUser2 win");
restart_end_metrix();
}
}
cnt=0;
}
cnt=0;
for(i=0 ;i<MAX;i++) {
for(j=0;j<MAX;j++) {
if(i==j) {
if(metrix[i][j]=='O') cnt++; {//오른족 대각선 count
if(cnt==MAX) {
printf("\nUser3 win");
restart_end_metrix();
}
}
}
}
}
i=0;
j=MAX-1;
cnt=0;
while(i!=MAX && j!=-1) {
if(metrix[i][j]=='O') cnt++; {//왼쪽 대각선 count
if(cnt==MAX) {
printf("\nUser4 win");
restart_end_metrix();
}
}
i++;
j--;
}
}
void display_metrix(char metrix[][MAX]) {
system("cls");
for (int i=0;i<MAX;i++) {
for(int j=0;j<MAX;j++) {
printf("\t%c",metrix[i][j]);
if(j==(MAX-1)) printf("\n");
}
}
exit_function(metrix);
user_end(metrix);
}
void bingo_com_leftline(char metrix[][MAX]) {//컴퓨터가 빙고 하기 위해 왼쪽대각선 조사
int i=0,j=MAX-1,cnt=0;
while(i!=MAX && j!=-1) {
if(metrix[i][j]=='X') cnt++; {//왼쪽 대각선 count
if(cnt==MAX-1) {
i=0;//
j=MAX-1;
while(i!=MAX && j!=-1) {
if(metrix[i][j]=='-') {
metrix[i][j]='X';
display_metrix(metrix);
printf("\n\t Computer Win");
restart_end_metrix(); //빙고
}
i++;
j--;
}
}
}
i++;
j--;
}
}
void bingo_com_rightline(char metrix[][MAX]) {
int i=0,j=0,cnt=0;
for(i=0 ;i<MAX;i++) {
for(j=0;j<MAX;j++) {
if(i==j) {
if(metrix[i][j]=='X') cnt++; {//오른족 대각선 count
if(cnt==MAX-1) {
for(i=0;i<MAX;i++) {
for(j=0;j<MAX;j++) {
if(i==j) {
//while(j!=MAX && i!=MAX) { //빈곳을 찾아서 찍음
if(metrix[i][j]=='-') {
metrix[i][j]='X';
display_metrix(metrix);
printf("\n\t Computer Win");
restart_end_metrix(); //빙고
}
}
}
}
}
}
}
}
}
}
void bingo_com_length(char metrix[][MAX]) { //세로조사
int i,j,k;
int cnt=0;
for(j=0;j<MAX;j++) {
for(i=0;i<MAX;i++) {
if(metrix[i][j]=='X') cnt++; //세로로 conut
if(cnt==MAX-1) {
for(k=0;k<MAX;k++) { //
if (metrix[k][j]=='-') {//Computer가 빙고가 가능하면
metrix[k][j]='X';
display_metrix(metrix);
printf("\n%d %d %d",i,j,k);
printf("\n\t Computer Win");
restart_end_metrix(); //빙고
}
}
}
if(i==MAX-1) cnt=0; //한줄을 다 찾으면
}
}
}
void bingo_com_width(char metrix[][MAX]) {
int i,j,k;
int cnt=0;
for(i=0;i<MAX;i++) {
for(j=0;j<MAX;j++) {
if(metrix[i][j]=='X') cnt++; //가로로 conut
if(cnt==MAX-1) {
for(k=0;k<MAX;k++) {
if (metrix[i][k]=='-') {//Computer가 빙고가 가능하면
metrix[i][k]='X';
display_metrix(metrix);
printf("\n\t Computer Win");
restart_end_metrix(); //빙고
}
}
}
if(j==MAX-1) cnt=0; //한줄을 다 찾으면
}
}
}
int select_computer(char metrix[][MAX]) {
static int cnt=0;
int x,y;
if(metrix[MAX/2][MAX/2]=='-') { //중간지점이 비었는으면 먼저 선점
metrix[MAX/2][MAX/2]='X';
}
else {
bingo_com_width(metrix);
bingo_com_length(metrix);
bingo_com_rightline(metrix);
bingo_com_leftline(metrix);
for (int i=0;i<10;i++) {
for(int j=0;j<MAX;j++) {//랜덤으로 찍어줌
x=(unsigned int)time(NULL)*rand()%MAX;
y=(unsigned int)time(NULL)*rand()%MAX;
}
if(metrix[x][y]=='-') {
metrix[x][y]='X';
break;
}
}
}
return cnt++;
}
void select_person(char metrix[][MAX]) {
int count=0;
int x,y;
printf("\n행의 값을 입력하시오(0~%d) ",MAX-1);
scanf("%d",&x);
printf("\n열의 값을 입력하시오(0~%d) ",MAX-1);
scanf("%d",&y);
if(metrix[x][y]!='-') {
printf("\n다시 입력하시오");
select_person(metrix);
}
else {
metrix[x][y]='O';
}
}
void first_computer(char metrix[][MAX]) {
for(int i=0;i<MAX*MAX/2+1;i++) {
sleep_computer();
select_computer(metrix); //컴퓨터가 찍음
display_metrix(metrix);
select_person(metrix); //사람이 찍음
display_metrix(metrix);
}
}
void first_person(char metrix[][MAX]) {
for(int i=0;i<MAX*MAX/2+1;i++) {
select_person(metrix); //사람이 찍음
display_metrix(metrix);
sleep_computer();
select_computer(metrix); //컴퓨터가 찍음
display_metrix(metrix);
}
}
void inital(char metrix[][MAX]) {
for (int i=0;i<MAX;i++) {
for(int j=0;j<MAX;j++) {
metrix[i][j]='-';
}
}
}
void exit_function(char metrix[][MAX]) {
int count=0;
char ch;
for (int i=0;i<MAX;i++) {
for(int j=0;j<MAX;j++) {
if (metrix[i][j]=='O' || metrix[i][j]=='X') {
count = count + 1;
}
if (count==MAX*MAX-1) {
printf("\n계속하시겠습니까?(y or n or ESC(종료))");
ch=getch();
if (ch=='N' || ch=='n') exit(1);
else if (ch==ESC) exit(1);
else start_metrix();
}
}
}
}
void start_metrix() {
char metrix[MAX][MAX];
int com;
int per;
char ch;
while(1) {
inital(metrix);
com=((unsigned int)time(NULL)*rand())%2;
printf("\n(0 또는 1의 임의의 수를 입력하시오)");
scanf("%d",&per);
if (com==per) {
printf("\n먼저 공격하시오");
first_person(metrix);
printf("\n계속하시겠습니까?(y or n or ESC(종료))");
ch=getch();
if (ch=='N' || ch=='n') break;
else if (ch==ESC) exit(1);
else ;
}
else {
printf("\nComputer 먼저 공격합니다");
first_computer(metrix);
printf("\n계속하시겠습니까?(y or n or ESC(종료))");
ch=getch();
if (ch=='N' || ch=='n') break;
else if (ch==ESC) exit(1);
else ;
}
}
}
void restart_end_metrix() {
char ch;
printf("\n계속하시겠습니까?(y or n or ESC(종료))");
ch=getch();
if (ch=='N' || ch=='n') exit(1);
else if (ch==ESC) exit(1);
else start_metrix();
}
int main() {
start_metrix();
return 0;
}
'Language > C & C Plus' 카테고리의 다른 글
[C] 미로 게임(2가지 버전) 파일있음 (0) | 2012.07.13 |
---|---|
[C] 퍼즐맞추기 게임 (0) | 2012.07.13 |
[C] 몇초간 정지 시키기 (0) | 2012.07.13 |
[C] 포인터를 사용하여 다차원 배열을 함수에 전달하기 (0) | 2012.07.13 |
[C] scanf() 함수 사용시 주의 사항 및 처리 방법에 대하여 (0) | 2012.07.13 |