티스토리 뷰


프로젝트 이름 : 효민타자연습기

프로젝트 주제 : 영어타자 속도를 늘릴 수 있는 영타자 게임

만든 동기 : 입학 후 영타가 느려 영타연습을 많이 했는데 영타자 연습 겸 타자게임을 만들어 보고 싶어서 만들었다.

게임 소개 : 화면에서는 색깔이 다른 영단어들이 사방팔방 뜨게 된다. 색깔마다 점수 배점이 다르고, 사방팔방 단어가 계속 뜨는 동안에 입력을 해서 화면에 뜬 단어를 없애고 점수를 얻는다. 점수는 왼쪽 상단에 표시가 된다. 그리고 메인 메뉴에서 도움말과 나의 최고 점수를 확인 할 수 있다. 기존 최고 점수보다 게임 점수가 높다면 최고 점수는 갱신이 된다. 게임은 30초 동안 진행되고 30초가 지나면 메인 메뉴로 돌아가게 된다.

게임 화면 :


게임 초기 화면


게임 실행 중 화면

게임 도움말

출력 과 입력은 위 사진처럼 중간에 그어진 선을 통해 분리 된다.

코드: 



#pragma warning(disable:4996)

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

#define wordmax 103//단어의 개수

#define wordtime 23000//단어가 뜨는 속도


time_t startTime = 0, endTime = 0;// 게임 시간 제한

int gap;


void gotoxy(int x, int y)//커서 위치 조정 함수

{

COORD Pos = { x - 1, y - 1 };

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}


void help();// 도움말

void gamemain();// 게임메인

void printword();//단어뜨게 해주는 함수

void scanword();//단어를 입력 받는 함수

void design();//게임 디자인

void start();//게임 시작 초기 화면

void bestscore();//최고점수 갱신

void removeCursor();// printf에서 단어를 뜨게할때 커서 제거


char word[256][256] = { "dog", "cat", "bottle", "phone", "robot", "green", "elephant", "include", "sky", "game", "hyomin", "jaemin", "max",//단어 DB

"knife", "glass", "class", "art", "smart", "bell", "carry", "climb", "between", "blow", "album", "ago", "among", "animal", "any", "box",

"and", "board", "body", "child", "classmate", "city", "boy", "bridge", "clean",

"club", "coat", "bright", "coin", "chopstick", "coffee", "cold", "chance", "chalk", "chair", "cheap", "blue",

"before", "bowl", "aunt", "as", "away", "bicycle", "church", "card", "hold",

"chose", "come", "drink", "give", "get", "hurt", "lay","had", "feed", "lend", "met", "wsing", "throw", "wet", "tell",

"set", "wind", "wear", "write", "spend", "stand", "worn", "win", "sweep", "account", "achieve", "across", "accept", "above", "ability", "abuse",

"abnormal", "absurd", "acceptance", "according", "absent", "nation", "past", "value", "though", "person", "machine", "stand", "null" };

int wordi[250];//한 번뜬 단어들은 안뜨게 해주기 위해 만들어놈

int x, y;// gotoxy 의 x값과 y값

int i;//단어 수

int j, k;

int a;//단어 수 와 같은 수 변수

int s;//kbhit

int c;//반복문배열

int x2, y2;// x,y값을 다시 불러올 때 변수

int g;

int score1 = 0;//점수

int h;//초기화면에서 입력 받을때 변수

int f;// 색깔

int f2;// 색깔 값을 다시 불러올때 변수

int sword;

int level = 1;

int bestsc = 0;

char scan[50];

char remem[256][3] = { 0 };//


int main() {

srand((unsigned)time(NULL));

system("mode con cols=120 lines=30");

design();

Sleep(1500);

gotoxy(60, 9);

removeCursor();

start();

while (1) {

gotoxy(60, 15);

scanf("%d", &h);

gotoxy(60, 15);


switch (h)

{

case 1: score1 = 0; startTime = clock(); gamemain(); gap = 0; break;

case 2: help(); break;

case 3: bestscore(); break;

case 4: return 0; break;


default:

printf("올바른 키가 아닙니다!");

break;

}

}


}





void design() {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);

printf("|---------------------------------------------------------------------------------------------------------------------|\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|---------------------------------------------------------------------------------------------------------------------|\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|                                                                                                                     |\n");

printf("|---------------------------------------------------------------------------------------------------------------------|");




}


void help() {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);

system("cls");

design();

gotoxy(40, 7);

printf("-선린인터넷고등학교 10319 이효민 제작\n");

gotoxy(40, 9);

printf("-사방팔방 뜨는 단어들을 빨리 입력하여 없애주세요!\n");

gotoxy(40, 11);

printf("-색마다 점수 배점이 다릅니다!");

gotoxy(40, 12);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 1);

printf("이 색 : 150점 ");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);

printf("이 색 : 200점 ");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3);

printf("이 색 : 250점 ");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);

printf("이 색 : 300점 ");

gotoxy(40, 14);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);

printf("-30초 동안 게임이 진행됩니다!! 끝나면 자동으로 종료됩니다.");

gotoxy(40, 15);

printf("-최고점수가 저장됩니다. 메인메뉴 3. 점수보기에서 확인 가능합니다.\n");

