본문 바로가기
C언어 프로젝트

[C언어] 타자게임 - 1 (문자열 비교)

by davidlee_ 2021. 5. 11.
반응형

아직 프로젝트 초기 단계라, 게임의 전체적인 틀을 짜기로 했다.
부가적인 요소들이 들어가기 위해서는 중심축이 있어야 살을 붙일 수 있기 때문이다.

먼저, 내가 구현할 사항은 크게 3가지 이다.
1. 사용자 입력값과 배열 내의 문자열 비교
2. 점수 시스템
3. 목숨 시스템

첫번째 구현 사항만 해결한다면 2,3은 어렵지 않게 해결할 수 있을 것이다.


1. 사용자 입력값과 배열 내의 문자열 비교


먼저, 문자열을 담기 위해 2차원 배열을 사용해 주었다.

char ex_word[5][20] = { "dog", "cat", "people", "watch", "cow" }; //단어들



배열에서 랜덤하게 문자열을 추출하기 위해 rand함수를 사용하였다.
rand함수는 <stdlib.h>에 포함되어 있다. 사용하기 전 미리 명시를 해 주어야한다.
위 배열에서 5개의 단어를 담았기때문에 0~4까지 값이 나올 수 있도록 %를 이용해 정수를(0,1,2,3,4) 추출했다.

int a; a = rand() % 5; //배열에서 단어 추출하기 위한 랜덤 인덱스 값



배열에 저장된 문자열을 출력하기 위해 서식지정자 %s를 사용하였다.
초기 실행코드를 제외한 모든 코드들은 while반복문에서 무한히 반복 시킬 것 이기 때문에, 반복문이 실행 될때 마다 랜덤한 문자열이 출력될 것이다.

printf("%s\n", ex_word[a]); //배열에서 랜덤 추출된 단어 출력


사용자의 문자열은 scanf 함수를 사용하여 받아왔다.
문자열을 받기 위한 배열도 선언하였다.

char input[10]; //입력받을 단어 배열 
scanf("%s", input); //사용자 입력 문자열 받아오기




문자를 비교하기 위해 strcmp 함수를 사용하였다.
strcmp함수 사용법에 관해 dojang.io/mod/page/view.php?id=346에 자세히 나와있으니 참고하면 좋을 것 같다.
strcmp함수는 strcmp(s1, s2)와 같이 두개의 문자열을 비교한 후 결과를 정수값으로 반환해준다.
반환 기준은 이 이미지를 참고하면 좋을 것 같다.

출처:&nbsp;https://dojang.io/mod/page/view.php?id=346



나는 문자열을 비교하여 완전히 일치하는지 아닌지만 판별하면 되기 때문에 아스키코드값을 고려할 필요는 없었다.

int a; //랜덤 숫자 받을 변수 
check = strcmp(input, ex_word[a]); //문자열 비교 
switch (check) // 문자열 비교값에 따른 출력 
{
case 0:
	gotoxy(COLS / 2 - 5, 10);
	printf("맞았습니다!\n");
	score = score + 10;
	break;
case 1:
	gotoxy(COLS / 2 - 5, 10);
	printf("틀렸습니다!\n");
	heart = heart - 1;
	break;
case -1:
	gotoxy(COLS / 2 - 5, 10);
	printf("틀렸습니다!\n");
	heart = heart
}

각각의 반환값에 따른 case를 만들었다. 위 코드에 보이는 gotoxy함수는 따로 정의한 함수로, 마우스 커서의 위치를 옮기는 함수이다. 또한 아래에서 언급할 score와 heart(목숨)의 값도 변경 시켜주었다.




문자열을 비교 판별해주는 작업은 끝났다.
이제 점수, 목숨 시스템만 얹어주면 된다.

2. 점수 시스템


아래는 점수시스템 코드이다.

int score = 0; //점수 변수
if (score==50) // 점수에 따른 동작
{
    system("cls"); // 콘솔창 초기화
    gotoxy(COLS / 2 - 10, LINES / 2);
    printf("1단계를 클리어 하셨습니다!");
    Sleep(2000); //2초 딜레이
    return 1;
    break;
    
}

일정 점수에 도달하면 반복문을 빠져나가도록 하게 하였다. (위에서 언급했듯 모든 코드들은 while반복문 안에 넣어 무한히 반복된다.) COLS와 LINES는 따로 정의한 기호 상수이다.
Sleep함수는 <time.h>에 포함되어 있는 딜레이 함수이다. (ms단위)

