// gameView.h : interface of the CGameView class
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_GAMEVIEW_H__56F34070_2024_4E08_87FC_D2F3E768D357__INCLUDED_) #define AFX_GAMEVIEW_H__56F34070_2024_4E08_87FC_D2F3E768D357__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
#include "link.h"
/* define the macros to be used directory `Move` */ #define MOVE_LEFT 1 #define MOVE_RIGHT 2 #define MOVE_DOWN 3 #define CHANGE 4
/* russia's spec `row` and `col` */ #define SPEC_ROW 18 #define SPEC_COL 12 /* client view's `width` and `high` */ #define SPEC_WIDTH 500 //单位为像素
#define SPEC_HIGH 550 /* block size */ #define BLOCK_SIZE 30 /* windows high, not the same with SPEC_HIGH! */ #define WND_HIGH 590
/* 下面,来定义方块数据结构 4 * 4 GRAN -> granularity (粒度) */ #define GRAN_SIZE 4
/* 图形的种类是有限的,宏的种类总数 */ #define BLOCK_COUNT 7 /* 共有七种 */
/* 方块的外形属性 : */ /* 1 : #### */ /* 2 : # ### */ /* 3 : # ### */ /* 4 : ## # ## */ /* 5 : ## # ## */ /* 6 : ## ## */ /* 7 : # ### */ #define SHAPE_LINE 1 #define SHAPE_GUN 2 /* the shape like a gun */ #define SHAPE_TWO 3 /* like the number `2` */ #define SHAPE_BLOCK 4 /* a big block */ #define SHAPE_TRIANGLE 5 /* 像一个三角形,你觉得呢 -_- */
class CGameView : public CView { protected: // create from serialization only
CGameView(); DECLARE_DYNCREATE(CGameView)
// Attributes
public: CGameDoc* GetDocument();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CGameView)
public: virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); //}}AFX_VIRTUAL
// Implementation
public: virtual ~CGameView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif
protected:
// Generated message map functions
protected: //{{AFX_MSG(CGameView)
afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnRestart(); afx_msg void OnPause(); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); //}}AFX_MSG
DECLARE_MESSAGE_MAP()
private: /* 在这里声明我们要用到的一些成员变量 */ /* bitmap */ CBitmap m_background; /* background graphic */ CBitmap m_block; /* block of russia */ CBitmap m_bgblock; /* background block */ CBitmap m_gamescore; /* game score background */ CBitmap m_gamelevel; /* game level background */ CBitmap m_gamenext; /* game next background */
/* the planar array to stroe the datas */ BOOL m_data[SPEC_ROW][SPEC_COL]; /* 游戏的特性 */ short m_level; /* 一共 1 - 9 层 */ /* 还有一点要说明的是:方格下落的速度也是根据m_level */ short m_score; /* 每100分可以进入下一层 */ BOOL m_current[GRAN_SIZE][GRAN_SIZE]; /* 当前图形的形状 */ BOOL m_next[GRAN_SIZE][GRAN_SIZE]; /* 下一图 */ short m_cur_pro; /* 当前方块图的属性 */ short m_next_pro; /* 下一块的属性 */ short m_x; /* 当前方块所在地左上角的XY座标 */ short m_y;
struct l_node* m_graphic; /* 方块库,是一个链表 */ /* 关于游戏的重新开始与暂停 */ BOOL m_restart; BOOL m_pause; BOOL m_gameover;
public: /* 这里添加我们的成员方法 */ /* ------------------------------------------------------ | 方块的移动 --> 方块移动的接口函数 | @@return : 如果返回的是false,证明游戏已经结束了! | 否则表明,已经顺利移运. | ##param : flag -> MOVE_LEFT or MOVE_RIGHT or MOVE_DOWN | ------------------------------------------------------- ***********--------> 注意!! <---------*************** 我们在VIEW类中,接收到键盘消息的时候,我们知道用户按的是哪一个键,然后,我们要 做的只是把MOVE_LEFT...RIGHT DOWN 作为参数传给move函数就可以了,而不用管其它东西! 包括这个方块是否可以移动,移动之后界面的刷新,等等,这些问题都不用管!
----> 也就是说,move是一个接口函数,他是"强大"的,所以,我们要写一些辅助函数 */ BOOL move (int flag);
/*---------------------------------------------------------- move的辅助函数 can left can right can down 我们不用传参给他,因为,我们可以利用类成员变量 : m_current m_x m_y m_data !
************注意!!************* 当candown反回假的时候,意味着本方块已经尘埃落定了 -----------------------------------------------------------*/ BOOL canleft (void); BOOL canright (void); BOOL candown (void); /*--------------------------------------------------------- #move left right down#在判断之后,如果能够移动,那么,我们就可以 调用这三个函数来移动了 ----------------------------------------------------------*/ void moveleft (void); void moveright (void); void movedown (void); /*---------------------------------------------------------- 形变 : 这是一个重要的问题 @@return : 如果返回的是TRUE,表明change函数已经更新了m_current的数 据,所以,我们要重画用户界面 相反,如果返回的是FALSE,表明,不可形变,m_current还是原来的值,所以 不用更新用户界面! ------------------------------------------------------------*/ BOOL change (void); /*---------------------------------------------------------- 下面,是另一个重要问题 : 产生随机的方块图按. 我的做法是 : 用一个BOOL形的二维数组来存储图按 而图按的种类是有限的 总数为宏BLOCK_COUNT中指定 ****************!!!************************ 关于随机生成,我的做法是 : 在view类的构造函数中,我初始化一个关于所有方块图案的链表 然后,在程序运行的过程中,如果需要要生成随机的方块,那么,我只需要 生成一个随机数N,然后,我循环N次这个循环链表,就可以得 到这个随机的方块图了`` ------------------------------------------------------------*/ void getrand (void);
/* get next, copy next to current ! */ void getnext (void); /* 重新开始时,重新设定数据 */ void restart (void);
/* draw current */ void draw_cur (void); /* join the m_current to m_data! */ void join (void); /* clean */ void clean (void);
/* write level, speed */ void reflush_level (void); /* write score */ void reflush_score (void); /* write next */ void reflush_next (void); };
#ifndef _DEBUG // debug version in gameView.cpp
inline CGameDoc* CGameView::GetDocument() { return (CGameDoc*)m_pDocument; } #endif
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_GAMEVIEW_H__56F34070_2024_4E08_87FC_D2F3E768D357__INCLUDED_)
|