飞机大战MFC实验报告

飞机大战MFC实验报告
飞机大战MFC实验报告

实训报告

飞机大战游戏设计与开发

目录

1. 概述 (4)

2. 相关技术 (4)

2.1 透明贴图技术 (4)

2.2 CObList链表 (4)

2.3获取矩形区域函数 (4)

2.4弹出对话框函数 (5)

2.5字体的个性化输出函数 (5)

2.6设置定时器 (5)

2.7双缓冲技术 (5)

2.8 内存释放技术 (6)

2.9对话框中添加动态按钮 (6)

2.10检测方向键按下 (6)

3. 需求分析(用结构化方法或面向对象方法给出系统的主要需求模型) (6)

3.1功能需求分析 (6)

3.2 数据需求分析 (7)

3.3 行为需求分析 (7)

3.4 其他需求 (8)

4. 总体设计与详细设计 (8)

4.1 系统模块划分 (9)

4.2 主要功能模块 (10)

4.3 扩展功能设计思路 (10)

5. 编码实现 (11)

5.1游戏初始创建 (11)

5.2定时器 (11)

5.3背景及游戏开始、结束界面绘制函数 (11)

5.4键盘控制函数 (12)

5.5游戏对象进行碰撞测试和碰撞销毁 (13)

5.6创建动态按钮(开始游戏、游戏规则) (13)

5.6重新开始游戏代码 (14)

5.7设置游戏难度代码 (14)

5.8游戏结束时释放资源函数 (15)

5.9调整对话框大小函数 (15)

5.10开始界面背景绘制函数 (15)

5.11选择下一关卡以及选择完成后的执行代码 (16)

6.测试情况说明。 (17)

6.1主要模块测试情况(白盒) (17)

6.11各游戏对象碰撞检测爆炸模块测试 (17)

6.12战机导弹的方向速度模块测试 (17)

6.13文字显示,游戏结束和关卡进入模块测试 (18)

6.14设置游戏难度和重新开始模块测试 (18)

6.2 主要功能测试情况(黑盒) (18)

6.21各游戏对象碰撞检测爆炸模块测试 (18)

6.22敌机子弹导弹的方向速度模块测试 (19)

6.23文字显示,游戏结束和关卡进入模块测试 (19)

6.24设置游戏难度和重新开始模块测试 (19)

7. 实训中遇到的主要问题及解决方法 (19)

8. 实训收获与体会 (20)

1. 概述

本次实训主要是做一个基于windows的飞机大战单机版游戏,其实现的主要功能为:控制战机对象的移动,敌机对象的随机出现和发射子弹,实现游戏对象的爆炸特效,文字提示功能和界面背景切换特效,其主要是遵循开发者规定的游戏规则进行游戏闯关。

游戏主要角色:战机、敌机、战机导弹、敌机子弹、客机、导弹架、生命包,其中战机分为四种:普通战机,一级战机,二级战机。其主要遵循的游戏规格如下:战机数量为1;由玩家通过键盘控制(方向键控制位置、‘Z’键发射导弹)战机,战机有一定的运行速度;导弹释放存在间隔,有一定的运行速度;导弹遇到敌机发生爆炸,敌机被炸毁,导弹消失,玩家得分;由计算机控制敌机自动向战机发动攻击;敌机数量随机,计算机生成敌机时随机选择类别;普通敌机从游戏区域的上下两端进入位置随机;敌机行驶期间,不左右移动,不反向移动;运行线路为直线,方向为从下至上,或从下至上,不可左右移动;战机导弹击毁敌机后有一定几率掉落导弹架和生命包,导弹架可以增加战机导弹数量,生命包可以增加战机生命。每关有boss从游戏区域的左上角端进入,左右位置随机;敌机行驶期间,可左右移动,可反向移动;当敌机到达战机下方时发射炸弹对战机进行攻击。炸弹纵向由发射位置起至游戏区域结束;炸弹遇到战机时发生爆炸,战机减生命值,炸弹消失;战机与boss碰撞,战机被毁,游戏结束;炸弹运行时有速度限制;客机在游戏界面左上角出现,又左向右运动,客机上有油箱,导弹击中客机油箱客机爆炸并消失,玩家减分。当玩家战机生命值为0时,游戏结束,并显示玩家得分。

2. 相关技术

此次实训的飞机大战游戏其中的技术主要就是一些API函数、内存释放和双缓冲技术。

2.1 透明贴图技术

此次实训中用于贴图的函数:

LoadImage(CImageList& imageList,UINT bmpID,COLORREF crMask,int cx,int cy,int nInitial) //此函数主要用于将图片放入图像链表imageList中。

img_Bomb1.Draw(pDC,0,G_pos,ILD_TRANSPARENT) //此函数主要是讲img_Bomb1链表中的图像显示在pDC这个句柄中。ILD_TRANSPARENT表示是透明贴图。

其中主要就是CImageList图像列表。它是相同大小图像的一个集合,每个集合中均以0为图像的索引序号基数,图像列表通常由大图标或位图构成,其中包含透明位图模式。可以利用WINDOWS32位应用程序接口函数API来绘制、建立和删除图像,并能实现增加、删除、替换和拖动图像等操作。

2.2 CObList链表

CObList bomblist; //主要是定义一个CObList类的一个链表对象用于存储所有的此种相关的对象,易于后续的添加删除和提取数据。

POSITION posball=NULL,posball_t=NULL; //定义指针

CBomb *temp = new CBomb();

temp=pDoc->bomblist.GetHeadPosition();//指针读取头结点

temp= (CBomb *)pDoc->bomblist.GetNext(posball); //指针读取下一个结点

2.3获取矩形区域函数

CRect rc; //定义

GetClientRect(&rc); //获取其矩形区域获取结果课为:rc.Width() //矩形区域的宽度rc.Height() //矩形区域的高度

CRect tmpRect;

tmpRect.IntersectRect(&bRect,eRect))//判断两个矩形是否有交接

2.4弹出对话框函数

if(AfxMessageBox(L"是否进入下一关?",MB_YESNO)==6){}

//此函数主要是弹出对话框供用户进行选择,当用户点击确定按钮时执行此函数的{}内的语句进行继续运行。

2.5字体的个性化输出函数

MemDC.SetBkMode(TRANSPARENT);

MemDC.SetTextColor(RGB(0, 0, 0));

CFont font;

//创建一个字体对象;

LOGFONT lf;

memset(&lf, 0, sizeof(LOGFONT));

lf.lfHeight = 40;

lf.lfWidth = 20;

//设置字的高度和宽度;

font.CreateFontIndirect(&lf);

// HFONT CreateFontIndirect(CONST LOGFONT *lplf);

MemDC.SelectObject(font);

char strData[100];

sprintf_s(strData, 20, "得分:%d", pDoc->score);

MemDC.TextOut(260, 350, (CString)strData);

//在对话框中显示strData里的字;

2.6设置定时器

定时器告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。

SetTimer(1,30,NULL); //设置每30毫秒刷新一次

2.7双缓冲技术

关于双缓冲技术主要就是利用缓存的原理进行将所有的东西都先存在一个缓冲得虚拟的区域,然后再一次性的将所有的虚拟缓存中的东西都放入实在的存储器中。

CDC MemDC; //首先定义一个显示设备对象

CBitmap MemBitmap;//定义一个位图对象

//随后建立与屏幕显示兼容的内存显示设备

MemDC.CreateCompatibleDC(NULL);

//下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小

MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);

//将位图选入到内存显示设备中

CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

//先用背景色将位图清除干净

MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));

//绘图

MemDC.MoveTo(……);

MemDC.LineTo(……);

//将内存中的图拷贝到屏幕上进行显示

pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

//绘图完成后的清理

MemBitmap.DeleteObject();

MemDC.DeleteDC();

2.8 内存释放技术

在此次实训项目中有太多的对象的生成和运用,造成了内存的极度的紧张,当游戏进行到一定的程度的时候就会出现内存溢出现象。解决此问题的技术就是内存释放。内存释放技术的实现主要是通过释放各个满足一定条件的对象和链表来实现的,pDoc->bomblist.RemoveAt(mPos2);//用于删除指针

delete pDoc->Bomb;//用于删除对象