3. 목숨 시스템


아래는 목숨시스템 코드이다.

int heart = 5; //남은 목숨 변수
switch (heart) // 목숨값에 따른 체력바
{
    case 0:
        gotoxy(110, 0);
        printf("□□□□□\n");
        break;
    case 1:
        gotoxy(110, 0);
        printf("□□□□■\n");
        break;
    case 2:
        gotoxy(110, 0);
        printf("□□□■■\n");
        break;
    case 3:
        gotoxy(110, 0);
        printf("□□■■■\n");
        break;
    case 4:
        gotoxy(110, 0);
        printf("□■■■■\n");
        break;
    case 5:
        gotoxy(110, 0);
        printf("■■■■■\n");
        break;
        
} else if (heart==0) //목숨이 0이 되었을때의 동작
{
    system("cls"); // 콘솔창 초기화
    gotoxy(COLS / 2 - 10, LINES / 2);
    printf("게임오버");
    Sleep(2000); //2초 딜레이
    return 0;
    break;
}

숫자로 목숨을 출력하는 것이 아닌, 체력바로 남은 목숨이 출력되도록 하였다.
heaet값이 변경될때마다 체력바가 업데이트 되도록 하였다.




아래는 전체 코드이다.

int game_test()
{
    char input[10]; //입력받을 단어 배열
    char ex_word[5][20] = { "dog", "cat", "people", "watch", "cow" }; //단어들
    int a; //랜덤 숫자 받을 변수
    int check; //문자열 비교한 값 담는 변수
    int score = 0; //점수 변수
    int heart = 5; //남은 목숨 변수
    system("mode con cols=120 lines=45");
    system("cls"); // 콘솔창 초기화
    srand(time(NULL));
    gotoxy(110, 0);
    printf("■■■■■\n"); //체력바 테스트
    while (1) {
        a = rand() % 5; //배열에서 단어 추출하기 위한 랜덤 인덱스 값
        gotoxy(COLS/2-5, 3);
        printf("%s\n", ex_word[a]); //배열에서 랜덤 추출된 단어 출력
        gotoxy(COLS / 2 - 5, 5);
        scanf("%s", input); //사용자 입력 문자열 받아오기
        system("cls"); // 콘솔창 초기화
        check = strcmp(input, ex_word[a]); //문자열 비교
        switch (check) // 문자열 비교값에 따른 출력
        {
            case 0:
                gotoxy(COLS / 2 - 5, 10);
                printf("맞았습니다!\n");
                score = score + 10;
                break;
            case 1:
                gotoxy(COLS / 2 - 5, 10);
                printf("틀렸습니다!\n");
                heart = heart - 1;
                break;
            case -1:
                gotoxy(COLS / 2 - 5, 10);
                printf("틀렸습니다!\n");
                heart = heart - 1;
                break;
                
        }
        switch (heart) // 목숨값에 따른 체력바
        {
            case 0:
                gotoxy(110, 0);
                printf("□□□□□\n");
                break;
            case 1:
                gotoxy(110, 0);
                printf("□□□□■\n");
                break;
            case 2:
                gotoxy(110, 0);
                printf("□□□■■\n");
                break;
            case 3:
                gotoxy(110, 0);
                printf("□□■■■\n");
                break;
            case 4:
                gotoxy(110, 0);
                printf("□■■■■\n");
                break;
            case 5:
                gotoxy(110, 0);
                printf("■■■■■\n");
                break;
        }
        if (score==50) // 점수에 따른 동작
        {
            system("cls"); // 콘솔창 초기화
            gotoxy(COLS / 2 - 10, LINES / 2);
            printf("1단계를 클리어 하셨습니다!");
            Sleep(2000); //2초 딜레이
            return 1;
            break;
            
        }
        else if (heart==0) //목숨이 0이 되었을때의 동작
        {
            system("cls"); // 콘솔창 초기화
            gotoxy(COLS / 2 - 10, LINES / 2);
            printf("게임오버");
            Sleep(2000); //2초 딜레이
            return 0;
            break;
        }
    }
}




일단 이번주에 맡은 부분은 얼추 마무리가 된 것 같다.
아직 게임을 완성한 것은 아니지만 추가기능을 얹기 위한 틀은 잡힌 것 같다.

반응형

댓글