콘솔 종합 (콘솔)

2015. 6. 27. 16:26ElementalKiss/포트폴리오

728x90
728x90

0. 콘솔 종합 게임

영상




프로젝트의 구현 기술 및 개발 교훈
1. 추상화와 캡슐화, 정보 은닉을 활용하여 여러가지 게임을 하나로 통합하는 클래스를 구현했다.
2. 가상함수를 이용한 함수 오버라이딩으로 씬을 전환하기 위해 상태 패턴(State Pattern)을 이용하여 게임 메니저를 구현했다.
그리고 씬을 담기 위해 싱글톤 패턴(SingleTon Pattern)을 이용하여 객체를 Private으로 선언된 게임 객체 포인터를 이용했다.
3. 대부분 게임은 파일 입출력을 이용하여 승/무/패 및 결과 정보를 저장할 수 있게 구현했다.
4. 성적표 - C에서 C++로 컨버팅하며 동적할당 함수인 malloc 함수와 new, delete 연산자의 차이를 고려하여 구현했다.
5. 하이로우세븐 - 인덱스 기반의 셔플 알고리즘을 적용하여 실제 값의 교환이 아닌 인덱스를 이용하여 오버헤드를 줄였다.
6. DB Query - 문자열을 다루기 위해 연산자 오버로딩과 문자열 함수를 직접 구현하며 파싱과 렉싱에 중점을 두고 구현했다.


설계

마인드맵




수도코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// GAME CLASS
BASE CLASS bGame
PUBLIC
    VIRTUAL void init
    VIRTUAL void excute
    VIRTUAL void release
    VIRTUAL void save
    VIRTUAL void load
END BASE CLASS
 
DERIVED CLASS dGAME
PUBLIC
    void init
    void excute
    void release
    void save
    void load
END DERIVED CLASS
 
// GAME MANAGER
CLASS GameMgr
PUBLIC
    void startGame
 
PRIVATE
    void init
    int selectGame
    void release
    Game *m_nowGame;
END CLASS
 
FUNCTION startGame
    WHILE getChar is 0
        IF m_nowGame is not NULL
            CALL FUNCTION excute of m_nowGame
        END IF
    END WHILE
END FUNCTION
 
FUNCTION release
    CALL FUNCTION release of m_nowGame
END FUNCTION
 
FUNCTION selectGame
    PRINT Game Select Menu
    SWITCH CASE Game Number
        SET newGameClass to m_nowGame
    END SWITCH CASE
    CALL FUNCTION load of m_nowGame
    CALL FUNCTION init of m_nowGame
END FUNCTION
cs


순서도

구현

핵심코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Game.h
#pragma once
/*
    모든게임의 기본상태베이스가 되는 추상 클래스
*/
class Game
{
public:
    Game(void);
    virtual ~Game(void);
 
    //< 공용 인터페이스
    //< 초기화
    virtual void init( void ) = 0;
    //< 실행
    virtual void excute( void ) = 0;
    //< 해제
    virtual void release( void ) = 0;
    //< 저장
    virtual void save( void ) = 0;
    //< 불러오기
    virtual void load( void ) = 0;
};
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
// GameMgr.cpp
#include "stdafx.h"
#include "LoopWithClass.h"
#include "GradeWithClass.h"
#include "RSPwithClass.h"
#include "UpDown.h"
#include "MatchingGame.h"
#include "BingoGame.h"
#include "baskinWithClass.h"
#include "HighLowSeven.h"
#include "G_queryClass.h"
#include "GameMgr.h"
 
 
GameMgr::GameMgr(void)
    :m_nowGame(NULL)
{
    init();
}
 
 
GameMgr::~GameMgr(void)
{
    release();
}
 
//< 게임시작
void GameMgr::startGame()
{
    whiletrue )
    {
        system("cls");
        if( selectGame() == 0 )
        {
            cout <<"게임종료"<<endl;
            break;
        }
        
        if( NULL != m_nowGame )
        {
            system("cls");
            m_nowGame->excute();
        }
    }
}
 
//< 초기화
void GameMgr::init( void )
{
 
}
 
//< 선택 게임체인지(상태전환)
int GameMgr::selectGame( void )
{
    cout <<"게임선택" << endl;
    cout <<"1 : 반복문"<<endl;
    cout<<"2 : 성적표"<<endl;
    cout<<"3 : 베스킨라빈스 게임"<<endl;
    cout<<"4 : 가위바위보 게임"<<endl;
    cout<<"5 : 하이로우세븐 게임"<<endl;
    cout<<"6 : 업다운 게임"<<endl;
    cout<<"7 : 짝맞추기 게임"<<endl;
    cout <<"8 : 빙고 게임" << endl;
    cout<<"9 : 쿼리문"<<endl;
    cout <<"0 : 종료" << endl;
    cout <<"입력 : ";
    int input;
    cin >> input;
 
    //< 번호체크
    if( input < 0 || input > 9 )
    {
        return 1;
    }
 
    if0 == input )
    {
        return 0;
    }
 
    if( NULL != m_nowGame )
    {
        //< 해제전 저장
        m_nowGame->save();
        //< 해제
        delete m_nowGame;
        m_nowGame = NULL;
    }
    //< 상태전환
    switch( input )
    {
    case 1:
        {
            m_nowGame = new LoopWithClass;
        }
        break;
    case 2:
        {
            m_nowGame = new GradeWithClass;
        }
        break;
        case 3:
        {
            m_nowGame = new baskinWithClass;
        }
        break;
    case 4:
        {
            m_nowGame = new RSPwithClass;
        }
        break;
    case 5:
        {
            m_nowGame = new HighLowSeven;
        }
        break;
    case 6:
        {
            m_nowGame = new UpDown;
        }
        break;
    case 7:
        {
            m_nowGame = new MatchingGame;
        }
        break;
    case 8:
        {
            m_nowGame = new BingoGame;
        }
        break;
    case 9:
        {
            m_nowGame = new QueryClass;
        }
        break;
    default:
        cout <<"고딴상태없음" <<endl;
        break;
    }
 
    //< 로딩
    m_nowGame->load();
    //< 초기화
    m_nowGame->init();
 
 
    return 1;
 
}
//< 해제
void GameMgr::release( void )
{
    if( NULL != m_nowGame )
    {
        //< 게임저장
        m_nowGame->save();
        //< 게임해제
        m_nowGame->release();
    }
}
cs


1. 베스킨라빈스 게임


2. 가위바위보 게임


3. DB 쿼리


4. 반복문


5. 성적표


6. High Low 7


7. Up&Dwown



728x90
반응형

'ElementalKiss > 포트폴리오' 카테고리의 다른 글

Tapping Counter(iOS 개인)  (0) 2015.06.30
군웅무도회(2D 2차 포트폴리오 WIN API)  (0) 2015.06.28