2.9对话框中添加动态按钮

ID号是控件的标识,创建控件前必须先为它设置一个ID号。

打开资源中的“String Table”,在空白行上双击鼠标,这时会弹出一个ID属性对话框,在其中的ID编辑框中输入ID,如:IDC_MYBUTTON,在Caption中输入控件标题或注解然后用CButton *p_MyBut = new CButton();创建一个CButton类的普通按钮。

再然后在CSpaceWarView中添加响应函数,在头文件中添加函数定义,编写消息响应函数,最后回收资源

2.10检测方向键按下

使用SHORT GetKeyState(int nVirtKey)函数检测方向键是否按下。该函数检取指定虚拟键的状态。该状态指定此键是UP状态,DOWN状态,还是被触发的(开关每次按下此键时进行切换)。

3. 需求分析(用结构化方法或面向对象方法给出系统的主要需求模型)

3.1功能需求分析

1、战机数量为1,战机的位置可通过键盘(方向键和游戏常用键均可进行控制战机的位置)。可通过‘Z’键控制战机进行发导弹,战机导弹有一定的数量限制,发射完固定数量的导弹后便不能在发射导弹,导弹具有一定的速度。

2、敌机出现的时间和位置均为随机,敌机的速度,敌机发射子弹的时间可以再难度设置更改,子弹的发射具有延时性,子弹的速度具有随机性。

3、导弹和子弹及敌机碰撞爆炸同时销毁碰撞的物体,战机和子弹及敌机碰撞爆炸同时销毁碰撞的子弹及敌机,战机则判断生命,为0时游戏结束否则继续。与此同时进行分数和生命的变化同时进行文本的显示提示。

4、所有敌方物体和导弹进行越出游戏区域则进行销毁,释放内存。

5、背景图片的添加。为游戏提供相关背景,不同关卡之间可实现不同界面背景的转换。每关背景实现了滚动效果

6、boss的实现。在第一关之后每一关玩家得到一定分数后即出现boss,并有文字提示boss生命,boss子弹有两种,一种向下发射,一种一周发射12颗子弹,每两个相邻子弹之间隔30度。boss子弹对战机的伤害大于普通敌机的伤害,战机与boss相撞即生命之为0,

游戏结束。

7、实现了客机功能。有一定几率出现客机,战机导弹击中客机油箱,客机被击毁,玩家减分。

8、实现了对游戏的关卡的设置,第一关到达一定的分数其本关游戏即可结束同时提醒玩家是否进行下一关游戏。其后每个关卡有一个boss,打死boss其本关游戏即可结束同时提醒玩家是否进行下一关游戏。

9、实现了对战机的生命的增减,战机基本生命值为50,战机射击增加生命值的飞机,当其被击中后其生命就-1,生命为0时游戏结束,提示玩家得分。

(说明:每一关的游戏的难度是不同的,通过进行敌机的位置的变换程度和速度控制)。

10、实现了放大招的功能,玩家可通过按“X”键放大招销毁普通敌机,对boss机造成

50点伤害。

11、实现了导弹架和生命包功能,战机导弹击毁敌机后有一定几率掉落导弹架和生命包,导弹架可以增加战机导弹数量,生命包可以增加战机生命。

12、实现了游戏结束后重新开始功能,玩家可在菜单重新开始游戏。

13、实现了设置游戏难度的功能,玩家可在菜单更改战机速度,战机导弹产生时间间隔,速度,敌机产生时间间隔,敌机运行速度等。

14、实现了游戏开始界面显示游戏开始、游戏规则按钮,单机开始游戏进行游戏,单机游戏规则弹出介绍游戏规则对话框。

15、实现了控制战机速度的功能主要是用于在键盘控制战机位置时。

16、实现了双缓冲技术进行解决刷屏时屏闪的问题。

3.2 数据需求分析

数据方面主要是需要对游戏对象数据的需求分析,主要包括:

建立游戏中所有类对象的链表数组(枚举类型):enum *ObjType,其中包括的有

balldownlist; //向下敌机子弹链表

balluplist; //向上敌机子弹链表

explosionlist; //爆炸链表

enemyuplist; //向上敌机链表

enemydownlist; //向下敌机链表

bomblist; //战机导弹链表

bossballlist; //boss1子弹链表

bossball1list; //boss2子弹链表

addlifelist; //生命包链表

addbomblist; //导弹包链表

airplanelist; //客机链表

3.3 行为需求分析

在游戏进行过程中,主要的行为有:

爆炸行为:在敌机和战机相撞、敌机和导弹相撞、战机和子弹相撞时均发生爆炸。同时将敌机和子弹、导弹均进行销毁,而战机则视情况而定,当其生命值为0时进行销毁战机。

生命值增减行为,得分值增减行为。当战机被撞时战机的生命值减一,当敌机被战机或者导弹碰撞时得分加1,当敌机子弹被撞时得分加1.当得分到达一定的值后进行生命值的增值同时得分进行相应的减少。

字体显示行为,当爆炸时进行相应的文字的显示,以及当游戏进行到一定值时进行相应的文字提示。

敌机的飞行行为以及子弹导弹的飞行行为和玩家的战机活动行为等。

3.4 其他需求

用户界面的需求:包括全屏等窗口的切换——可以进行全屏和窗口的切换功能。

软硬件环境需求:操作系统:Microsoft Windows XP以上。

产品质量需求:正确性——保证游戏规则的准确性;健壮性——程序运行过程中对用户的无效操作予以处理。

4. 总体设计与详细设计

总体设计主要课将其分为两大部分:规则子系统,游戏对象子系统。

系统的总体结构图如下:

规则子系统主要是实现飞机大战各项游戏规则。实现需求中的游戏规则,组成结构图如下:

主要是实现敌机战机的攻击和反攻的游戏规则等来实现计算机方和玩家进行对战。

1、主要的攻击规则如下:

1)、敌机可在战机的上方进行将子弹进行射向战机。

2)、战机可以发射导弹对敌机和boss攻击。

2、主要的碰撞规则如下:

1)、导弹或者子弹本身的矩形区域和敌机或者战机的矩形区域相交时,表示其相互发生碰撞表示其相互爆炸。根据实战规则销毁游戏对象。

2)、战机生命为0,战机被炸,战机被销毁,游戏结束。

3)、敌机或者子弹被炸毁,将其进行销毁同时进行分数的相应的增加,并且出现文字提示。

4)、战机与敌机碰撞敌机炸毁,战机生命值减少。战机与boss碰撞,战机炸毁,游戏结束。

3、主要时间控制规则如下:

1)、当游戏的关卡改变时进行游戏持续时间的一个相应的改变。

游戏对象子系统主要包括:应用程序对象和游戏对象

4、应用程序对象:

1)、游戏程序的加载

2)、游戏对象的绘制

3)、游戏规则的调用

4)、玩家键盘鼠标事件的获取

5、游戏对象:

1)、各游戏对象的图像加载

2)、各游戏对象的贴图

3)、各游戏对象的位置存储4.1 系统模块划分

4.2 主要功能模块

主要功能模块主要就是那些类的功能模块,主要有:

1、各个游戏对象的贴图模块

2、敌机数量、方向、速度以及子弹的数量、方向和速度控制模块。

3、boss移动、子弹发射模块。

4、客机随机出现、移动模块。

5、战机的导弹的数目、方向和速度控制模块。

6、战机的键盘控制和鼠标控制位置模块。

7、敌机、子弹和战机、导弹的碰撞检测以及爆炸模块。

8、敌机炸毁随机产生导弹架、生命包,战机与导弹架、生命包碰撞检测模块

8、背景添加模块。

9、战机速度控制模块。

10、游戏关卡游戏难易度设置和游戏关卡选择。

11、游戏得分和生命值控制以及游戏关卡进入控制和游戏结束。

12、游戏重新开始和游戏难度设置模块。

4.3 扩展功能设计思路

本次实训由于时间问题还有些扩展功能可进行增加,主要有:

1、给游戏进行增加boss类型,通过boss的添加进行游戏的关卡和难度的更加进一步

的提升。

主要思路是:为boss添加属性和攻击类型,并让后边的关卡出现多个前面关卡的boss。

