VC++打地鼠游戏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章老鼠和滚球
1.1.实现思想
老鼠和滚球游戏,是我根据自己的意愿,是为了我将要说明的下面有关内容而设置的。由于没有经过具体实践,我并不能保证其趣味性和吸引力,我们学习的是它实现过程中的一些思想。希望对读者有所帮助。
其实,这种游戏,在街头电子游戏中是常见的。但由于电脑的渐渐普及,大规模游戏的迅速出现,已经不适合玩者的需求了。但是,我们可以以小见大,在学习小游戏的基础上,慢慢培养设计大游戏的一些方法和技巧。
关于游戏的角色:
老鼠,是游戏的主角,它有三条生命,它为了生存,必须能够逃脱灾难性的局面(被滚球撞到),它在经过所谓的适者生存的淘汰之后,学会了使用子弹;而且是一种能够消灭滚球的子弹,以达到防身的目的。每打中一个球得一分,每被撞一下失去一条生命。
滚球,一共有50个,但为了维持生态平衡,最多只能出来六个。滚球,是为了消灭老鼠而存在的,它将会在现代科技的伪随机函数中不定向地出现。
红心,生命的象征,只要你能碰到它,你就幸运了,因为由此你会得到一条生命。当然,生存需要竞争,需要你自己去创造;只要你在消灭了很多滚球之后,你才有可能取得。正因为这个原因,我把它安排在滚球出现的地方。
关于游戏的实现:
游戏,经常都是全屏的,但是由于我们的目的不仅仅在于游戏本身,我们的宗旨是利用游戏的趣味性和吸引力,来增强读者学习程序语言的信心。所以,在前面我们都没有用到全屏显示,我们不需要。
另外说明:本游戏的全屏只适应于800*600的分辨率。
全屏,是这个游戏的一点要学习的。多位图的移动,是本游戏要学习的第二个内容,上面的最多只有两个位图可以移动,这是由于游戏本身决定的。当然,这个游戏的多位图移动,也是游戏本身决定的,但却是我之所以选择它为第五章的原因。当然,我们没有那么多的手去操作键盘,去移动位图。我们必须设置我们的程序,让程序自己去执行,去移动,去显示计算机的优越性。
这个游戏,比起上面来,它是一个更加复杂的社会,它不再只是玩者一个人充当角色。所以,我们新建了各自的类。
新建工程5_1,为单文档默认设置。
2.2.制作位图
既然游戏是复杂的,它就需要很多位图,但由于我们在前面已经用了很多位图,我们这里就不多说了。只是说明一下位图的数量和大小。
背景位图:800*600 1张IDB_BITMAP1
老鼠位图:50*50 4张IDB_BITMAP2
(两只老鼠两个方向)IDB_BITMAP3
IDB_BITMAP7
IDB_BITMAP8
滚球位图:50*50 1张IDB_BITMAP4
红心位图:50*50 1张IDB_BITMAP11
子弹位图:50*50 4张IDB_BITMAP5
(两种颜色两个方向)IDB_BITMAP6
IDB_BITMAP9
IDB_BITMAP10
3.3.变量和函数
老鼠:
它有位置,分数,方向,生命力,子弹和它自己。其中它自己的图像及它射出来的子弹都有前后方向。我们必须为它定义一个类,以让两个老鼠共用。
新建类:CMouse
添加变量如下:
CPoint point;//位置
CBitmap bitmapa;//向后图像
CBitmap bitmapb;//向前图像
CBitmap shota;//向后子弹
CBitmap shotb;//向前子弹
int score;//分数
short direction;//方向
short lifes;//生命
滚球:
它也有位置,也有它自己的图像。由于一共有五十个球,最多会显示六个球,我们也定义它为一共类。
新建类:CBall
添加变量如下:
CPoint point;
CBitmap bitmap;//由于对称,我们只要一个位图
游戏:
由于它的复杂性,程序,由于它的复杂性,为了不使它们更加复杂,我们也为游戏的实现本身建立一个类。
新建类:CGame
添加变量如下:
CBall ball[6];//六个滚球
short ballnum;//滚球数:50
CMouse m1,m2;//两只老鼠
int yy[16][12];//屏幕数组
CBitmap shot;//子弹位图
bool heart1,heart2;//两个红心是否显示
CBitmap heart;//红心位图
既然是游戏本身,它必定要实现很多功能,我们添加如下函数:
void GetHeart();//老鼠得到红心
void KillBall();//老鼠打中滚球
void KillMouse();//滚球杀死老鼠
void Draw(CDC*pDC);//画界面
void DrawScore(CDC*pDC);//画分数
void BallMove();//使球滚动
最后,到了主程序,为了实现全屏,我们在CMainFrame 中添加如下变量和函数:CRect m_FullScreenRect;//全屏显示时的窗口位置
void OnFullScreen();//全屏显示
在CMy5_1View中添加如下变量和函数:
CGame game;//游戏对象
CBitmap cloud;//背景云图
OnTimer(UINT nIDEvent)
OnCreate(LPCREATESTRUCT lpCreateStruct)
OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
4.4.具体实现
全屏显示:
首先,我们必须使单文档以全屏形式出现,并设置为不能改动大小,没有工具栏和状态栏,没有菜单。
添加OnFullScreen()函数如下:
void CMainFrame::OnFullScreen()
{
// TODO: Add your command handler code here
CRect WindowRect;
GetWindowRect(&WindowRect);
CRect ClientRect;
RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect);
ClientToScreen(&ClientRect);
//获取屏幕的分辨率
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
m_FullScreenRect.left=WindowRect.left-ClientRect.left;
m_FullScreenRect.top=WindowRect.top-ClientRect.top;
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;
m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight;