[대상 지향] 작은 게임 '터 미 네 이 터' 프로그램의 디자인 과 실현
대상 지향 프로 그래 밍
이것 은 우리 가 프로그램 설 계 를 배 우 는 첫 번 째 수업 이다.나 도 이 수업 에서 처음으로 언어 를 접 하고 코드 를 썼 다.우 리 는 영인 판 'C + + Program Design: An Introduction to Programming and Object - Oriented Design' 을 교재 로 한다.
지금 생각해 보면 그 '입문' 의 경험 은 정말 고 통 스 러 웠 다. 많은 개념 들 이 이해 하기 어 려 웠 고 책 속 의 코드 를 조금씩 두 드 릴 수 밖 에 없 었 다.하지만 작은 것 이 튀 어 나 올 때마다 흥분 했다.대학 1 학년 말 에 '큰' 과정 디자인 이 있 었 습 니 다. 2 인 1 조로 작은 게임 을 만 들 었 습 니 다.나 는 부기 와 한 팀 이 되 어 비교적 간단 한 관문 돌파 게임 을 썼 는데 이번 경험 을 한 후에 야 프로 그래 밍 에 대해 '입문' 하 는 느낌 이 들 었 다.
미니 게임 "YingMu".
[게임 기능 수요 설명]
이 게임 은 일본 만화 '덩 크 슛 고수' 를 바탕 으로 디자인 된 것 으로 게임 속 인물 들 에 대해 잘 알 고 있 을 것 이 라 고 믿 습 니 다.게임 에서 우 리 는 키보드 위, 아래, 왼쪽, 오른쪽 으로 게이머 의 이동 을 제어 하고 스페이스 바 로 총알 을 발사 했다.유저 가 적 을 만나면 게임 종료;모든 적 을 소멸 하면 통관 한다.게임 은 모두 두 개의 관문 으로 나 뉘 는데 각 관문 의 지 도 는 무 작위 로 만들어 지고 적의 이동 속도 도 점점 빨 라 진다.기능 은 간단 해 보이 지만 그 즐거움 은 끝 이 없 으 며 오락 과 모험 을 하나 로 모 은 게임 이다.
저 희 는 이번에 Microsoft Visual C + 6.0, EzWindow library 의 개발 환경 에서 디자인 을 완 성 했 습 니 다. 일부 프로그램의 기능 은 저희 가 잠시 좋 은 방법 을 생각 하지 못 해서 이 게임 에서 보 여 드 리 지 못 했 습 니 다.앞으로 의 학습 에서 우 리 는 이 작은 게임 을 더욱 잘 파악 하고 업그레이드 할 수 있 을 것 이 라 고 믿는다.
[게임 분류 도]
[게임 의 키 클래스!]
Player
enum Floor{FLoor1=0,Floor2,Floor3,Floor4};
class Player {
public:
//constructor
Player(SimpleWindow &w);
public:
//inspectors
SimpleWindow& GetWindow() const;//
Position GetPosition() const; //
Direction GetDirection() const; //
BitMap& GetBmp(const Direction &d,int i); //
const BitMap& GetBmp(const Direction &d,int i) const;
Floor GetFloor()const; //
bool IsDying(); //
bool AtRightEdge() const; //
bool AtLeftEdge() const;
//Facilitators
void Create(); // ( “ ” )
void Kill(); //“ ” ( )
void Move(); //
void Fire(); //
void OKUp(); //
void OKDown();
void CannotUpDown();
//mutators
void SetPosition(const Position &p); //
void SetFloor(Floor &f); //
void SetDirection(const Direction &d); //
//data member
vector bullets; /****************************************/
// GameController //
// , public , //
/****************************************/
private:
//facilities
void Draw();
void Erase(); /****************************************************/
// , Creat() Kill() //
// private //
/*****************************************************/
// Data members
SimpleWindow &Window;
vector > Bmp;
Direction CurrentDirection;
Position CurrentPosition;
bool bUpOk;
bool bDownOk;
Floor CurrentFloor;//
// Layer , Floor
// Layer Map ,
// Layer ,
// GameController Gap // ,
//( TestGap、TestEnemy) ,
// ,
int Steps; //
// ,
};
Enemy 와 Bullet.
/***********************************************************/
// enemy.h //
// //
// Enemy //
// , Layer //
/***********************************************************/
#ifndef ENEMY_H
#define ENEMY_H
const int EnemyBitMaps=2;
enum EnemyStatus {Alive,Dead,DeadAlready};
//DeadAlready enemy Kill
class Enemy{
public:
//constructor
Enemy(SimpleWindow &W,const Position &p1=(0,0),const Position &p2=(0,0),double h=1 );
// , , ( )
public:
//inspectors
SimpleWindow& GetWindow() const; //
Position GetPosition() const; //
Direction GetDirection() const; //
double GetHorizMovement() const; //
BitMap &GetBmp(const Direction &d); //
const BitMap &GetBmp(const Direction &d) const; //
EnemyStatus GetStatus()const;
//mutators
void SetWindow(SimpleWindow &W); //
void SetDirection(const Direction &d); //
void SetPosition(const Position &p); //
void SetStatus(EnemyStatus s); // ( )
void SetHorizMovement(double h); //
void SetP1P2(const Position &pp1,const Position &pp2); //
//Facilitators
void Create(); // ( )
void Kill(); // ( )
void Move(); // timer
void Draw(); //
void Erase(); //
Position NewPosition() const; //
void ChangeDirection(); // ,
private:
//data members
SimpleWindow& Window;
vector Bmp;
double HorizMovement;
Direction CurrentDirection;
Position CurrentPosition;
Position P1,P2;
EnemyStatus CurrenStatus;
};
#endif
/***************************************/
//derive class Enemy_1 //
// 、 //
// Enemy , //
/***************************************/
#ifndef ENEMY_1_H
#define ENEMY_1_H
#include "enemy.h"
class Enemy_1 : public Enemy{
public:
Enemy_1(SimpleWindow &W,const Position &p1=(0,0),
const Position &p2=(0,0) ,double h=0.5);
};
#endif
/********************************/
//derive class Enemy_2 //
/********************************/
#ifndef ENEMY_2_H
#define ENEMY_2_H
#include"enemy.h"
class Enemy_2 : public Enemy{
public:
Enemy_2(SimpleWindow &W, const Position &p1=(0,0),
const Position &p2=(0,0),double h=0.8 );
};
#endif
/***************************************************/
//derive class Bullet
// //
// , //
/***************************************************/
#ifndef BULLET_H
#define BULLET_H
#include "enemy.h"
class Bullet : public Enemy{
public :
Bullet(SimpleWindow &W,Direction d ,
const Position &p1=(0,0), const Position &p2=(0,0));
bool AtRightEdge() const; //
//
bool AtLeftEdge() const;
void B_Creat(); //
};
#endif
GameController
/***********************************************************/
// GameCoroller.h //
// , //
// , //
/***********************************************************/
#ifndef GAMECONTROL_H
#define GAMECONTROL_H
enum GameLevel { One, Second, Done };
class GameController {
public:
//constructor
GameController(const string &Title = " ( )",
const Position &WinPosition=Position(2.0,2.0),
const float WinLength =16, const float WinHeight = 13);
// 、 、 、
// destructor
~GameController();
//inspectors
SimpleWindow *GetWindow();
GameLevel CurrentLevel() const; //
//facilitators
void Play(const GameLevel Level); //
void TestGap(Player* player,vector gap);
// ( , )
void TestBullet(vector e,vector b);
void TestBullet(vector e,vector b);
// , 。
bool TestPlayer(Player* player,vector e);
bool TestPlayer(Player* player,vector e);
// ( , )
int TimerTick();
// TimerCallback
// , , 。
// , (Message)
// Message , PlayOne,
// , “ ”
private:
//data members
SimpleWindow *GameWindow;
GameLevel Level;
// GameController ,
// GameController
Player *player;
vector gaps;
vector layers;
vector enemy1;
vector enemy2;
};
#endif
전역 클래스: Global 과 Welcome
/********************************************************************/
//resources.h //
// //
// //
// welreources.h , //
// GameControl , //
// game.cpp gamecontroll.cpp , //
/*********************************************************************/
#ifndef WEL_H
#define WEL_H
// game.cpp
// int TimerCallBack(void);
// int MouseClick(const Position &MousePosition);
SimpleWindow End(" ( )",15.0,12.0,Position(2.0,2.0));
BitMap WellDone(End);
BitMap Quit(End);
BitMap Fail(End);
void SetWindows(){
Fail.Load("bmp\\fail.bmp");
assert(Fail.GetStatus()==BitMapOkay);
WellDone.Load("bmp\\done.bmp");
assert(WellDone.GetStatus()==BitMapOkay);
double width=Fail.GetWidth();
double height=Fail.GetHeight();
Quit.Load("bmp\\quit.bmp");
Quit.SetPosition(Position(0.6*width,0.8*height));
assert(Quit.GetStatus()==BitMapOkay);
}
int MouseClickEnd(const Position& MousePosition){
if(Quit.IsInside(MousePosition)){
End.Close();
}
return 1;
}
#endif
welcome.h
/*******************************************************/
//welresources.h //
// , //
// *.h game.cpp //
/*******************************************************/
#ifndef WELCOME_H
#define WELCOME_H
#include "assert.h"
SimpleWindow Welcome(" ( )",15.0,12.0,Position(2.0,2.0));
BitMap PlayButton(Welcome);
BitMap InstructionButton(Welcome);
BitMap Instruction(Welcome);
void SetWelcomeWindows(){
BitMap WelcomeBmp(Welcome);
WelcomeBmp.SetPosition(Position(0,0));
WelcomeBmp.Load("bmp\\hello.bmp");
WelcomeBmp.Draw();
assert(WelcomeBmp.GetStatus()==BitMapOkay);
double width=WelcomeBmp.GetWidth();
double height=WelcomeBmp.GetHeight();
PlayButton.SetPosition(Position(0.1*width,0.85*height));
PlayButton.Load("bmp\\play.bmp");
assert(PlayButton.GetStatus()==BitMapOkay);
Instruction.SetPosition(Position(0,0));
Instruction.Load("bmp\\in.bmp");
assert(Instruction.GetStatus()==BitMapOkay);
InstructionButton.SetPosition(Position(0.1*width,0.35*height));
InstructionButton.Load("bmp\\inbutton.bmp");
assert(InstructionButton.GetStatus()==BitMapOkay);
InstructionButton.Draw();
}
#endif
[게임 제어 논리 상자 도]
[게임 설명]
이 게임 은 설치 할 필요 가 없습니다.폴 더 'YingMu' 를 열 고 'YingMu. exe' 를 더 블 클릭 하면 바로 게임 을 시작 할 수 있 습 니 다.
게임 의 진입 창 을 엽 니 다. 덩 크 슛 고수 의 스틸 컷 이 표 시 됩 니 다. 창의 'Instruction' 아이콘 을 누 르 면 구체 적 인 게임 조작 설명 을 볼 수 있 습 니 다. 그 다음 에 'Play' 아이콘 을 누 르 면 게임 을 시작 할 수 있 습 니 다.
게임 이 시 작 된 후에 유 저 는 왼쪽 아래 에 있 는 벚나무 꽃 길 과 창문 에서 끊임없이 이동 하 는 세 명의 적 을 볼 수 있 습 니 다. 유 저 는 키보드 의 좌우 키 로 벚나무 꽃 길 을 창 에서 이동 시 키 고 바구니 아래로 내 려 갈 때 상하 키 로 실현 층 의 도약 을 제어 할 수 있 습 니 다.게임 중, 유 저 는 스페이스 바 를 눌 러 총알 (총알 의 수 는 제한 이 없 음) 을 발사 하고, 총알 은 적 을 만나면 적 을 소멸 할 수 있 습 니 다.모든 적 을 처치 하면 게임 은 대화 상 자 를 팝 업 하여 유저 가 다음 관문 에 들 어 갈 것 을 알려 줍 니 다.두 번 째 관문 의 모든 적 이 소멸 되면 게임 이 승리 합 니 다.유 저 는 축 하 드 리 는 창 을 볼 수 있 습 니 다. 왼쪽 아래 에 있 는 "Quit" 아이콘 을 누 르 면 게임 을 종료 할 수 있 습 니 다.만약 에 게임 중 에 게이머 가 조심 하지 않 아 적 에 게 잡 히 면 게임 이 실패 하면 게임 의 실 패 를 알 리 는 화면 이 나타 나 고 'Quit' 아이콘 을 누 르 면 게임 을 종료 합 니 다.
[게임 캡 처]
[프로젝트 총결산]
대학 1 학년 C + + 언어 학습 을 통 해 우리 팀 은 첫 번 째 프로젝트 프로 그래 밍 인 터 미 네 이 터 (벚나무 화도 판) 를 완성 했다.
임 무 를 받 고 우 리 는 신속하게 시작 했다................................................................................이 어 우 리 는 과정 설계 '터 미 네 이 터' 의 구상 을 실시 했다. 우리 의 최초의 디자인 은 화면 이 몇 층 으로 나 뉘 는데 게이머 들 은 각 층 에서 걸 을 수 있 고 방향 키 를 통 해 좌우 로 이동 할 수 있다. 계단 을 만 나 위아래 로 기어 다 닐 수 있 고 스페이스 바 를 통 해 총알 을 발사 할 수 있 으 며 다양한 음식 이 설치 되 어 있다. 게이머 들 은 소인 이 걸 어가 서 '먹 기' 를 통제 하고 서로 다른 음식 이 증가 하거나 해당 하 는 속성 을 감소 시킨다.(예: 생명 치, 속도 등)그러나 실제로 손 을 댔 을 때 코드 를 두 드 리 는 것 이 코드 를 읽 는 것 만큼 간단 하지 않다 는 것 을 알 게 되 었 습 니 다. 우 리 는 분업 하여 서로 다른 종 류 를 만 들 었 습 니 다. 거의 자수성가 하여 모든 종류의 기능 을 결정 하고 실현 하 는 것 이 매우 생소 하고 어렵 습 니 다. 특히 파생 되 었 을 때 대상 이 필요 로 하 는 속성 과 행동 을 정리 하 는 것 이 얼마나 중요 한 지 알 게 되 었 습 니 다. 이것 은 단지어 려 운 시작 이 었 습 니 다. 흩 어 져 있 는 코드 를 하나 로 묶 었 을 때 '대상 지향' 이라는 것 이 우리 가 생각 했 던 것 만큼 간단 하지 않다 는 것 을 알 게 되 었 습 니 다. 책 속 버그 헌 트 프로그램 을 열심히 열 었 지만 실제로 우 리 는 많은 부분 을 이해 하지 못 했 습 니 다. 특히 게임 컨트롤 러 의 중요 함 은 고립 된 대상 을 연결 시 켜 서로 연결 시 킬 수 있 습 니 다.'커 뮤 니 케 이 션' 이 야 말로 진정한 '살 아 있 는' 대상 이 고 생동감 있 는 게임 을 만 들 었 다. 우 리 는 밤 을 몇 번 새 우 며 여러 번 다시 썼 다. 처음에 야심 차게 이 루 고 싶 었 던 내용 을 많이 삭제 해서 이 터 미 네 이 터 를 만 들 고 싶 은 초기 모습 이 생 겼 다.
이후 의 시간 은 우리 가 함께 조심스럽게 게임 에 일부 기능 을 추가 하 는 것 이다. 예 를 들 어 총알 발사, 벚나무 의 '움 직 이 는' 효과, 그리고 그림 의 처리 등 이다. 게임 이 들 어가 고 물 러 나 는 인터페이스 도 이 시기 에 완성 되 었 다.
게임 이 최종 적 으로 출시 되 기 전에 우 리 는 실험실 에서 시험 적 으로 게임 을 했 지만 하나의 문 제 를 발견 했다. 서로 다른 스크린 과 해상 도 는 창 과 그림 좌표 의 오프셋 을 초래 했다. 우 리 는 처음에 자신의 컴퓨터 에 좌 표를 설 정 했 는데 게 으 름 을 피 워 서 직접 사용 한 숫자 인 신속 한 단점 을 나 타 냈 고 실험실 의 컴퓨터 에 서 는 그림 이 중첩 되 었 다. 우 리 는 즉시 생각 했다.게임 을 두 가지 버 전 (스크린 과 와 이 드 스크린) 으로 만 들 었 지만 해상도 도 좌표 에 영향 을 미 칠 수 있다 는 것 을 알 게 되 어 두 가지 버 전의 계획 을 실행 할 수 없 었 습 니 다. 우 리 는 다른 사람 에 게 자 료 를 찾 아 보고 마지막 으로 그림 의 크기 로 층 간 의 좌 표를 조정 하 는 것 을 물 었 습 니 다. (서로 다른 스크린 사진 이 변 하지 않 는 것 같 기 때 문 입 니 다)그러나 문제 도 근본 적 인 해결 을 얻 지 못 했 고 결 과 는 기대 한 것 보다 좋 지 않 았 다. 그래서 우 리 는 특히 자위 할 수 있 는 곳 인 게임 의 전체적인 미관 도가 크게 떨 어 졌 다 고 생각 했다. 앞으로 의 학습 에서 이 문 제 를 잘 해결 하고 게임 의 업그레이드 와 업 데 이 트 를 하 기 를 바란다.
게임 이 나 오 는 것 은 기대 하 는 모습 이 아 닙 니 다..................................................................마음 은 아직도 그녀 가 만 족 스 럽 지 못 한 부분 이 많다 고 생각 합 니 다. 최종 성 과 는 약간 간단 하기 때문에 예전 의 구상 과 너무 멀 고 많은 기능 이 실현 되 지 못 했 습 니 다. ezwin 의 기능 이 유한 하기 때문에 게임 배경 을 추가 하고 심지어 '사다리' 에 있 습 니 다.위의 움직임 은 모두 뚜렷 한 플래시 그림 이 있어 서 점프 로 바 뀌 었 다. 죽은 총알 과 적 들 은 모두 우리 가 교묘 하 게 게임 그림 에 숨 겼 고 진정한 delete 가 메모리 를 방출 하지 않 았 다. 시간 이 제한 되 어 있 고 인터페이스 에서 '생명 치', '속도' 를 하지 않 았 다.등.............................................................................................
한 달 동안 분투 하면 서 우 리 는 많은 것 을 얻 었 습 니 다........................................................................디 버 깅 에 사용 되 는 시간 은 코드 를 작성 하 는 시간 과 훨씬 많 습 니 다.
과정 설 계 를 통 해 우 리 는 자신의 실천 능력 을 단련 시 켰 을 뿐만 아니 라 팀워크 능력 도 키 웠 습 니 다. 문제 에 부 딪 혔 을 때 서로 토론 하고 다른 사람 에 게 가르침 을 청 하 며 최종 적 으로 해결 방법 을 찾 았 습 니 다. 이것 은 가장 좋 은 학습 과정 이 라 고 생각 합 니 다. 실천 에서 자신 을 향상 시 키 는 것 이 책 을 읽 는 것 보다 효율 이 너무 높다 는 것 을 깨 달 았 습 니 다. 또한 우 리 는 책 에 있 는 지식 들 이 책 에 있 는 것 이프로 그래 밍 은 턱 없 이 부족 하 다. 교과 서 는 단지 피상 적 인 것 을 소개 할 뿐이다. 그것 은 단지 너 를 입문 시 키 는 것 일 뿐이다. 우 리 는 더욱 주동 적 으로 공부 하고 함께 프로젝트 를 하 는 것 이 좋 은 방법 이다.
우 리 는 알 고 있 습 니 다. 우 리 는 너무 멀 고 갈 길이 멀 습 니 다....................................................................비록 약간 거 칠 고 기능 도 매우 제한 되 어 있 지만, 이 게임 의 전체 구조 와 체계 로 서, 그것 은 우리 가 대상 을 대상 으로 하 는 사상 을 이용 하여 게임 을 설계 하 는 취 지 를 실현 하 였 다. 또한, 작성 및 이후 의 프로그램 디 버 깅 과 오 류 를 배열 하 는 과정 에서 우리 가 C + + 언어 를 사용 하 는 숙련 도와 흔히 볼 수 있 는 문제 해결 에 대한 경험 을 쌓 았 다. 더욱 중요 한 것 은, 그 는 우리 로 하여 금 깊이 있 게 하 였 다.자신의 차 이 를 보 았 습 니 다. 1 년 동안 공 부 했 지만 MFC 를 사용 하지 않 았 습 니 다. 짧 은 시간 안에 HGE 를 신속하게 파악 할 수 없습니다. 다른 사람의 코드 를 참고 하 더 라 도 한 글자 한 글자 씩 읽 어야 합 니 다. 이 일반적인 프로그램 은 우리 의 부족 한 지식 에 대한 진실 한 묘사 일 수도 있 습 니 다. 그러나 이것 은 결코 종점 이 아 닙 니 다. 우 리 는 앞으로 의 학습 에서 자신의 수준 을 향상 시 키 고 우수한 지식 을 창조 하도록 노력 하 겠 습 니 다.쇼 의 작품.
이것 은 우리 소프트웨어 학습 의 첫 번 째 시련 이자 우리 대학 1 학년 대상 프로그램 설계 학습 의 성과 입 니 다. 우리 모 두 는 평생 잊 지 못 할 것 이 라 고 믿 습 니 다.
전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/xiaowei_cqu/article/details/7747650
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.