2、给游戏进行增加另类的子弹类型共boss向战机进行攻击,此类继承敌机的子弹类。

3、进行增加存盘处理,用于完善暂停功能。通过存盘使玩家可以进行暂停或者人为结束时的继续进行玩。主要思路是:在玩家进行选择暂停或者结束时,系统将当前各个类的对象信息存储在文件中,当玩家选择继续时,系统从文件中读取各个对象的相应信息进行继续进行游戏。

5. 编码实现

此次实训的主要编码主要为:

5.1游戏初始创建

void CSpaceWarView::OnInitialUpdate()

5.2定时器

void CSpaceWarView::OnTimer(UINT_PTR nIDEvent)//此函数用于进行定时器的设定,在此设定器中进行各种函数的实现和调用进行相应时间的刷新

5.3背景及游戏开始、结束界面绘制函数

BOOL CSpaceWarView::Back_Draw()

{

if (pDoc->num_pass == 1)

bitmap_BackGround.LoadBitmap(IDB_background1);

if (pDoc->num_pass == 2)

bitmap_BackGround.LoadBitmap(IDB_background2);

if (pDoc->num_pass == 3)

bitmap_BackGround.LoadBitmap(IDB_background3);

BITMAP bimap;//位图图像

bitmap_BackGround.GetBitmap(&bimap);

CDC cdc;//定义一个兼容的DC

cdc.CreateCompatibleDC(&MemDC);//创建DC

cdc.SelectObject(&bitmap_BackGround);

if (t <= -rect.Height()) t = 0;

t = t - 2;

MemDC.StretchBlt(0, 0 - t, rect.Width(), rect.Height(), &cdc, 0, 0, bimap.bmWidth, bimap.bmHeight, SRCCOPY);

MemDC.StretchBlt(0, -rect.Height() - t, rect.Width(), rect.Height(), &cdc, 0, 0, bimap.bmWidth, bimap.bmHeight, SRCCOPY);

return 0;

}

//绘制游戏界面

CPoint OriginMepos, pointMeLife, pointBosLife, m_ptOriginBos;

OriginMepos.x = 105;

OriginMepos.y = 25;

pointMeLife.x = OriginMepos.x + pDoc->life_myplane * 5;

pointMeLife.y = 45;

CBrush brush(RGB(255, 0, 0));

CClientDC dc(this);

MemDC.FillRect(CRect(OriginMepos, pointMeLife), &brush);

char strData[100];

MemDC.SetBkMode(TRANSPARENT);

MemDC.SetTextColor(RGB(255, 255, 255));

sprintf_s(strData, 20, "关卡:%d", pDoc->num_pass);

MemDC.TextOut(rect.Width() / 2 - 30, 0, (CString)strData);

sprintf_s(strData, 20, "得分:%d", pDoc->score);

MemDC.TextOut(0, 0, (CString)strData);

sprintf_s(strData, 20, "战机生命:%d", pDoc->life_myplane);

MemDC.TextOut(0, 25, (CString)strData);

sprintf_s(strData, 20, "战机导弹个数:%d", pDoc->num_bomb);

MemDC.TextOut(0, 50, (CString)strData);

//绘制通关界面

BOOL CSpaceWarView::Pass_Draw()

5.4键盘控制函数

//检查键盘四个方向键控制战机移动

for (int i = 0; i < 4; i++)

{

int nMeMotion = 0;

nMeMotion = GetKey(VK_UP);

if (nMeMotion == 1)

{

pDoc->my_plane.pos.y -= pDoc->speed_plane / 6;

if (pDoc->my_plane.GetPoint().y <= rect.top)

pDoc->my_plane.pos.y = rect.top;

}

nMeMotion = GetKey(VK_DOWN);

if (nMeMotion == 1)

{

pDoc->my_plane.pos.y += pDoc->speed_plane / 6;

if (pDoc->my_plane.GetPoint().y > rect.bottom - 60)

pDoc->my_plane.pos.y = rect.bottom - 60;

}

nMeMotion = GetKey(VK_LEFT);

if (nMeMotion == 1)

{

pDoc->my_plane.pos.x -= pDoc->speed_plane / 6;

if (pDoc->my_plane.GetPoint().x <= rect.left)

pDoc->my_plane.pos.x = rect.left;

}

nMeMotion = GetKey(VK_RIGHT);

if (nMeMotion == 1)

{

pDoc->my_plane.pos.x += pDoc->speed_plane / 6;

if (pDoc->my_plane.GetPoint().x > rect.right - 50)

pDoc->my_plane.pos.x = rect.right - 50;

}

}

5.5游戏对象进行碰撞测试和碰撞销毁

/敌机子弹与战机碰撞

BOOL CSpaceWarView::CSMA_Ba_Mp()

//战机与敌机碰撞

BOOL CSpaceWarView::CSMA_Mp_En()

//关于BOSS的碰撞

BOOL CSpaceWarView::CSMA_BOSS()

//关于客机的碰撞

BOOL CSpaceWarView::CSMA_Air()

//检查道具碰撞

BOOL CSpaceWarView::CSMA_ADD()

5.6创建动态按钮(开始游戏、游戏规则)

p_MyBut->Create(L"开始游戏", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(250, 293, 380, 333), this, IDC_MYBUTTON);

p_MyBut1->Create(L"游戏规则", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(250, 393, 380, 433), this, IDS_MYBUTTON1);

void CSpaceWarView::OnMybutton()

{

CSpaceWarDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

if (!pDoc)

return;

this->SetTimer(1, 30, NULL);

p_MyBut->~CButton();

p_MyBut1->~CButton();

}

//游戏规则按钮

void CSpaceWarView::OnMybutton1()

{

CSpaceWarDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

if (!pDoc)

return;

CGameRuler gr;

gr.DoModal();

//p_MyBut1->~CButton();

}

5.6重新开始游戏代码

void CSpaceWarView::OnFileNew()

{

KillTimer(1);

pDoc->balldownlist.RemoveAll();

pDoc->balluplist.RemoveAll();

pDoc->explosionlist.RemoveAll();

pDoc->enemyuplist.RemoveAll();

pDoc->enemydownlist.RemoveAll();

pDoc->bomblist.RemoveAll();

pDoc->bossballlist.RemoveAll();

pDoc->bossball1list.RemoveAll();

pDoc->addlifelist.RemoveAll();

pDoc->addbomblist.RemoveAll();

pDoc->airplanelist.RemoveAll();

SetTimer(1, 30, NULL);

pDoc->num_pass = 1;

pDoc->score = 0;

pDoc->life_myplane = 50;

pDoc->life_boss1 = 50;

pDoc->life_boss2 = 100;

// TODO: 在此添加命令处理程序代码

}

5.7设置游戏难度代码

void CSpaceWarView::Onsetdifficult()

{

CSetDialog sd;

sd.speed_plane = pDoc->speed_plane;

sd.speed_bomb = pDoc->speed_bomb;

sd.speed_ball = pDoc->speed_ball;

sd.bom_senditl = pDoc->bom_senditl * 30;

sd.enemy_protime = pDoc->enemy_protime * 30;

if (sd.DoModal() == IDOK)

{

pDoc->speed_plane = sd.speed_plane;

pDoc->speed_bomb = sd.speed_bomb;

pDoc->speed_ball = sd.speed_ball;

pDoc->bom_senditl = sd.bom_senditl / 30;

pDoc->enemy_protime = sd.enemy_protime / 30;

}

// TODO: 在此添加命令处理程序代码

}

5.8游戏结束时释放资源函数

void CSpaceWarView::OnDestroy()

{

CView::OnDestroy();

this->KillTimer(1);

MemBitmap.DeleteObject();

MemDC.DeleteDC();

CSpaceWarDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

CRect rect;

POSITION pos, pt;

this->GetClientRect(&rect);

for (pos = pDoc->explosionlist.GetHeadPosition(); (pt = pos) != NULL;)

{

CExplosion *temp = (CExplosion*)pDoc->explosionlist.GetNext(pos);

pDoc->explosionlist.RemoveAt(pt);

delete temp;

}

// TODO: 在此处添加消息处理程序代码

}

5.9调整对话框大小函数

void CSpaceWarView::OnSize(UINT nType, int cx, int cy)

