디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

C++ 초보를 위한 강좌. 10. 작은 콘솔 프레임웍

codesafer갤로그로 이동합니다. 2016.10.17 17:54:17
조회 1960 추천 12 댓글 38
														

오늘은 여러분께 작은 선물을 준비했다.


낯선 표현들이 나오지만 다음강에서 설명할테니 잠시만 어리둥절 하자.


//==============================================================================================

#pragma warning(disable: 4996)  // _CRT_SECURE_NO_WARNINGS

#include "stdafx.h"

#include <array>

#include <stdio.h>

#include <conio.h>              // _kbhit

#include <Windows.h>

//------------------------------------------------------------------------------------------------


#define CRE                     // constructor mark


using   u8                      = unsigned  char;

using   u16                     = unsigned  short;

using   u32                     = unsigned  int;

using   uu                      = std::size_t;


//------------------------------------------------------------------------------------------------


constexpr   auto                make_color16( u8  l, u8  r, u8  g, u8  b )

{

    return  u8( l << 3 | r << 2 | g << 1 | b );

}


enum    class                   C4 : u8

{

    //                      +  R  G  B

    black   = make_color16( 0, 0, 0, 0 ),

    navy    = make_color16( 0, 0, 0, 1 ),

    green   = make_color16( 0, 0, 1, 0 ),

    teal    = make_color16( 0, 0, 1, 1 ),

    maroon  = make_color16( 0, 1, 0, 0 ),

    purple  = make_color16( 0, 1, 0, 1 ),

    olive   = make_color16( 0, 1, 1, 0 ),

    silver  = make_color16( 0, 1, 1, 1 ),

    gray    = make_color16( 1, 0, 0, 0 ),

    blue    = make_color16( 1, 0, 0, 1 ),

    lime    = make_color16( 1, 0, 1, 0 ),

    aqua    = make_color16( 1, 0, 1, 1 ),

    red     = make_color16( 1, 1, 0, 0 ),

    fuchsia = make_color16( 1, 1, 0, 1 ),

    yellow  = make_color16( 1, 1, 1, 0 ),

    white   = make_color16( 1, 1, 1, 1 ),

};


constexpr   auto                operator/( const C4 fore, const C4 back )

{

    return  u8( static_cast< u8 >( back ) << 4 | static_cast< u8 >( fore ) );

};

//------------------------------------------------------------------------------------------------


class                           CONSOLE

{

    struct                      LETTER

    {

        u8                      color;

        char                    tex;

    };


    static  const   int         width   = 80;

    static  const   int         height  = 25;

    static  const   int         size    = width * height;

    using                       MATRIX  = LETTER (&)[ height ][ width ];


    char                        buffer_[ 8192 ];

    std::array< LETTER, size >  buffer;

    MATRIX&                     screen  = (MATRIX&)buffer;

    HANDLE                      handle;


    void                        go( const short x, const short y ) const

    {

        SetConsoleCursorPosition( handle, { x, y } );

    }


    void                        color( const u8 c ) const

    {

        SetConsoleTextAttribute( handle, c );

    }


    void                        resize( int w, int h ) const

    {

        COORD       coord { w, h };

        SetConsoleScreenBufferSize( handle, coord );

        SMALL_RECT  rect = { 0,0, w - 1, h - 1 };

        SetConsoleWindowInfo( handle, TRUE, &rect );

    }


public:


    CRE                         CONSOLE( bool full_screen = false )

    :   handle( GetStdHandle( STD_OUTPUT_HANDLE ) )

    {

        setvbuf( stdout, (char*)&buffer_, _IOFBF, sizeof buffer_ );

        cursor( false );

        if( full_screen )

            SetConsoleDisplayMode( handle, CONSOLE_FULLSCREEN_MODE, NULL );

        clear();

    }


    void                        cursor( const bool show ) const

    {

        CONSOLE_CURSOR_INFO info = { 1, show };

        SetConsoleCursorInfo( handle, &info );

    }


    void                        flush( const int s = size - 1 ) const

    {

        resize( width, height );

        go( 0, 0 );

        u8  old_color;

        color( old_color = buffer[ 0 ].color );

        putchar( buffer[ 0 ].tex );

        for( int i = 1; i < s; ++i )

        {

            if( old_color != buffer[ i ].color )

            {

                fflush( stdout );

                color( old_color = buffer[ i ].color );

            }

            putchar( buffer[ i ].tex );

        }

        fflush( stdout );

        go( 0, 0 );

    }


    void                        clear()

    {

        buffer.fill( { text_color, ' ' } );

        flush( size );

    }


    u8                          text_color      = 0x07;

    u8                          number_color    = 0x07;

    u8                          number_size     = 11;

    bool                        right_alignment = true;


    void                        put( const u32 x, const u32 y, const LETTER tex )

    {

        screen[ y ][ x ] = tex;

    }


    void                        put( const u32 x, const u32 y, const char c )

    {

        put( x, y, { text_color, c } );

    }


    auto                        puts( const u32 x, const u32 y, const char* str )

