본문 바로가기

프로그래밍 언어들/C

20141123_C언어 오목게임

C언어로 구현한 오목 게임입니다.


아래 소스코드는 컴퓨터와의 대전이 아니라 2인 플레이로 진행됩니다.


약간의 인공지능을 넣은 컴퓨터와의 대전을 구현한 오목은 첨부파일에 있습니다.





#include <stdio.h>

#include <windows.h>

#define LEFT 75

#define RIGHT 77

#define UP 72

#define DOWN 80

#define SPACE 32

#define MAP_X 39

#define MAP_Y 24

#define ESC 27

#define U1 1

#define U2 2

typedef struct XY{

int x;

int y;

}xy;

gotoxy(int x, int y)

{

COORD pos = {x, y};

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

}

void initGame()

{

int i = 0, k = 0;

for(i = 0 ; i < MAP_Y ; i ++)

{

for(k = 0 ; k < MAP_X ; k ++)

{

if(i == 0)

{

if(k == 0)

printf("┌");

else if(k+1 == MAP_X)

printf("┐");

else

printf("┬");

}

else if(i+1 < MAP_Y)

{

if(k == 0)

printf("├");

else if(k+1 == MAP_X)

printf("┤");

else

printf("┼");

}

else

{

if(k == 0)

printf("└");

else if(k+1 == MAP_X)

printf("┘");

else

printf("┴");

}

}

printf("\n");

}

}

int searchStone(xy hd, int GMap[MAP_Y][MAP_X], int flag, int p, int sw)

{

if(GMap[hd.y][hd.x] != flag) return 0;

if(p == 0) // 위 아래 탐색

{

hd.y += sw;

}

else if(p == 1) // 좌 우 탐색

{

hd.x += sw;

}

else if(p == 2) // 왼쪽 위 -> 오른쪽 아래

{

hd.x += sw;

hd.y += sw;

}

else // 오른쪽 위 -> 왼쪽 아래

{

hd.x += sw;

hd.y -= sw;

}

return 1 + searchStone(hd, GMap, flag, p, sw);

}

void checkStone(xy hd, int GMap[MAP_Y][MAP_X], int turn)

{

int i = 0, countStone = 0;

for(i = 0 ; i < 4 ; i ++)

{

countStone = 0;

countStone += searchStone(hd, GMap, turn, i, 1);

countStone += searchStone(hd, GMap, turn, i, -1);

if(countStone == 6)

{

gotoxy(0,MAP_Y);

if(turn == U1)

printf("사용자 1");

else

printf("사용자 2");

printf("님이 승리하셨습니다.!");

getch();

exit(1);

}

}

}

void startGame(int GMap[MAP_Y][MAP_X])

{

char ip = '\0';

int turn = U1;

xy hd = {MAP_X/2, MAP_Y/2};

while(1)

{

if(kbhit())

{

ip = getch();

switch(ip)

{

case LEFT:

if(hd.x > 0)

hd.x -= 1;

break;

case RIGHT:

if(hd.x < MAP_X-1)

hd.x += 1;

break;

case UP:

if(hd.y > 0)

hd.y -= 1;

break;

case DOWN:

if(hd.y < MAP_Y-1)

hd.y += 1;

break;

case SPACE:

if(GMap[hd.y][hd.x] == 0)

{

gotoxy(hd.x*2, hd.y);


if(turn == U1)

{

GMap[hd.y][hd.x] = U1;

printf("●");

checkStone(hd, GMap, turn);

turn = U2;

}

else

{

GMap[hd.y][hd.x] = U2;

printf("○");

checkStone(hd, GMap, turn);

turn = U1;

}

}

break;

case ESC:

exit(1);

break;

}

gotoxy(hd.x*2, hd.y);

}

}

}

int main()

{

int GMap[MAP_Y][MAP_X]={0,};

printf("> 2인용 오목게임\n");

printf("> KEY - 방향키, 스페이스\n");

printf("      - 종료(ESC)\n\n");

printf("게임을 시작하시려면 아무키나 누르세요");

getch();

system("cls");

initGame();

startGame(GMap);

}