{

CView::OnSize(nType, cx, cy);

CView::OnSize(nType, cx, cy);

if (MemDC.m_hDC != NULL)

{

MemBitmap.DeleteObject();

MemDC.DeleteDC();

}

MemDC.CreateCompatibleDC(NULL);

CClientDC DC(this);

CRect rect;

this->GetClientRect(&rect);

MemBitmap.CreateCompatibleBitmap(&DC, rect.Width(), rect.Height());

MemDC.SelectObject(&MemBitmap);

// TODO: 在此处添加消息处理程序代码

}

5.10开始界面背景绘制函数

void CSpaceWarView::OnDraw(CDC* pDC)

{

//-------------------------绘制开始界面背景-------------------------------------- CClientDC DC(this);

CRect rect;

this->GetClientRect(&rect);

MemDC.FillSolidRect(rect, RGB(255, 255, 255));

//绘制背景

CBitmap bitmap_BackGround;

bitmap_BackGround.LoadBitmap(IDB_startgame);

BITMAP bimap;//位图图像

bitmap_BackGround.GetBitmap(&bimap);

CDC cdc;

cdc.CreateCompatibleDC(&DC);//创建DC

cdc.SelectObject(&bitmap_BackGround);

pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &cdc, 0, 0, bimap.bmWidth, bimap.bmHeight, SRCCOPY);

// TODO: 在此处为本机数据添加绘制代码

}

5.11选择下一关卡以及选择完成后的执行代码

if (pDoc->score >=200 && pDoc->num_pass == 1)

{

KillTimer(1);

if (AfxMessageBox(L"恭喜你成功通过第一关!是否进入下一关?", MB_YESNO) == 6)

{

pDoc->balldownlist.RemoveAll();

pDoc->balluplist.RemoveAll();

pDoc->explosionlist.RemoveAll();

pDoc->enemyuplist.RemoveAll();

pDoc->enemydownlist.RemoveAll();

pDoc->bomblist.RemoveAll();

pDoc->addlifelist.RemoveAll();

pDoc->addbomblist.RemoveAll();

SetTimer(1, 30, NULL);

pDoc->num_pass++;

pDoc->num_bomb += 100;

}

else

exit(1);

}

6.测试情况说明。

6.1主要模块测试情况(白盒)6.11各游戏对象碰撞检测爆炸模块测试

6.12战机导弹的方向速度模块测试

6.13文字显示,游戏结束和关卡进入模块测试

6.14设置游戏难度和重新开始模块测试

6.2 主要功能测试情况(黑盒)

6.21各游戏对象碰撞检测爆炸模块测试

6.22敌机子弹导弹的方向速度模块测试

6.23文字显示,游戏结束和关卡进入模块测试

6.24设置游戏难度和重新开始模块测试

7. 实训中遇到的主要问题及解决方法

此次实训中遇到的最大的问题是多态应用不熟练、时间间隔设置过多导致修改问题以及运行中断问题。

多态的应用我通过查阅书籍,反复研究代码解决。

时间间隔设置过多的问题通过询问老师,查阅资料等方法了解了其中的问题,并减少时间间隔的数量,改用计数器解决了这个问题。

运行中断问题分不同方面,其中包括对象为空是指针乱指,找不到寻址空间,链表使用

不合理。通过设置断点等解决问题。

后来又遇到做背景滚动的问题,通过上网查阅资料和与同学讨论解决了问题。

8. 实训收获与体会

通过此次实训,我学会了用MFC做游戏的基本方法,但让我感受到自己对于面向对象编程掌握的还是不够好,尤其是一些细节方面基础知识不够扎实,比如说指针,多态方面的问题,再者就是自己在新知识的学习能力不强,总是理解不过来去问同学。还有就是前期规划的不够完善导致后期经常卡壳的现象。这其中就应用了软件工程的思想:前期规划设计开发模式,另外必须坚持分阶段审核,因为好多时候自己的程序因为添加新的东西变得不稳定,必须坚持审核。

我认为做软件工作的人员只有在编写代码中才能学习更多,也更能验证自己学到的东西,所以以后必须多动手实践,在实践中锻炼能力,增长知识。

MFC课程设计报告一个简单的计算器应用程序样本

设计一个简单的计算器应用程序 一、设计目标与内容 1.了解Windows编程的基础知识, 掌握MFC应用程序的基本知识; 2.基本掌握面向对象程序设计的基本思路和方法; 3.掌握用VC++开发应用程序的的一般步骤和方法; 4.能够利用所学的基本知识,设计一个简单的计算器应用程序, 实现基本的加、减、乘、除、求平方根, 求倒数等基本运算( 必须实现的功能) , 实现求角度的正弦、余弦、正切等基本运算、实现求指数、自然对数、常见对数等基本运算( 这部分功能选做) 。 5.在程序中注意处理数据和运算符的输入, 计算结果的显示。二,设计要求 1.用VC++进行编码, 实现应用程序的功能。注重编码质量, 代码要有适当的注释; 2.提交设计报告一份( 课程设计任务书、目录、设计的基本思路、设计的步骤及主要代码、心得体会、参考文献) 。

一个简单的计算器应用程序 总体设计 能够利用所学的基本知识,设计一个简单的计算器应用程序, 实现基本的加、减、乘、除、求平方根, 求倒数等基本运算( 必须实现的功能) , 实现求角度的正弦、余弦、正切等基本运算、实现求指数、自然对数、常见对数等基本运算( 这部分功能选做) 。在程序中注意处理数据和运算符的输入, 计算结果的显示。 详细设计 ◆新建工程Counter 新建工程, 选择对话框应用程序。 ◆程序运行主界面

图2-1 在对话框内添加相应的控件, 分别给编辑框添加三个变量m_N1,m_N2和m_Result。 然后添加一个组合框, 在里面添加十二个单选按钮设置第一个单选按钮为组, 如图 图2-2 然后给对话框类添加一个int变量Operator用来作相应运算时的标记。 给控件添加相应的函数 1、给单选按钮添加相应的函数 void CCounterDlg::OnRadio1() { Operator=1; } void CCounterDlg::OnRadio2()

俄罗斯方块mfc实验报告

程序设计实践 设 计 报 告 课题名称:俄罗斯方块(MFC版)学生姓名:黄嘉慧 班级:2012211113 班内序号:27 学号:2012210389 日期:2014.6.1

1. 实验概述 1.1 课题目标和主要内容。 本课题的主要内容是用MFC 实现经典游戏俄罗斯方块的编写。目标是能够正常运行,并且无过于严重的问题。使用的平台为MFC (基于对话框)。 1.2 采用计分升级制来进行游戏。当一次消去一行时,得一分,一次两行得 4分,一次3行,得9分,一次4行,得16 分。每 50分为一个等 级,得分足够则升级并重新开始游戏。 2. 程序设计 2.1 系统总体框架 用一个4维数组DiamondStruct[7][4][4][4]来表示所有的方块,用一个POINT 类型的DiamondPos 来表示方块当前的位置,然后通过一个二维数组BlockPanel[][],来表示整个游戏界面,同时进行障碍的添加。游戏过程中,通过改变DiamondPos 来进行方块的下降以及

左右移动,通过DiamondStruct[7][4][4][4]中第二个参数的改变来进行方块的变换。 2.2系统详细设计 【1】模块划分图及描述 【2】类关系图及描述 CWinApp 与CDialog 为基类。其它为添加的类。 【3】程序流程图及描述

【4】存储结构,内存分配 主要存储结构为数组。同时分配内存的有,画笔,Diamond类的指针,Panel类的指针,Block类的指针,Mill类的指针,Manager类的指

针。 2.3 关键算法分析 【1】 bool Diamond::FullLine() { bool IsFull,Full=false; pManager->SeriesLine=0; for(int iy=0;iy<=pPanel->nVGridNum;iy++) { IsFull=true; for(int ix=0;ix<=pPanel->nHGridNum;ix++) { if(!pBlock->BlockPanel[ix][iy]) IsFull=false; } if(IsFull) { Full=true; pManager->SeriesLine++; for(int jy=iy;jy>0;jy--) { Sleep(10); for(int jx=0;jx<=pPanel->nHGridNum;jx++) { pBlock->BlockPanel[jx][jy]=pBlock->BlockPanel[jx][jy-1]; } } } } pManager->LineNumber+=pManager->SeriesLine; pManager->Result+=pManager->SeriesLine*pManager->SeriesLine; if(Full) return true; else return false; } 该算法实现的功能为,判断是否已经满行,并且若是满行,进行消行,加分的操作。该算法的时间复杂度为O(n)=【(nVGridNum)^2*nHGridNum.】/2

