[대상 지향] 작은 게임 '터 미 네 이 터' 프로그램의 디자인 과 실현

16433 단어
08 년 9 월 에 입 학 했 고 12 년 7 월 에 졸 업 했 습 니 다. 저 는 소프트웨어 대학 에서 즐 겁 고 풍부 한 대학 생활 을 마 쳤 습 니 다.이 시 리 즈 는 4 년 전공 과정 학습 에 대한 회고 이 고 색인 은 다음 과 같다.http://blog.csdn.net/xiaowei_cqu/article/details/7747205
대상 지향 프로 그래 밍
이것 은 우리 가 프로그램 설 계 를 배 우 는 첫 번 째 수업 이다.나 도 이 수업 에서 처음으로 언어 를 접 하고 코드 를 썼 다.우 리 는 영인 판 '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

좋은 웹페이지 즐겨찾기