俄罗斯方块
俄罗斯方块是我大学一年级刚学VC++时的课程设计,当时的
课程设计有三种,单文档、多
文档和俄罗斯方块。我选择俄罗斯方块,就是因为它是游戏。
之前我是玩过俄罗斯方块的,一种是单人的(单人版),一种是两人对战的(对战版),还有一种是网络版的,由于我还不了解网络,所以就决定编前两种。可是,这样没有新意,我就想到了另外一种,配合游戏,或者称为情侣版。这里我先介绍三种,而
网络版,由于我们将介绍五子棋的网络游戏,鉴于它的简单性,我们将不介绍。
说明:以下三部分,可以以三章看待。
一、 单人版
1、 游戏实现
俄罗斯方块,或称积木游戏,它是利用一些形状各异却又是用正方形组成的方块,经过不同位置不同角度的变化之后,堆积在一起的一种智力游戏。
而从我们编程的角度讲,我们只需要提供各种方块的图形,提供几个键盘操作键以供方块的形状和位置的变化,提供几个功能函数以供游戏的正常进行。
各种方块图形:利用数组定形,然后利用随机函数随机地不按顺序地按游戏的需要而出现。
键盘操作键:就是四个方向键。其中左、右、下三个键意思一样,上键的功能不是使方块向上,而是使方块的下落角度改变。
功能函数将在变量函数里面介绍。
新建单
文档工程4_1。
2、 资源编辑
添加位图:
封面: IDB_BITMAP1
背景: IDB_BITMAP2
方块: IDB_BITMAP4
添加菜单:
开始: ID_MENU_START
3、 变量函数
接着就是定义变量了,但是,由于这个游戏要添加的变量和函数太多了,我们要建一个新类。
是否应该先添加应该类呢?最好是这样。因为新类将会涉及到变量。
添加普通类Crussia,见下图。
图4-1-1
添加变量函数:
由于两个类一共有很多变量函数,列举如下:
// 4_1View.h :
//俄罗斯类
CRussia russia;
//开始标志
bool start;
//封面
CBitmap fenmian;
//暂停
BOOL m_bPause;
//开始菜单
afx_msg void OnMenuStart();
//计时器
afx_msg void OnTimer(UINT nIDEvent);
//键盘操作
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
// Russia.h:
//游戏数组
int Russia[100][100];
// 当前图形
int Now[4][4];
//上一图形
int Will[4][4];
//变换后的图形
int After[4][4];
//当前图形的左上角位
置
CPoint NowPosition;
//当前可能出现的图形形状数,
int Count;
//游戏结束
bool end;
//级别
int m_Level;
//速度
int m_Speed;
//分数
int m_Score;
//行列数
int m_RowCount,m_ColCount;
//方块
CBitmap fangkuai;
//背景
CBitmap jiemian;
//显示分数等内容
void DrawScore(CDC*pDC);
//消行
void LineDelete();
//方块移动
void Move(int direction);
//方块变化,即方向键上键操作
bool Change(int a[][4],CPoint p,int b[][100]);
//是否与原来方块接触,或与边界接触
bool Meet(int a[][4],int direction,CPoint p);
//显示下一个方块
void DrawWill();
//显示界面
void DrawJiemian(CDC*pDC);
//开始
void Start();
4、 具体实现
然后,我们就可以一步一步地实现游戏了。函数依然是一个一个添加,如果有还没定义的函数,添加空函数。以保证程序的条理性和可运行性。
构造函数:
CMy4_1View::CMy4_1View()
{
// TODO: add construction code here
fenmian.LoadBitmap(IDB_BITMAP1);
start=false;
m_bPause=false;
}
CRussia::CRussia()
{
jiemian.LoadBitmap(IDB_BITMAP2);
fangkuai.LoadBitmap(IDB_BITMAP4);
}
画图函数:
void CMy4_1View::OnDraw(CDC* pDC)
{
CMy4_1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
//没有开始,显示封面
if( !start)
{
Dc.SelectObject(fenmian);
pDC->BitBlt(0,0,500,550,&;Dc,0,0,SRCCOPY);
}
//显示