(整理)基于vcmfc的科学计算器程序实验报告

实验报告 课程名称:windows软件开发实习实验项目:科学计算器

沈阳工业大学实验报告 (适用计算机程序设计类) 专业班级:软件1006 学号:101201622 姓名:张鑫可 实验名称: 1.实验目的: 本程序设计实践是采用C++语言,在VC平台下设计。本课程设 计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。程序设计实践主要是培养学生利用系统综合C++语言进行程序设计的能力。 1.进一步巩固和复习C++程序设计的基础知识。 2.培养学生结构化程序、模块化程序设计的方法和能力。 3.了解软件的编制过程及各环节的具体内容。 4.提高学生程序调试技巧、软件设计能力和代码规范化等素质。 5.提高学生分析问题、解决问题以及实际运用能力。 2.实验内容: 设计一个简单的计算器。要求能实现整数、小数算数运算。程序带 清零按钮。 3. 实验方案(程序设计说明) 见附件 4. 实验步骤或程序(经调试后正确的源程序) (填写主要步骤与程序代码等。见附件A) 5.出现的问题及解决方法

附件A 沈阳工业大学实验报告 (适用计算机程序设计类) 专业班级:软件1006 学号:101201622 姓名:张鑫可 实验步骤或程序: 一、关于Visual C++: Visual C++6.0由Microsoft开发, 它不仅是一个C++ 编译器,而且是一个基于Windows 操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。这些组件通过过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft 的主力软件产品。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft 公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的 首选工具。虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为6平台。 Visual C++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。 二、设计要点 1、基本要求:设计的系统界面要美观大方,操作合理,有必要的 提示。 2、创新要求:在基本要求达到后,进行创新设计。

c计算器实验报告

简单计算器 姓名: 周吉祥 实验目的:模仿日常生活中所用的计算器,自行设计一个简单的计算器程序,实现简单的计算功能。 实验内容: (1)体系设计: 程序是一个简单的计算器,能正确输入数据,能实现加、减、乘、除等算术运算,运算结果能正确显示,可以清楚数据等。 (2)设计思路: 1)先在Visual C++ 6.0中建立一个MFC工程文件,名为calculator. 2)在对话框中添加适当的编辑框、按钮、静态文件、复选框和单选框 3)设计按钮,并修改其相应的ID与Caption. 4)选择和设置各控件的单击鼠标事件。 5)为编辑框添加double类型的关联变量m_edit1. 6)在calculatorDlg.h中添加math.h头文件,然后添加public成员。 7)打开calculatorDlg.cpp文件,在构造函数中,进行成员初始化和完善各控件 的响应函数代码。

(3)程序清单: 添加的public成员: double tempvalue; //存储中间变量 double result; //存储显示结果的值 int sort; //判断后面是何种运算:1.加法 2.减法 3.乘法 4.除法 int append; //判断后面是否添加数字 成员初始化: CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/) : CDialog(CCalculatorDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCalculatorDlg) m_edit1 = 0.0; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); tempvalue=0;

简单计算器设计报告

简单计算器设计报告 045 一、基本功能描述 通过文本编辑框实现基本整数的加减乘除运算 二、设计思路 如下图是整个程序进行的流程图,基本方法是在ItemText文本编辑框输入字符,程序对字符进行判断,若输入不是数字则提示错误。输入正常时,通过下拉框ComboBox_InsertString 选择相应运算符。点击等号IDC_OK,即可得出运算结果。操作简便,算法简单。 三、软件设计 1、设计步骤 打开Microsoft Visual C++ 6.0,在文件中点击新建,在弹出框内选择MFC AppWizard[exe]工程,输入工程名zhoutong及其所在位置,点击确定 1

将弹出MFC AppWizard-step 1对话框,选择基本对话框,点击完成 MFC AppWizard就建立了一个基于对话窗口的程序框架

四、主要程序分析 1、字符判定函数 BOOL IsInt(TCHAR*str) { int i=atoi(str); TCHAR strtemp[256]; wsprintf(strtemp,"%i",i); if(strcmp(str,strtemp)!=0) { return FALSE; } Else { return TRUE; } } 该函数通过atoi把文本编辑框读取的字符转换为数字,再通过wsprintf把转换数字转换为字符,通过strcmp比较原字符和转换得来的字符。如相同返回true,不通则返回false. 3、运算符选择程序 BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { HWND hwndComboOP=GetDlgItem(hwnd,IDC_COMBOOP); ComboBox_InsertString(hwndComboOP,-1,TEXT("+")); ComboBox_InsertString(hwndComboOP,-1,TEXT("-")); ComboBox_InsertString(hwndComboOP,-1,TEXT("*")); ComboBox_InsertString(hwndComboOP,-1,TEXT("/")); return TRUE; } 3

飞机大战MFC实验报告

实训报告 飞机大战游戏设计与开发

目录 1. 概述 (4) 2. 相关技术 (4) 2.1 透明贴图技术 (4) 2.2 CObList链表 (4) 2.3获取矩形区域函数 (4) 2.4弹出对话框函数 (5) 2.5字体的个性化输出函数 (5) 2.6设置定时器 (5) 2.7双缓冲技术 (5) 2.8 内存释放技术 (6) 2.9对话框中添加动态按钮 (6) 2.10检测方向键按下 (6) 3. 需求分析(用结构化方法或面向对象方法给出系统的主要需求模型) (6) 3.1功能需求分析 (6) 3.2 数据需求分析 (7) 3.3 行为需求分析 (7) 3.4 其他需求 (8) 4. 总体设计与详细设计 (8) 4.1 系统模块划分 (9) 4.2 主要功能模块 (10) 4.3 扩展功能设计思路 (10) 5. 编码实现 (11) 5.1游戏初始创建 (11) 5.2定时器 (11) 5.3背景及游戏开始、结束界面绘制函数 (11) 5.4键盘控制函数 (12) 5.5游戏对象进行碰撞测试和碰撞销毁 (13) 5.6创建动态按钮(开始游戏、游戏规则) (13) 5.6重新开始游戏代码 (14) 5.7设置游戏难度代码 (14) 5.8游戏结束时释放资源函数 (15) 5.9调整对话框大小函数 (15) 5.10开始界面背景绘制函数 (15) 5.11选择下一关卡以及选择完成后的执行代码 (16) 6.测试情况说明。 (17) 6.1主要模块测试情况(白盒) (17) 6.11各游戏对象碰撞检测爆炸模块测试 (17) 6.12战机导弹的方向速度模块测试 (17) 6.13文字显示,游戏结束和关卡进入模块测试 (18) 6.14设置游戏难度和重新开始模块测试 (18) 6.2 主要功能测试情况(黑盒) (18)

可视化编程MFC计算器

// cacuDlg.cpp : implementation file // #include "stdafx.h" #include "cacu.h" #include "cacuDlg.h" #include "math.h" #include "cstring" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg)

C++实验报告(MFC简单画图程序)

VC++程序设计实验报告 一、实验目的 掌握MFC编程 二、实验内容 用MFC向导创建单文档应用程序,一个简单的画图程序。 ?使用C++语言实现 ?使用VC++6.0集成开发环境开发 ?使用MFC应用程序开发框架 三、实验步骤 ?基本功能描述 1. 打开exe文件,在绘图下拉菜单中可分别设置绘制的图形形状,如直线、 曲线、矩形及椭圆,线宽选项,有1-6可供选择,线型选项有实线、虚线、点线和点段线供设置,还可以设置线色以及填充色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及填充色,则按默认的画笔,画刷来绘制选择的图形。 2. 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决 定图形的大小,当鼠标弹起,此图形则绘制完毕。 ?设计思路 1. 对需要用到的变量进行初始化。 2. 选择相应的图形之后就响应相应的消息处理函数,给shape赋对应的值。选择不同的线宽,线色与填充色,即可改变画笔或画刷的属性。 3. 鼠标的按下响应函数OnLButtonDown(),捕捉鼠标当前位置得到起点的坐标,鼠标的拖动响函数OnMouseMove()改变终点的坐标,鼠标的弹起响应OnLButtonUp(),确定终点坐标,刷新,得到绘制图形。 4. 选择图形或其它属性,可进行下一次绘制。 ?软件设计 A 设计步骤 1.创建单文档 创建一个MFC AppWizard[exe]工程,命名为“Draw”,如图1所示,并创建单文档,如图2所示。创建成功后,系统自动生成相应的类,如图3所示。

