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);
}
'프로그래밍 언어들 > C' 카테고리의 다른 글
두 개의 쓰레드를 활용한 병합정렬(merge sorting) (0) | 2015.01.22 |
---|---|
단일 쓰레드 병합 정렬(Merge sorting) (0) | 2015.01.22 |
20141127_C언어 하트 피하기 게임 (0) | 2014.11.27 |
20141124_단일 연결리스트(singly linked list)_노드 삭제 함수(delNode) (0) | 2014.11.24 |
20141123_단일 연결리스트(singly linked list)_노드 추가 함수(addNode) (0) | 2014.11.23 |