본문 바로가기
C언어

[c언어]Matrix(매트릭스)게임

by 코모's 2020. 4. 2.
반응형

Matrix.exe
0.04MB

 

 

#include <stdio.h>

#include <stdlib.h>

#include <Windows.h>

#include <time.h>

#include <conio.h> // kbhit(), getch()

 

#pragma warning (disable : 4996)

 

//방향키의 아스키 코드값

#define MAX 1024

#define LEFT 75

#define RIGHT 77

#define UP 72

#define DOWN 80

#define ESC 27

 

void gotoxy(int x, int y) 

{ 

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

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos); 

}

 

struct Signal

{

    bool exist;                // 신호의 존재 여부

    char ch;                 // 출력할 문자

    int x, y;                   // 현재 좌표

    int distance;           // 이동할 거리

    int nFrame;                 // 속도

    int nStay;               // 속도에 대한 카운트

};

 

Signal S[MAX];

 

void main()

{

    int i;

    int ch;

    int freq = 15;//빈도

    int frame = 200;//속도

 

    system("cls");

    gotoxy(1,23);

    printf("매트릭스 흉내내기. 상하:속도 증감, 좌우:빈도 증감, ESC:종료");

 

    srand((unsigned int)time(NULL));

 

    for (;;)//무한루프

    {

        gotoxy(60, 23);

        printf("\n속도:%d, 빈도:%d    ", frame, freq);

 

 

        // 키 입력 처리

 

        if (kbhit()) {//kbhit : 키입력함수 있으면 1, 없으면 0

            ch = getch(); //getch : 입력된 키의 아스키코드값

            if (ch == 0xE0) {//0xE0는 10진수로 224

                ch = getch();

                switch (ch) {

                case UP:

                    frame = min(frame + 10, 1000);

                    break;

                case DOWN:

                    frame = max(frame - 10, 10);

                    break;

                case RIGHT:

                    freq = max(freq - 1, 1);

                    break;

                case LEFT:

                    freq = min(freq + 1, 30);

                    break;

                }//switch

            }

            else {

                if (ch == ESC) {

                    return;

                }

 

            }//if (ch == 0xE0)

        }//if (kbhit())

    

 

     // 새로운 신호 생성

    if (rand() % (freq + 1) == 0) //random(freq) == 0

    {

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

            if (S[i].exist == FALSE) {

                S[i].exist = TRUE;

                S[i].ch = rand() % 26 + 65; //random('Z'-'A'+1)+'A'; A의 아스키 코드값 : 65 Z의 아스키코드값 90

                S[i].x = rand() % 81; //random(80);

                S[i].y = 0;

                S[i].distance = rand() % 15 + 9; //random(14)+9; 

                S[i].nFrame = S[i].nStay = rand() % 16 + 5;//random(15)+5;

                break;

            }

        }

    }//if(rand())

 

    // 주기가 다 된 신호 이동 및 제거 처리

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

        if (S[i].exist == FALSE)

            continue;

 

        if (--S[i].nStay == 0) {//속도프레임이 0이면(?)

            S[i].nStay = S[i].nFrame;

            gotoxy(S[i].x, S[i].y); 

            putch(' '); // putch() : 한개의 문자를 출력

            if (++S[i].y < S[i].distance) {//y값(0)이 이동할거리보다 작을경우 

                gotoxy(S[i].x, S[i].y); //x값을 다시 랜덤으로 받는다.

                putch(S[i].ch);//랜덤값 출력

            }

            else {

                S[i].exist = FALSE;

            }

        }

    }

    Sleep(1000 / frame);

 

    }//for(;;)    

 

}//main

 

반응형