图1 创建工程 图2 创建单文档

c面向对象程序设计MFC简单计算器实验报告

计算机与信息工程学院 《程序设计基础》课程设计报告 题目名称:60.编写一个能实现简单功能的计算器学生姓名:刘沛东 学生学号:2011508154 专业班级:电子信息工程(1)班 指导教师:高攀

1 课程设计的题目 编写一个能实现简单功能的计算器 2 题目要求 1. 有一个计算器图形。 2. 能实现加、减、乘、除及乘方的运算。 3. 当输入题目时,屏幕上要在指定位置上显示出相应的题目内容,且相应的数字键要改变颜色 例如:输入数字1 时,在计算器图形上的1键变为红色。 4. 屏幕、图形颜色、形状自定 3 总体设计 3.1 总体框架 图1 系统框架

3.2 系统功能说明 在VC++6.0中绘制计算器界面,各控件的设置 对0~9控件设定相应的ID和其他属性: 图2 “1”控件设置 对“+、-、*、\”控件设定相应的ID和其他属性: 图2 “+”控件设置 对其它控件设定相应的ID和其他属性: 图3 其它控件设置

主要使用到Layout菜单中的Align功能对各个按钮进行对其,使界面更加整洁。拖出的控件有上面的一个Edit控件用于显示数字,Button控件用于处理鼠标的消息。 4 程序详细设计 4.1系统主调模块 图5 程序流程图

4.2各模块详细设计 4.2.1 建立的变量,控件的命名,对应的消息处理函数对应表 double poz; //保存小数点的位置,初始化为1,表示poz-1个小数点。 double m_Dis; //Edit控件上需要显示的数字 BOOL point_flag; //小数点表示位,判定是否是小数,是小数为1,不是小数为0。 double numfirst; //保存计算过程中的前一个数字, double numsecond;//保存计算过程中的第二个数字 char op;//记录当前的计算符号,可以为’+’,’-’,’*’,’/’,’=’,’c’,’n’ 变量初始化: poz=1; m_Dis = 0.0; numfirst=0; numsecond=0; op=0;

数电实验二:简易计算器(实验报告)

数电实验2实验报告 1、设计修改方案 (1)加入编码器连接4选一数据选择器,控制进行运算的种类 (2)修改了输出端数据选择器的程序,使得当计算器没有任何输入时,结果显示保持为0,并且利用芯片自身的灭零管脚,让显示结果中,当十位为零时,十 位的零不显示。

2、实验数据及分析 (1)修改后电路图(附后) (2)仿真波形 设置输入2个4位二进制数为0110(十进制6)和0010(十进制2),计算方式控制SW[3:0]设为0111,即模拟除法操作,加入时钟信号。 ①模拟除法波形: 可以看到十位(商)的数码管显示中,1、2、3、4、7段亮,显示为数字3,而个位(余数)显示1、2、3、4、5、6段亮,显示数字0,相当于计算出6除2商3余0。满足计算要求。 ②模拟乘法波形:(SW[3:0]设为1011,其他输入同上)

可以看到个位的数码管显示中,1、4、5、6段亮,显示为C(化为十进制为12),而十位一直显示1、2、3、4、5、6段亮,显示数字0,相当于计算出6乘2等于0C,即等于12。当改变输入4和2是,显示结果为8,。满足计算要求。 ③模拟加法波形:(SW[3:0]设为1101,其他输入同上) 可以看到个位的数码管显示中,1、2、3、4、5、6、7段全亮,显示为数字8,而十位一直显示1、2、3、4、5、6段亮,显示数字0,相当于计算出6加2等于08,即等于8。满足计算要求。 ④模拟减法波形:(SW[3:0]设为1110,其他输入同上) 可以看到个位的数码管显示中,2、3、6、7段亮,显示为数字3,而十位一直显示1、2、3、4、5、6段亮,显示数字0,相当于计算出6减2等于03,即等于3。满足计算要求。 从上面加减乘除四种功能运算的波形仿真可以看出,本实验设计能够正确完成对输入数字的上述四种运算。满足题目要求。

MFC计算器编程课程设计实践报告

中南大学本科生课程设计(实践)设计报告(程序设计基础) 题目MFC编程科学计算器学生学号1104120502 学生姓名郭斌繁 指导教师蔡旭晖 学院交通运输工程学院专业班级交通运输类1205班 计算机基础教学实验中心 2013 年 7 月 1 日

程序设计(C++)实践报告 1.引言 C++语言的主要特点表现在两个方面,一是全面兼容C 语言,二是支持面向对象的程序: (1) C++是一个更好的C,它保持了C 语言的优点,大多数的C 程序代码略作修改或不作修改就可在C++的集成环境下调试和运行。这对于继承和开发当前已在广泛的软件是非常重要的,可以节省大量的人力和物力。 (2) C++是一种面向对象的程序设计语言它使得程序的各个模块的独立性更强,程序的可读性和可移植性更强,程序代码的结构更加合理,程序的扩充性更强。这对于设计、编制和调试一些大型的软件尤为重要。 (3) C++集成环境不仅支持C++程序的编译和调试,而且也支持C 程序的编译和调试。通常,C++程序环境约定:当源程序文件的扩展名为c.时,则为C 程序;而当源程序文件的扩展名为cpp.时,则为C++程序。 (4) C++语句非常简练,对语法限制比较宽松,因此C++语法非常灵活。其优点是给用户编程带来书写上的方便。其缺点是由于编译时对语法限制比较宽松,许多逻辑上的错误。 次课程设计主要在运算过程中,如果通过计算器来完成,就会减少计算量,该程序即可以在简单计算器键面下进行简单运算,也可以在科学计算器键面下进行高级的科学计算。并且可以分别计算弧度、角度的三角函数的计算等较为复杂的运算。 (1).设计目标 利用MFC程序开发工具设计一款可以进行简单计算及部分科学计算的计算器。在设计当中将综合“面向对象程序设计与结构化程序设计”的思想方法和知识点,编制一个小型的应用程序系统。通过此设计进一步提高自己的动手能力,并能使自己清楚的知道开发一个应用程序的思想、方法和流程。 (2).选题分析 此次实践所选题目中除了简单的加减乘除运算程序之外还包括了余弦函数、双曲余弦函数、度分秒的转换和X的y次方及y次根号下x的运算程序。除去四

《MFC》实验报告模板

贵州大学实验报告 学院:梁玉涛专业:计算机科学与技术班级:计科职091 姓名梁玉涛学号0920020217 实验组 1 实验时间2011.10.25 指导教师曾劼成绩 实验项目名称使用计算数据画直方图 实 验目的1.了解图形设备接口GDI编程; 2.学会应用GDI编写应用程序; 3.实现使用计算数据画直方图。 实 验要求1.了解有关GDI的相关知识及使用; 2.根据实验指导书完成实验内容。 实 验原理 图形设备接口GDI(Graphics Device Interface)是一个系统库,允许对系统的硬件进行独立于设备的访问。GDI的核心是设备上下文类DC(Device Contex):设置绘图属性和驱动设备绘图的方法。封装了Windows API中的画图函数,设备上下文是内存中的一个对象,设备可以是屏幕或打印机。 实 验 仪 器 计算机、VC++ 6.0 实验步骤1.使用AppWixard生成单文档工程Plot 2.在PlotDoc.h中类CPlotDoc的定义之前加入类Max的定义 3.在PlotDoc.cpp的文件尾部加入类Max的实现部分 4.为CPlotDoc类增加一个公有的void类型的成员函数Find和一个公有int数据成员数组m_num[5],使用类产生对象并计算它们的最大值,将它们转换成int,存入整数数组m_num。 5.为CPlotDoc类的成员函数OnNewDocument增加调用语句准备数据。 6.在视类中画图写字; 7.运行程序,并观察结果。 1