gotoxy(40, 16);

printf("-아무키나 누르면 메인 메뉴로 돌아갑니다.\n");


g = getch();

if (_kbhit)

{

start();

}


}



void bestscore() {

system("cls");

design();

if (bestsc < score1)

{

bestsc = score1;

}

gotoxy(50, 7);

printf("최고점수 : %d", bestsc);


gotoxy(40, 13);

printf("아무키나 누르면 메인 메뉴로 돌아갑니다.\n");

g = getch();

if (_kbhit)

{

start();

}


}

void gamemain() {

system("cls");

design();

gotoxy(50, 9);

printf(" 3초 후 시작 !!");

Sleep(1000);

system("cls");

design();

gotoxy(50, 9);

printf(" 2초 후 시작 !!");

Sleep(1000);

system("cls");

design();

gotoxy(50, 9);

printf(" 1초 후 시작 !!");

Sleep(1000);

system("cls");

design();

while (1) {

printword();

scanword();

}



}

void printword() {

static int check = wordmax;

x = rand() % 105 + 5;

y = rand() % 19 + 3;

i = rand() % wordmax;

f = rand() % 4 + 1;

if (wordi[i] != 1) {

wordi[i] = 1;

check--;

gotoxy(x, y);

for (j = 0; j < 3; j++)

{

if (j == 0) {

remem[i][j] = x;

}

else if(j == 1){

remem[i][j] = y;

}

else if (j == 2) {

remem[i][j] = f;

}

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), f);

printf("%s ", word[i]);

}

}





void scanword() {

int p = 0;

while (p < wordtime ) {

p++;

i = 0;

int scanc;

endTime = clock();

gap = (float)(endTime - startTime) / (CLOCKS_PER_SEC);

if (gap >30) { //게임지속시간 30s

system("cls");

design();

gotoxy(50, 11);

printf("---게 임 종 료---");

Sleep(2000);

main();

}

if (_kbhit()) {

scanc = getch();

if (scanc != 8 && scanc != 13) {

gotoxy(5, 25);

scan[sword++] = scanc;

printf("                 ");

gotoxy(5, 25);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);

printf("%s", scan);

}

else if (scanc == 8) {

gotoxy(1, 25);

printf("|                                                                                                                     |\n");

gotoxy(5, 25);

scan[--sword] = scanc;

if (sword == -1)

sword = 0;

printf("%s", scan);


}

else if (scanc == 13) {

sword = 0;

gotoxy(1, 25);

printf("|                                                                                                                     |\n");

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

{

if (!strcmp(scan, word[i]))

{

x2 = remem[i][0];

y2 = remem[i][1];

f2 = remem[i][2];

gotoxy(x2, y2);

printf("          ");

gotoxy(1, 25);

printf("|                                                                                                                     |\n");

switch (f2) {

case 1: score1 += 150; break;

case 2: score1 += 200; break;

case 3: score1 += 250; break;

case 4: score1 += 300; break;

default: break;

}

gotoxy(3, 2);

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);

printf("현재점수 :%d", score1);

}

}

for (i = 0; i < 50; i++) {

scan[i] = NULL;

}

}

}

}

}

void start() {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);

system("cls");

design();

gotoxy(50, 7);

printf(" 효민타자연습기 V1.0                        \n");

gotoxy(50, 8);

printf("-제작자 이효민           \n");

gotoxy(50, 9);

printf(" 1. 게임시작                  \n");

gotoxy(50, 10);

printf(" 2. 도움말                  \n");

gotoxy(50, 11);

printf(" 3. 점수 보기                \n");

gotoxy(50, 12);

printf(" 4. 게임 종료                  \n");

gotoxy(50, 14);

printf("  키를 누르세요                       \n");

}

void removeCursor()

{

CONSOLE_CURSOR_INFO curInfo;

GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);

curInfo.bVisible = 0;

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);

}



코드 구현에 대한 설명 : 먼저 함수를 선언함으로써 최대한 코드를 간단하게 하였다. 제일 중요한 메인게임 코드 구현에 대한 설명을 하자면, printword함수와 scanword함수를 나누었다. 화면에 출력하는 단어들은 rand 함수를 통해 x좌표, y좌표 값을 랜덤으로 받았고, gotoxy 사용자함수를 이용해 단어들이 랜덤으로 사방팔방 뜨게 만들었다. 그리고 색깔 4개중 한 색깔이 나오게 색깔 값도 랜덤으로 받았다. 그런 다음에 이차원배열을 통해 x, y, 색깔 값을 저장하였다 그 이유는 나중에 입력을 받고 지울 때 좌표를 다시 찾기 위해서 이다. 동시 입출력을 가능하게 만들기 위해 입력은 getch를 이용했다. getch는 입력을 받으면 화면에 안 뜨는 특징이 있는데 printf를 통해 입력 시 화면에 바로 출력 가능하게 만들었다. strcmp함수를 이용하여 문자열을 비교하고 참일시 점수가 올라가게 되어있다.


느낀 점 : C언어 첫 프로젝트여서 매우 효율적인 코드는 아닌 것 같다. 하지만 만들고 나니 뿌듯했고 다음에는 더 퀄리티가 높은 프로그램을 만들어야 겠다.


Comments