    {

        u32 i;

        for( i = 0; str[ i ]; ++i )

            put( x + i, y, { text_color, str[ i ] } );

        return  x + i;

    }


    template< uu SIZE >

    auto                        puts( const u32 x, const u32 y, const char* str,

                                      const u8( &colors )[ SIZE ], const int offset = 0 )

    {

        u32 i;

        for( i = 0; str[ i ]; ++i )

            put( x + i, y, { colors[ ( i + offset ) % SIZE ], str[ i ] } );

        return  x + i;

    }


    auto                        to_string( const int n ) const

    {

        static  char    numstr[ 14 ];

        int* c = (int*)numstr;

        c[ 2 ] = c[ 1 ] = c[ 0 ] = 0x20202020;

        bool    neg     = false;

        u32     u       = n;

        if( n < 0 ) neg = true, u = -n;

        char*   p       = numstr + ( sizeof numstr - 1 );

        char*   end     = p - number_size;

        do *--p = u % 10 + '0', u /= 10; while( u );

        if( neg ) *--p  = '-';

        if( !right_alignment )

            return  p;

        return  end;

    }


    auto                        text_number( const u32 x, const u32 y,

                                             const char* s, const int n )

    {

        return  puts( puts( x, y, s ), y, to_string( n ) );

    }                                        

};

//------------------------------------------------------------------------------------------------


int main()

{

    CONSOLE stage;

    u8 color_set1[] = { 15, 7, 8 };

    stage.puts( 2, 1, "Hello teX", color_set1 );

    u8 color_set2[] = { (u8)C4::red, (u8)C4::white, (u8)C4::white, (u8)C4::white };


    stage.puts( 2, 3, "Codesafer's C++ programming guide", color_set2 );


    int i = 0;

    while( !_kbhit() )

    {

        stage.puts( 2, 5, "Codesafer's C++ programming guide", color_set2, i++ );

        stage.flush();

    }

    getchar();


    int frames = 0;

    while( !_kbhit() )

    {

        for( int i = (int)C4::blue; i < 256; i += 16 )

        {

            stage.text_color = i;

            stage.clear();

            stage.text_number( 30, 12, "Hello teX", ++frames );

            stage.flush();

        }

    }

    getchar();

    return  0;

}

//==============================================================================================


안타깝게도 Windows API 를 사용했기 때문에 VC++ 에서 밖에 컴파일되지 않는다.

내가 C++14 문법에 재미를 들인고로 Visual Studio 2015 이상을 권한다.


모든 학문이 그렇듯, 프로그래밍은 무조건 재밌게 공부해야 한다.


실행하면 다음과 같은 텍스트 애니메이션 화면이 나온다.


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28077a16fb3dab004c86b6f2de39bc5b73a49e8e93225670394e99012527ac8c95d0003ba9a962d3c437c2be00e04c647bd694868a68420da


viewimage.php?id=3dafdf21f7d335ab67b1d1&no=29bcc427b28077a16fb3dab004c86b6f2de39bc5b73a49e8e93225670394e99012527ac8c95d0003ba9a962d3c437c2be05d009c17b9371f63a68420da


짧은 프레임웍이지만 이걸론 뭔가 할 수 있을 것 같은 기분이 들지 않는가?

추천 비추천

12

고정닉 0