实 验 使用计算数据画直方图 内 容 实 验 数 据 实 验 总 结 指 导 教 师 意 见签名:年月日

c计算器实验报告

c计算器实验报告集团标准化工作小组 #Q8QGGQT-GX8G08Q8-GNQGJ8-MHHGN#

简单计算器 姓名: 周吉祥 实验目的:模仿日常生活中所用的计算器,自行设计一个简单的计算器程序,实现简单的计算功能。 实验内容: (1)体系设计: 程序是一个简单的计算器,能正确输入数据,能实现加、减、 乘、除等算术运算,运算结果能正确显示,可以清楚数据等。 (2)设计思路: 1)先在Visual C++ 中建立一个MFC工程文件,名为calculator. 2)在对话框中添加适当的编辑框、按钮、静态文件、复选框和 单选框 3)设计按钮,并修改其相应的ID与Caption. 4)选择和设置各控件的单击鼠标事件。 5)为编辑框添加double类型的关联变量m_edit1. 6)在中添加头文件,然后添加public成员。 7)打开文件,在构造函数中,进行成员初始化和完善各控件的 响应函数代码。 (3)程序清单: 添加的public成员: double tempvalue; 法 2.减法 3.乘法 4.除法

int append; //判断后面是否添加数字 ●成员初始化: CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/) : CDialog(CCalculatorDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCalculatorDlg) m_edit1 = ; //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); tempvalue=0; result=0; sort=0; append=0; } ●各控件响应函数代码: void CCalculatorDlg::OnButton1() //按钮“1” { // TODO: Add your control notification handler code here if(append==1)result=0;

单片机实验报告 计算器

单片机原理及其应用实验报告基于51单片机的简易计算器的设计 班级:12电子1班 姓名:金腾达 学号:1200401123 2015年1月6日

摘要 一个学期的51单片机的课程已经随着期末的到来落下了帷幕。“学以致用”不仅仅是一句口号更应该是践行。本设计秉承精简实用的原则,采用AT89C51单片机为控制核心,4X4矩阵键盘作为输入,LCD1602液晶作为输出组成实现了基于51单片机的简易计算器。计算器操作方式尽量模拟现实计算器的操作方式,带有基本的运算功能和连续运算能力。并提供了良好的显示方式,与传统的计算器相比,它能够实时显示当前运算过程和上一次的结果,更加方便用户记忆使用。本系统制作简单,经测试能达到题目要求。 关键词:简易计算器、单片机、AT89C51、LCD1602、矩阵键盘

目录 一、系统模块设计......................................................................................... 错误!未定义书签。 1.1 单片机最小系统 (1) 1.2 LCD1602液晶显示模块 (1) 1.3 矩阵按键模块 (2) 1.4 串口连接模块 (1) 二、C51程序设计 (2) 2.1 程序功能描述及设计思路 (2) 2.1.1按键服务函数 (2) 2.1.2 LCD驱动函数 (2) 2.1.3 结果显示函数 (2) 2.1.4状态机控制函数 (2) 2.1.5串口服务函数 (2) 2.2 程序流程图 (3) 2.2.1系统总框图 (3) 2.2.2计算器状态机流程转换图 (3) 三、测试方案与测试结果 (4) 3.1测试方案 (4) 3.3 测试结果及分析 (7) 4.3.1测试结果(仿真截图) (7) 4.3.2测试分析与结论 (7) 四、总结心得 (7) 五、思考题 (8) 附录1:整体电路原理图 (9) 附录2:部分程序源代码 (10)

MFC课程设计报告—模拟计算器

计算机MFC课程设计报告 ——模拟计算器 姓名: 学号:02011227 联系电话: 指导教师: 东南大学机械工程学院 2012年10月14日

模拟计算器 摘要 摘要内容:以课本简单计算器为基础,首先实现了加、减、乘、除、求倒数和平方根的混合运算,并能进行清屏及倒退操作,然后自行完善了书中未能实现的乘、除运算的连续操作,最后自行设计并完成了lg、ln 、sin、cos、^、.、pi、e八个按钮控件的消息映射及程序代码的添加和修改。从中学会了制作简单的基于对话框的小工具、掌握了常用控件的使用、明白了消息映射及消息处理、提高了VC++编程水平。 关键词:四则运算小数点计算器 Analog calculator Abstract Content of abstract: Simple calculator in textbooks as the foundation, first realized the addition, subtraction, multiplication, division, and reciprocal and square root of the mixed operation, and can clear screen and reverse operation, and then to improve the book failed to realize the multiplication, division operation of continuous operation, and finally to be designed and completed the eight button control news mapping and program code to add and modify. Learnt how to make simple dialog-based small tools, mastered the use of commonly used controls, see news mapping and information processing, improve the level of programming.

MFC计算器程序报告

C++课程设计实验报告 学号姓名 院系专业

一、课题名称 简易的计算器设计。 二、问题陈述 编写一个计算器程序,能够进行四则运算、取模等运算 要求: 1、个人完成; 2、运用对话框编写,界面上只能有一个输出框,数据通过按钮输入到程序,并显 示在输出框中;当按下运算符后再输入数据,输出框中应显示新数据;运算结果也显示在输出框中。 3、四则运算、取模运算是最低要求,程序能正确执行; 4、界面设计美观、合理; 5、独立完成; 三、设计目标和设计任务 编写一个计算器程序,能够进行四则运算、取模、乘方、立方,并且给计算器程序添加背景。 四、解题算法思想 1.创建一个基于对话框的项目 2. 给对话框加入相应的操作按钮 3. 给按钮加上代码,设置属性 4. 为实现四则运算、取模等操作添加必要函数 五、程序算法过程 ①选择File→New菜单命令,选择Project选项卡,并选择MFC AppWizard(exe), name 命名为calculator;选择应用程序基于对话框,即Dialog based。多次单击next,最后单击Finish后,系统弹出一对话框,如下图:

②使用按钮控件、文本编辑框控件和组控件,将他们加入到对话框中,并通过更改按钮控件的属性中的标题部分。选中所有按钮,在属性中的Extended Style中选中Modal frame,使其达到下图效果:(注意,在布局按钮时,为了使按钮总体整齐美观,可以先创建一行或一列按钮,使他们保持整齐后,按住Ctrl键,选中这一行或一列按钮,再移动鼠标,即可生成另一行或一列按钮;也可以通过Layout菜单中的指令对其进行布局) ③鼠标右击按钮控件,选择属性,即可对其ID进行更改,各ID与标题内容对应如下: ID 标题ID 标题IDC_BUTTON0 0 IDC_BUTTONCLS 清零 IDC_BUTTON1 1 IDC_ADD + IDC_BUTTON2 2 IDC_PLUS -

MFC计算器实验报告

实验报告一——计算器 一实验名称 简易计算器 二实验目的 在Visual C++.EXE开发环境中,通过编写计算器程序,掌握创建对话框的方法,并向其中添加控件,并设置属性,使之满足程序的要求。 三编程思路 计算器要实现各种运算,在编写中主要分为两大块的编写,一是对1、2、3等数字按钮的响应函数编写,二是对加减乘除等运算符按钮的响应函数的编写。 给Dlg添加变量int m_operator; //运算符 double m_result; //结果(含中间变量) 另外添加编辑框的变量m_res 1.对数字按钮的响应函数的编写 1)由于每个按钮的响应函数相差不大,故用一个函数将其封装 在每次输入时要先判断数据开头是否为0 void CMy0710210202CalculateDlg::button(CString c) { UpdateData(TRUE); m_res+=c; if(m_res.GetAt(0)=='0'&&m_res.Find(".")==-1){ m_res.Empty(); m_res+=c; } UpdateData(FALSE); } 2)小数点按钮的响应函数。 首先要判断输入数据中是否已有小数点,数据是否为0,以及是否还没输入数据。 void CMy0710210202CalculateDlg::OnDian() { // TODO: Add your control notification handler code here UpdateData(TRUE); int n=m_res.Find("."); if(n==-1&&m_res.GetLength()!=0) m_res+="."; else if(m_res.GetLength()==0)m_res+="0."; UpdateData(FALSE); } 2.运算符按钮的响应函数的编写 用m_operator指代要进行的运算,由于每次的运算结果m_result 都传入了编辑框的变量m_res里,故此程序可以实现连续运算。 代码为 void CMy0710210202CalculateDlg::Result() { UpdateData(TRUE);

