#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ENTER 0x0d // ENTER 키 코드
#define ESC 0x1b // ESCAPE 키 코드
#define BEL 0x07 // 벨 코드, putch(BEL)을 수행하면 삑 소리가 난다.
#define UPDATE_TIME 500 // 500 msec
void initialize(); // 변수 및 화면을 초기화 할 함수
void play_game(); // 게임의 진행 상태를 제어하는 함수
int get_key(); // 키보드가 눌렸는지 검사하여 키 값을 입력하는 함수
void match(int); // 입력한 키 값이 화면의 영문자와 일치하면 화면에서 지우는 함수
int update_screen(); // 화면을 갱신하는 함수
void clear_screen(); // 화면을 모두 공백으로 채우는 함수
void cursor_off(); // 커서를 없애는 함수
void gotoxy(int, int); // 화면에 출력할 위치를 설정하는 함수
unsigned char scr[25][80];
int game_state;
int update_time;
int score;
void main()
{
initialize(); // 화면을 초기화 하고
play_game(); // 게임을 시작한다.
}
// 게임을 진행하는 함수
void play_game()
{
int key;
while (game_state != 10) {
key = get_key();
if (key == ESC) game_state = 10;
switch(game_state) { // 게임의 상태에 따라 게임을 제어한다.
case 0: // 초기 상태
if (key == ENTER) { // ENTER 키가 눌려졌으면,
game_state = 1; // 상태를 1로 만들고,
score = 0; // 점수를 0으로 만들고
clear_screen(); // 화면을 지운다.
update_time = clock() + UPDATE_TIME; // 아래 참조
}
break;
case 1: // 게임 진행 상태
// clock()은 호줄될 때마다 프로그램 수행 시간을 리턴하므로,, 500 msec가 지난 후
// 조건이 true로 된다.
if (clock() > update_time) {
// 화면을 갱신하고, 영문자가 화면의 맨 아랫줄에 도달하면 1을 리턴한다.
if (update_screen() == 1) {
game_state = 2; // 게임의 상태를 2로 만든다. - game over
}
// 다음 화면 갱신 시간을 설정한다.
update_time = clock() + UPDATE_TIME;
}
if (key != 0) // 만일 키보드가 눌려졌으면,
match(key); // 키 값과 화면의 영문자를 비교하여 화면에서 제거한다.
break;
case 2: // 게임 종료
gotoxy(20, 8); printf("G A M E O V E R");
gotoxy(20, 10); printf("당신의 점수는 %d점입니다.", score);
gotoxy(20, 12); printf("게임을 다시 시작하려면 ENTER를 치세요.");
game_state = 0; // 게임 상태를 0으로 만들어 다시 시작한다.
break;
}
}
}
// 4. 입력된 키 값과 화면의 영문자를 비교하여 제거하는 함수
// 입력 파라미터 k는 입력된 키 값이다.
void match(int k)
{
int y,x;
if(k >= 0x61)
{k = k-0x20;}
for(y=23;y>=0;y--)
{
for(x=0;x<=80;x++)
{
if(k==scr[y][x])
{
scr[y][x] = 0;
score++;
}
}
}
// 일치하는 영문자가 없으면, 삑 소리를 출력한다. - putch(BEL);\\\\\\
}
// 3. 화면을 갱신하는 함수
// 화면에 새로운 영문자를 추가하고, 화면의 영문자들을 한 칸씩 아래로 내린다.
// 맨 아랫줄에 영문자가 도달하면, 1을 리턴하여 게임 상태를 변경한다.
int update_screen()
{
int q,t,a,x,y,z,ret=0;
for(y=23;y>=0;y--)
{
for(x=0;x<80;x++)
{
if(scr[x][y]!=0)
{
if(y=23)
{
ret = 1;
break;
}
a=y;
t=scr[x][a];
scr[x][a-1]=t;
scr[x][a] = 0;
}
}
}
q=rand()%80;
z=rand()%26;
scr[0][q]=0x41+z;
ret=0;
for(y=23;y>=0;y--)
{
for(x=0;x<80;x++)
{
if(scr[x][y]!=0)
{
putch(scr[x][y]);
}
}
}
return ret;
}
// 리턴할 변수의 값을 0으로 만든다.
// 리턴할 변수의 값을 1로 만든다
// 마지막으로 리턴 변수를 리턴한다.
void clear_screen()
{
int x,y;
for(y=0;y<24;y++)
{
for(x=0;x<80;x++)
{
gotoxy(x,y); printf(" ");
}
}
}
void initialize()
{
srand(time(NULL));
cursor_off();
game_state = 0;
gotoxy(24, 10); printf("====== 타 자 연 습 ======");
gotoxy(20, 12); printf("게임을 시작하려면 ENTER를 치세요.");
}
int get_key()
{
int key; // local 변수
key = 0; // 일단 key 값을 0으로 만든다.
if ( _kbhit() )
{ // 만일 키보드가 눌려졌으면,
gotoxy(25, 40);
key = _getch(); // 키 코드를 읽는다.
if (key == 0xe0)
{ // function key가 눌려졌다면
key = _getch(); // 키 코드를 다시 읽는다.
key = 0x1000 + key; // 0x1000을 더하여, function key가 눌려졌음을 표시한다.
}
}
return key;
}
void gotoxy(int x, int y)
{
COORD Pos = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
void cursor_off()
{
CONSOLE_CURSOR_INFO Coff = { 100, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Coff);
}
이게 소슨데 뭔가 부족한걸 느끼는데 어딘지 모르겠어 ㅜㅜ
능력자형들 부탁해 ㅜㅜ
조공짤올림
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.