1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 며느리, 사위되면 시댁, 처가에 잘할 것 같은 스타 운영자 25/10/13 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47931 65
2896488 후스넘버 허위 내리는법 (106.102) 00:56 8 0
2896485 캄보디아 이거 진짜 무섭네 [4] 노력갤로그로 이동합니다. 00:54 30 0
2896484 ( ㅇ ㅅ ㅇ )a [1] 노력갤로그로 이동합니다. 00:54 13 0
2896483 냥덩아 발명도둑잡기(118.216) 00:53 8 0
2896482 지듣노 발명도둑잡기(118.216) 00:44 7 0
2896480 나르시 에이다 빠는거 보니까 예전에 클로저 빠는 아재 있었는데 [1] 박민준갤로그로 이동합니다. 00:35 27 0
2896478 패턴 매칭(Rust) vs. 직접 접근(Ada): 공정한 비교 나르시갤로그로 이동합니다. 00:30 9 0
2896477 제미니의 편향: Ada는 상대적으로 복잡한 것처럼 서술했네 ㅎㅎ 나르시갤로그로 이동합니다. 00:29 9 0
2896475 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 타이밍뒷.통수한방(1.213) 00:28 9 0
2896473 인터넷에서 싸우지 마라 [1] 박민준갤로그로 이동합니다. 00:26 32 0
2896472 "대통령님, '소비쿠폰' 저도 할 말 있습니다" 발명도둑잡기(118.216) 00:26 14 0
2896471 제미니의 러스트 편향성: Addr.Addr_V4'Image 이거 아니잖 나르시갤로그로 이동합니다. 00:25 12 0
2896469 와.. 일본은 브라질 이겻넹 ㄷㅅㄷ ♥덩냥이♥갤로그로 이동합니다. 00:23 13 0
2896468 이재명 "홍석천도 폐업..자영업자 임대료 감면에 정부 나서 달라" 발명도둑잡기(118.216) 00:21 8 0
2896467 Rust 의 Result 가 대체 왜 편하다는 것??? 나르시갤로그로 이동합니다. 00:14 11 0
2896465 제미니마저 Rust에 편향되게 설명하네. ㅎㅎ 나르시갤로그로 이동합니다. 00:12 16 0
2896464 요즘 컴공은 next.js도 가르침? [4] ㅇㅇ(211.196) 00:08 36 0
2896463 멍유야 이것만 알아둬 [2] ♥덩냥이♥갤로그로 이동합니다. 00:04 28 0
2896460 Ada와 Rust 비교: 자료구조, 분기, 오류 처리 철학 [1] 나르시갤로그로 이동합니다. 10.14 16 0
2896458 [공지] 멍퀴벌레 신상 제보 받습니다 현상금 있음 ♥덩냥이♥갤로그로 이동합니다. 10.14 14 0
2896456 최근 영화 <추적>을 발표한 최승호 감독이 발명도둑잡기(118.216) 10.14 9 0
2896455 124.48 점마 진짜 개발지식 일천하노 ㅋㅋㅋ [1] ㅆㅇㅆ(124.216) 10.14 37 0
2896446 멍퀴벌레는 21세기 홍길동이당 By 나님 [4] ♥덩냥이♥갤로그로 이동합니다. 10.14 28 0
2896445 Ada 프로그래밍: 열거형과 선택 구조, 그리고 예외 처리 나르시갤로그로 이동합니다. 10.14 16 0
2896442 Ada 프로그래밍: 3.5 주석 (Comment) 나르시갤로그로 이동합니다. 10.14 9 0
2896439 진중권이 말하는 극좌 [2] ♥덩냥이♥갤로그로 이동합니다. 10.14 20 0
2896435 이거 강의 언제 어디서 듣나요 발명도둑잡기(118.216) 10.14 14 0
2896434 냥덩이는 털바퀴가 된당⭐+ 7화 ♥덩냥이♥갤로그로 이동합니다. 10.14 17 0
2896432 안목 유튜브 보고 스포이더로 똑같이. 넥도리아(220.74) 10.14 15 0
2896431 [공지] 나님.. 이 모든 사태에 대해 책임지고 탈갤합니당.. [1] ♥덩냥이♥갤로그로 이동합니다. 10.14 28 0
2896428 냥덩 도배 발명도둑잡기(118.216) 10.14 18 0
2896427 냥덩아 적당히해 [6] 개멍청한유라갤로그로 이동합니다. 10.14 45 0
2896424 샤미 “K-팝은 더 성장할 것…韓 아티스트 영입 검토” [1] 발명도둑잡기(118.216) 10.14 18 0
2896420 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 타이밍뒷.통수한방(1.213) 10.14 10 0
2896418 [공지]냥덩강점기 종료~ 나님 야구 보면서 잘 놀다갑니당~ ♥덩냥이♥갤로그로 이동합니다. 10.14 26 0
2896417 비선실세 국정농단 의혹 김현지 제보 받습니당⭐ ♥덩냥이♥갤로그로 이동합니다. 10.14 28 1
2896416 와 벌써 시간 이렇게 됐네 잘 준비해야지 [2] chironpractor갤로그로 이동합니다. 10.14 23 0
2896415 김광현 ㅋㅅㅋ ♥덩냥이♥갤로그로 이동합니다. 10.14 14 0
2896414 18년인가 양현종 마무리 우승이 ㄹㅇ 소름끼쳤는데 ♥덩냥이♥갤로그로 이동합니다. 10.14 14 0
2896413 애널 야구 좀 싱겁게 끝나서 아쉽 ♥덩냥이♥갤로그로 이동합니다. 10.14 13 0
2896412 김서현도 공이 빠른건 맞긴한데 제구 구리다던데 ♥덩냥이♥갤로그로 이동합니다. 10.14 14 0
2896411 폰세 막판에 퍼진거 같던데 ♥덩냥이♥갤로그로 이동합니다. 10.14 14 0
2896410 폰세 1차 나오면 삼성 1차전은 버리려나보네 [6] ♥덩냥이♥갤로그로 이동합니다. 10.14 31 0
2896409 타자들이 투수에 익숙해지면 불리 하니까 ♥덩냥이♥갤로그로 이동합니다. 10.14 14 0
2896408 김경문 감독이 우승하려고 폰세 약팀만 보냇다네 ♥덩냥이♥갤로그로 이동합니다. 10.14 13 0
2896407 폰세가 빠따 강한팀은 일부러 빼왓다는데? ♥덩냥이♥갤로그로 이동합니다. 10.14 13 0
2896406 삼성유튜브 보니까 개웃기넹 ㅋㅅㅋ ♥덩냥이♥갤로그로 이동합니다. 10.14 17 0
2896405 큰경기에 강하고 작은경기에 약한;; ♥덩냥이♥갤로그로 이동합니다. 10.14 14 0
2896404 근데 국내트로피는 없응 ♥덩냥이♥갤로그로 이동합니다. 10.14 13 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2