简易计算器设计实验报告

简易计算器设计实验报告 一.设计任务及要求 1.1实验任务: 根据计算器的原理设计一个具有加减乘除功能的简易计算器。如:5+3*4/8=4。 1.2 实验基本要求: (1)实现最大输入两位十进制数字的四则运算(加减乘除)。 (2)能够实现多次连算(无优先级,从左到右计算结果)。 如:12+34*56-78/90+9=36 (3)最大长度以数码管最大个数为限,溢出报警。 二.实验设计方案 (1)用QuartusII的原理图输入来完成系统的顶层设计。 (2)用VHDL编写以及直接拖模块来各功能模块。 (3)通过2个脉冲分别实现个位数和十位数的输入。 (4)通过选择每次的输出数值,将输出值反馈到运算输入端 (4)通过除法运算实现十六进制到十进制的转换输出。 其具体实现流程图如下:

三系统硬件设计 FPGA: EP2C5T144C8目标板及相应外围硬件电路。(从略) 四系统软件设计 1.数据输入模块 原理:用VHDL创建模块,通过两个脉冲分别对两个数码管进行输入控制,再通过相应运算模块将两个独立数据转化成两位十进制数字。 2.运算模块 原理:用VHDL创建模块,四种运算同步运行,通过按键加、减、乘、除选择输出对应的计算结果,当按键等号来时,将所得结果反馈给运算模块输入端。具体实现代码见附录二。 3.输出模块 原理:用VHDL创建模块,通过按键等号来控制显示运算对象还是运算结果,当等号按下时,输出计算结果,否则显示当前输入的数据,并且通过除法模块将十六进制转化为十进制。当输出结果溢出是LED0亮,同时数码管显示都为零。部分实现见附录二。 五实验调试 输入数据12,再按加法键,输入第二个数字25,按等号键,数码管显示37;按灭加法、等号键,输入第二个数据2,依次按等号键,减法键,数码管显示35;同上,按灭减法键、等号键,输入第三个数据7,依次按等号键,除法键,数码管显示5;按灭除法键、等号键,输入第四个数据99,依次按等号键,乘法键,数码管显示495,按灭乘法键、等号键,当前显示为99,依次按等号键、乘法键,数码管显示49005,同上进行若干次之后,结果溢出,LED0亮,同时数码管显示都为零。当输出为负数时,LED0灯变亮,同时数码管显示都为零。六实验结论 本实验基本实现了计算器的加减乘法运算功能,但是存在一个突出的缺陷,就是当输出结果时,必须先按等号键导通数据反馈,再按运算键选择输出结果。这与实际应用的计算器存在很大的差距。但是,本设计可以通过等号键实现运算对象和运算结果之间的切换。

C++简单计算器课程设计报告

武汉理工大学《专业课程设计2》课程设计说明书 目录 1 基本功能描述 (1) 2 设计思路 (1) 3 软件设计 (4) 3.1 设计步骤 (4) 4 结论与心得体会 (12) 7 附:设计中的关键源代码 (14) 7.2 测试结果 (15)

简单计算器 1 基本功能描述 简单计算器包括双目运算和单目运算功能。双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,阶乘,对数,开方,倒数等运算。可对输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。出现错误会给出相应提示,同时包含清除,退格,退出功能以及有与所有按钮相对应的菜单项。 2 设计思路 如图是整个计算器的流程图,打开计算器程序,输入数据,调用输入数据子程序。子程序开始时m_num为零。按下数字按钮后,判断m_num的正负号,对其进行相关处理,然后在判断是否有小数点,处理后输出结果。 回到总流程图中,输完第一个操作数后,若按下双目运算符,则把m_num存入num2,按下输入第二个操作数并算出结果。若按下的是单目运算符,则直接对其处理得出结果。若按下清零,则m_num等于0.在运算中还要判断运算是否合法,以及结果是否超出显示范围,以做出相关提示,按下清零。算出后把结果保存至num2。若需用算出的结果继续运算则回到输入完第一个操作数后,若不需要则判断试否需要开始新一轮的运算,不需要则结束。

输入数据子函数 N 图1 输入数据子函数流程图

图2 简单计算器总流程图

3 软件设计 3.1 设计步骤 打开Microsoft Visual C++ 6.0,在文件中点击新建,在弹出框内选择MFC AppWizard[exe]工程,输入工程名09107xuzhujie及其所在位置,点击确定,如图3所示。 图3 新建MFC AppWizard[exe]工程 将弹出MFC AppWizard-step 1对话框,选择基本对话框,点击完成,如图4所示。

MFC贪吃蛇实验报告

贪吃蛇实验报告201221143049 信计1212 许圣

1.概述 此次课程设计我利用MFC制作了一个贪吃蛇游戏,用户可以通过上下左右控制蛇的移动方向,游戏会根据贪吃蛇身体的长度自动增加难度。在游戏过程中,会记录运行时间和所得分数,我还添加了bmp格式的图片作为游戏背景。 2.功能描述 2.1设计思路 本软件主要由三个模块构成,它们分别是蛇运行模块,初始化处理模块和显示模块。它们的作用分别是,初始化处理:初始化蛇头位置与第一个点位置;蛇运行模块:控制蛇的上下左右运行,并对蛇的运行状态进行判断,根据(吃点、未吃点、死亡等)状态进行不同的子程序模块处理以及游戏者是否能晋级的判断;显示模块:根据对蛇和点子的当前状态进行动画显示。主要有以下步骤: 1.定义蛇类和食物类,初始化贪吃蛇各项成员变量,包括图像的出现在屏幕的 初始位置,长度,以及蛇的行走方向。食物类的定义包括出现的初始位置,以及食物是否被吃掉的判断。 2.用数组初始化长度为4的贪吃蛇,并且默认出现一个食物。 3.在CView类上运用MFC提供的Windows消息中WM_TIMER消息,运用OnTimer() 函数让系统提供一个时钟节拍,更新游戏 4.具体游戏实现,包括蛇撞到自己和围墙都将使游戏结束,判断吃豆等,其中 还包括根据蛇的长度来进行游戏难度的改变。 5.具体键盘游戏操作运用到Windows消息响应中的WM_KEYDOWN,用OnKeyDown() 来响应玩家的实际操作。 6.添加了bmp格式的图片作为游戏背景。 整体流程图如下图1。

图1:系统流程图

2.2功能介绍 ⑴运行程序,出现围墙界面,一条蛇在密闭的围墙内,在围墙内随机出现一个食 物,出现bmp格式图片的背景。 ⑵点击“游戏->游戏开始”,游戏开始。还可暂停游戏继续 ⑶游戏开始后,界面右下角会同步游戏得分。 ⑷通过四个方向键控制蛇的运动方向,吃掉随机出现的豆子,若不小心碰到墙 壁或者与自身相交,则该轮游戏结束。 ⑸游戏会根据蛇身的长度自动调节难易程度。 3.详细设计 3.1主要函数 ●void CSnakeView::OnDraw(CDC* pDC)//显示背景图片 ●void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)//按照用户的按键来控制蛇的移动 ●void CSnakeView::OnTimer(UINT nIDEvent)//根据蛇的长度来进行 SetTimer()函数的定义,可以根据长度来进行游戏难度的设定。//撞 界判断//蛇身相撞判断//抹掉蛇行走的痕迹//判断吃豆的条件,撞到就 吃//如果食物被吃了就生成 ●void CSnakeView::oninit()//进行贪吃蛇外观的初始化 ●void CSnakeView:: OnGameStart ()//开始游戏 ●void CSnakeView:: IniAim ()//初始化目标的位置 ●void CSnakeView::IniGame()//初始化游戏 ●void CSnakeView::ReDisplay(CPoint pPoint) ●bool CSnakeView::ReadBmp(char *bmpName)

相关文档
最新文档