大鱼吃小鱼
VC++综合设计说明书
姓名 王冠 杨焜耀
班级 计科091 计科091
学号 2009111014 2009111038 任务分工 主函数实现 类添加
指导教师 李璟
完成日期 2011年6月10日
一、问题描述
大鱼吃小鱼,是我根据自己的意愿,是为了我将要说明的下面有关内容而设置的。由于没有经过具体实践,我并不能保证其趣味性和吸引力,我们学习的是它实现过程中的一些思想。希望对读者有所帮助。
其实,这种游戏,在街头电子游戏中是常见的。但由于电脑的渐渐普及,大规模游戏的迅速出现,已经不适合玩者的需求了。但是,我们可以以小见大,在学习小游戏的基础上,慢慢培养设计大游戏的一些方法和技巧。
关于游戏的角色:
小鱼(颜色不同),是游戏的主角,它有初始的生命值,它为了生存,必须能够逃脱灾难性的局面(被大鱼撞到),它在经过所谓的适者生存的淘汰之后(在30秒内吃掉20个小鱼),可以吃掉大鱼,以达到防身的目的。每吃一个小鱼得十分,每被大鱼撞一下失去一条生命。
小鱼,一共有20个,但为了维持生态平衡,分时间段显示出来。敌人小鱼,是为了英雄小鱼添加生命值而存在的,它将会在现代科技的伪随机函数中不定向地出现。
大鱼,在小鱼不能吃掉大鱼之前,每碰一下小鱼,会减掉小鱼的生命值,一次减60生命值。
气泡,为了让界面漂亮而而设置的,没有碰撞之后的反应。
关于游戏的实现:
游戏,经常都是全屏的,但是由于我们的目的不仅仅在于游戏本身,我们的宗旨是利用游戏的趣味性和吸引力,来增强读者学习程序语言的信心。所以,在前面我们都没有用到全屏显示,我们不需要。
另外说明:本游戏的全屏只适应于800*600的分辨率。
多位图的移动,是本游戏要学习的内容,上面的有很多位图可以移动,这是由于游戏本身决定的。当然,这个游戏的多位图移动,也是游戏本身决定的,当然,我们没有那么多的手去操作键盘,去移动位图。我们必须设置我们的程序,让程序自己去执行,去移动,去显示计算机的优越性。
这个游戏,只是玩者一个人充当角色。所以,我们新建了各自的类。
二、程序特点
本设计可以设置不同的难度,不同的难度是指大鱼会跟着小鱼移动,这样增加了游戏的难度和可玩性,另外,漂亮的背景和位图也是程序的特点,类的层次分明,采用Skin++皮肤。
三、系统设计
1( 制作位图
既然游戏是复杂的,它就需要很多位图,只是说明一下位图的数量和大小。
背景位图:800*600 1张 IDB_GROUND
英雄小鱼位图:50*50 4张 IDB_HERO
敌小鱼位图:50*50 1张 IDB_ENEMY
气泡位图:50*50 1张 IDB_PALL
1
2( 变量和函数
英雄小鱼:
它有位置,生命值,生命力。其中它自己的图像。我们必须为它定义一个类。
新建类:CHero
添加变量如下:
public:
CPoint m_pointHero; // 英雄的位置
CBitmap m_bmpHero; // 英雄的图象
bool HeroFlag; //英雄是否显示
bool first;
int HeroLife; //英雄生命值
int m_nWidth; // 英雄的图象宽
int m_nHeight; // 英雄的图象高
敌小鱼
它也有位置,也有它自己的图像。由于一共有二十个球,我们也定义它为一共类。
新建类:CEnemy
添加变量如下:
public:
CPoint m_pointEnemy; // 小鱼的位置
CBitmap m_bmpEnemy; // 小鱼的图象
bool EnemyFlag; //小鱼是否显示
int EnemyLife; //小鱼生命值
int m_nWidth; // 小鱼的图象宽
int m_nHeight; // 小鱼的图象高
int num; //区分显示不同位图
气泡
它也有位置,也有它自己的图像。由于一共有二十个球,我们也定义它为一共类。
新建类:CPall
添加变量如下:
public:
CPoint m_pointPall ; // 气泡的位置
CBitmap m_bmpPall; // 气泡的图象
bool PallFlag; //气泡是否显示
int PallLife; //气泡生命值
int m_nWidth; // 气泡的图象宽
int m_nHeight; // 气泡的图象高
int num; //区分显示不同位图
2
Boss
它也有位置,也有它自己的图像。由于一共有二十个球,我们也定义它为一共类。
新建类:CBoss
添加变量如下:
public:
CPoint m_pointBoss; // boss的位置
CBitmap m_bmpBoss; // boss的图象
bool BossFlag; //boss是否显示
int BossLife; //boss生命值
int m_nWidth; // boss的图象宽
int m_nHeight; // boss的图象高
bool first; //是否跟踪
游戏:
最后,到了主程序,
在CGameView中添加如下变量和函数:
public:
CPall pall[4];//气泡数组
CBoss boss[4];//boss数组
CHero hero;//英雄
CEnemy enemy[21]//敌小鱼数组;
CLeval Dlg;//设置难度的对话框
int leval;//难度
int Score;//得分
int temp;//时间
void DrawGround(CDC *pDC, CRect Client);//画背景
BOOL ShotOn(CRect &body1, CRect &body2);//碰撞检测
3( 具体实现
CBoss::CBoss()
{
m_pointBoss = CPoint(926, 10);//初始boss位置坐标
BossFlag=true;//初始显示
first=true; //用于是否跟踪,跟踪为false
BossLife=100;//生命值设为100
m_bmpBoss.LoadBitmap(IDB_BOSS);
BITMAP BM;
m_bmpBoss.GetBitmap(&BM);
m_nWidth = BM.bmWidth/2;
m_nHeight = BM.bmHeight;
}
// 显示boss
void CBoss::ShowBoss(CDC *pDC, CDC *pMemDC, CRect Client)
{
pMemDC->SelectObject(&m_bmpBoss);
pDC->BitBlt(m_pointBoss.x,m_pointBoss.y,m_nWidth,m_nHeight,
pMemDC,m_nWidth,0,SRCPAINT);//或运算
pDC->BitBlt(m_pointBoss.x,m_pointBoss.y,m_nWidth,m_nHeight,
pMemDC,0,0,SRCAND);//与运算
}
3
// 改变boss位置 在屏幕上方来回平移
void CBoss::ChangePos(int num) {
if(m_pointBoss.x<0||m_pointBoss.y>500)
{//边界是926
m_pointBoss.x = rand()%926;
m_pointBoss.y = rand()%600;
}
else
{
m_pointBoss.x -= num;
m_pointBoss.y+=rand()%12;
}
}
void CBoss::ResetPos()
{
m_pointBoss=(0,0);
}
CBoss::~CBoss()
{
}
CEnemy::CEnemy()
{
num=rand()%20;
m_pointEnemy = CPoint(926, 10);//初始位置坐标
EnemyFlag=false;
EnemyLife=10;//生命值设为10
if (num<5)
{
m_bmpEnemy.LoadBitmap(IDB_ENEMY);
}
else if (num>10)
{
m_bmpEnemy.LoadBitmap(IDB_ENEMY2);
}
else
{
m_bmpEnemy.LoadBitmap(IDB_ENEMY3);
}
BITMAP BM;
m_bmpEnemy.GetBitmap(&BM);
m_nWidth = BM.bmWidth/2;
m_nHeight = BM.bmHeight; }
// 显示小鱼
void CEnemy::ShowEnemy(CDC *pDC, CDC *pMemDC, CRect Client)
{
pMemDC->SelectObject(&m_bmpEnemy);
pDC->BitBlt(m_pointEnemy.x,m_pointEnemy.y,m_nWidth,m_nHeight,
pMemDC,m_nWidth,0,SRCPAINT);//或运算
pDC->BitBlt(m_pointEnemy.x,m_pointEnemy.y,m_nWidth,m_nHeight,
pMemDC,0,0,SRCAND);//与运算
}
// 改变小鱼位置 在屏幕上方来回平移
4
void CEnemy::ChangePos(int num) {
if(m_pointEnemy.x<0||m_pointEnemy.y>500)
{//边界是926
m_pointEnemy.x = rand()%926;
m_pointEnemy.y = rand()%600;
}
else
{
m_pointEnemy.x -= num;
m_pointEnemy.y+=rand()%12;
}
}
void CEnemy::ResetPos()
{
m_pointEnemy=(0,0);
}
CEnemy::~CEnemy()
{
}
CHero::CHero()
{
m_pointHero = CPoint(100, 300);//坐标赋初值
HeroFlag=false;
first=true;
HeroLife=10;//生命值初始设为100
m_bmpHero.LoadBitmap(IDB_HERO);
BITMAP BM;
m_bmpHero.GetBitmap(&BM);//通过此函数获得图像的长与宽
m_nWidth = BM.bmWidth/2;
m_nHeight = BM.bmHeight; }
// 显示英雄
void CHero::ShowHero(CDC *pDC, CDC *pMemDC, CRect Client)
{
pMemDC->SelectObject(&m_bmpHero);
pDC->BitBlt(m_pointHero.x,m_pointHero.y,m_nWidth,m_nHeight,
pMemDC,m_nWidth,0,SRCPAINT);//或运算
pDC->BitBlt(m_pointHero.x,m_pointHero.y,m_nWidth,m_nHeight,
pMemDC,0,0,SRCAND);//与运算
}
// 根据tag改变英雄位置
void CHero::ChangePos(int tag) {
if(tag == 0 && m_pointHero.x+m_nWidth < 986)//边界
m_pointHero.x += 20;//右移
else if(tag == 1 && m_pointHero.x > 0)//边界
m_pointHero.x -= 20;//左移
else if(tag == 2 && m_pointHero.y+m_nHeight < 600)//边界
m_pointHero.y += 20;//下移
else if(tag == 3 && m_pointHero.y+m_nWidth >60)//边界
m_pointHero.y -= 20;//上移
}
//复位英雄位置
void CHero::ResetPos()
5
{
m_pointHero = CPoint(100, 300);//坐标赋初值
HeroFlag=false;
HeroLife=10;//生命值初始设为10
m_bmpHero.LoadBitmap(IDB_HERO1);
BITMAP BM;
m_bmpHero.GetBitmap(&BM);//通过此函数获得图像的长与宽
m_nWidth = BM.bmWidth/2;
m_nHeight = BM.bmHeight; }
CHero::~CHero()
{
}
CPall::CPall()
{
num=rand()%20;
m_pointPall = CPoint(26, 600);//初始位置坐标
PallFlag=false;
PallLife=10;//生命值设为10
m_bmpPall.LoadBitmap(IDB_BITMAP4);
BITMAP BM;
m_bmpPall.GetBitmap(&BM);
m_nWidth = BM.bmWidth/2;
m_nHeight = BM.bmHeight; }
// 显示pall
void CPall::ShowPall(CDC *pDC, CDC *pMemDC, CRect Client)
{
pMemDC->SelectObject(&m_bmpPall);
pDC->BitBlt(m_pointPall.x,m_pointPall.y,m_nWidth,m_nHeight,
pMemDC,m_nWidth,0,SRCPAINT);//或运算
pDC->BitBlt(m_pointPall.x,m_pointPall.y,m_nWidth,m_nHeight,
pMemDC,0,0,SRCAND);//与运算
}
// 改变pall上下移动
void CPall::ChangePos(int num) {
if(m_pointPall.y>0)
{//边界是926
m_pointPall.y -= rand()%60;
}
else
{
m_pointPall.y=rand()%1024;
}
}
void CPall::ResetPos()
{
m_pointPall=(0,0);
}
6
CPall::~CPall()
{
}
CGameView::CGameView()
{
// TODO: add construction code here
Score=10;
temp=0;
pall[0].m_pointPall=CPoint(0,600);
pall[1].m_pointPall=CPoint(200,600);
pall[2].m_pointPall=CPoint(600,600);
pall[3].m_pointPall=CPoint(960,600);
boss[0].m_pointBoss=CPoint(200,10);
boss[1].m_pointBoss=CPoint(20,10);
boss[2].m_pointBoss=CPoint(20,100);
boss[3].m_pointBoss=CPoint(600,500);
enemy[0].m_pointEnemy=CPoint(100,20);
enemy[1].m_pointEnemy=CPoint(400,230);
enemy[2].m_pointEnemy=CPoint(200,210);
enemy[3].m_pointEnemy=CPoint(40,50);
enemy[4].m_pointEnemy=CPoint(16,2);
enemy[5].m_pointEnemy=CPoint(130,68);
enemy[6].m_pointEnemy=CPoint(45,40);
enemy[7].m_pointEnemy=CPoint(10,80);
enemy[8].m_pointEnemy=CPoint(110,80);
enemy[9].m_pointEnemy=CPoint(10,800);
enemy[10].m_pointEnemy=CPoint(10,800);
enemy[11].m_pointEnemy=CPoint(102,800);
enemy[12].m_pointEnemy=CPoint(130,800);
enemy[13].m_pointEnemy=CPoint(10,1800);
enemy[14].m_pointEnemy=CPoint(10,800);
enemy[14].m_pointEnemy=CPoint(46,800);
enemy[15].m_pointEnemy=CPoint(10,800);
enemy[16].m_pointEnemy=CPoint(10,0);
enemy[17].m_pointEnemy=CPoint(0,800);
enemy[18].m_pointEnemy=CPoint(10,800);
enemy[19].m_pointEnemy=CPoint(10,800);
enemy[20].m_pointEnemy=CPoint(10,800); }
//画背景
void CGameView::DrawGround(CDC *pDC, CRect Client)
{
CBitmap bitmap;
CDC dcMemory;
bitmap.LoadBitmap(IDB_GROUND);
dcMemory.CreateCompatibleDC(pDC);
dcMemory.SelectObject(&bitmap);
pDC->BitBlt(0,0,Client.right-Client.left,Client.bottom-Client.top,&dcMemory,0,0,SRCCOPY);
}
void CGameView::OnDraw(CDC* pDC) {
CGameDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//的确,
CDC BufferDC; //首先定义一个显示设备对象
7
CDC MemDC; //首先定义一个显示设备对象
MemDC.CreateCompatibleDC(pDC);
CBitmap MemBitmap;//定义一个位图对象
CRect rect;
GetClientRect(&rect);
int ClientWidth;
int ClientHeight;
ClientWidth =rect.right-rect.left;
ClientHeight = rect.bottom-rect.top;
//随后建立与屏幕显示兼容的位图内存显示设备
//MemDC.CreateCompatibleDC(pDC);
//随后建立与屏幕显示兼容的缓存显示设备
BufferDC.CreateCompatibleDC(pDC);
//下面建立一个与屏幕显示兼容的位图,位图的大小可以用窗口的大小
MemBitmap.CreateCompatibleBitmap(pDC,ClientWidth,ClientHeight);
//将位图选入到内存显示设备中
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
BufferDC.SelectObject(&MemBitmap);
DrawGround(&BufferDC,rect) ; // 画背景
hero.ShowHero(&BufferDC,&MemDC,rect);
if (pall[0].PallFlag)
{
pall[0].ShowPall(&BufferDC,&MemDC,rect);
}
if (pall[1].PallFlag)
{
pall[1].ShowPall(&BufferDC,&MemDC,rect);
}
if (pall[2].PallFlag)
{
pall[2].ShowPall(&BufferDC,&MemDC,rect);
}
if (pall[3].PallFlag)
{
pall[3].ShowPall(&BufferDC,&MemDC,rect);
}
if (boss[0].BossFlag)
{
boss[0].ShowBoss(&BufferDC,&MemDC,rect);
}
if (boss[1].BossFlag)
{
boss[1].ShowBoss(&BufferDC,&MemDC,rect);
}
if (boss[2].BossFlag)
{
boss[2].ShowBoss(&BufferDC,&MemDC,rect);
}
if (boss[3].BossFlag)
{
boss[3].ShowBoss(&BufferDC,&MemDC,rect);
}
for (int i=0;i<=20;i++)
{
if (enemy[i].EnemyFlag)
{
enemy[i].ShowEnemy(&BufferDC,&MemDC,rect);
}
}
8
CString num;
num.Format("%d",Score);
BufferDC.TextOut(0,10,"Score:"+num);
pDC->BitBlt(0,0,ClientWidth,ClientHeight,&BufferDC,0,0,SRCCOPY);
//绘图完成后的清理
MemBitmap.DeleteObject();
BufferDC.DeleteDC();
MemDC.DeleteDC();
}
void CGameView::OnGamestart()
{
// TODO: Add your command handler code here
SetTimer(1,220,NULL);
SetTimer(2,1000,NULL);
Score=10;
}
void CGameView::OnGamestop()
{
// TODO: Add your command handler code here
KillTimer(1);
}
//碰撞检测
BOOL CGameView::ShotOn(CRect &body1, CRect &body2)
{
//若body2矩形区域的左上角在body1矩形区域中,则返回true
return body1.PtInRect(body2.TopLeft()); }
void CGameView::OnTimer(UINT nIDEvent) {
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 1:
pall[0].ChangePos(-15);
pall[1].ChangePos(-10);
pall[2].ChangePos(9);
pall[3].ChangePos(3);//自己随机改变位置
boss[0].ChangePos(20);//
boss[1].ChangePos(-30);//
/*boss[2].ChangePos(50);*/// 始终跟着英雄
if (boss[3].first)
{
boss[3].ChangePos(-50);
}
if (!boss[3].first)
{
if (boss[3].BossFlag)
{
if (boss[3].m_pointBoss.x
hero.m_pointHero.x)
{
boss[3].m_pointBoss.x-=10;
}
if (boss[3].m_pointBoss.y>hero.m_pointHero.y)
9
{
boss[3].m_pointBoss.y-=10;
}
if (boss[3].m_pointBoss.yhero.m_pointHero.x)
{
boss[2].m_pointBoss.x-=20;
}
if (boss[2].m_pointBoss.y>hero.m_pointHero.y)
{
boss[2].m_pointBoss.y-=20;
}
if (boss[2].m_pointBoss.y=5)
{
hero.first=false;
}
if(temp%5==0)
{
10
boss[0].BossFlag=true;
enemy[0].EnemyFlag=true;
enemy[1].EnemyFlag=true;
}
if(temp%10==0)
{
enemy[2].EnemyFlag=true;
enemy[3].EnemyFlag=true;
}
if(temp%15==0)
{
enemy[5].EnemyFlag=true;
enemy[4].EnemyFlag=true;
}
if(temp%20==0)
{
pall[3].PallFlag=true;
pall[2].PallFlag=true;
pall[1].PallFlag=true;
pall[0].PallFlag=true;
enemy[6].EnemyFlag=true;
enemy[7].EnemyFlag=true;
}
if(temp%25==0)
{
enemy[8].EnemyFlag=true;
enemy[9].EnemyFlag=true;
}
if(temp%30==0)
{
for (int i=10;i<=20;i++)
{
enemy[i].EnemyFlag=true;
}
}
break;
}
Invalidate(false);
CView::OnTimer(nIDEvent); }
void CGameView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch(nChar)
{
case VK_UP:
hero.ChangePos(3);
break;
case VK_DOWN:
hero.ChangePos(2);
break;
case VK_LEFT:
hero.ChangePos(1);
break;
case VK_RIGHT:
hero.ChangePos(0);
11
break;
}
for (int i=0;i<=20;i++)
{
if(ShotOn(enemy[i].GetEnemy(),hero.GetHero())||ShotOn(hero.GetHero(),enemy[i].GetEnemy()))
{
//如果被接到就加十分
//并且置显示位为false
enemy[i].EnemyFlag=false;
hero.HeroLife+=10;
enemy[i].ResetPos();
}
}
for (int j=0;j<=3;j++)
{
if (!boss[j].first)
{
if(ShotOn(boss[j].GetBoss(),hero.GetHero())||ShotOn(hero.GetHero(),boss[j].GetBoss()))
{
//如果被接到就去20分
//并且置显示位为false
hero.HeroLife+=60;
boss[j].BossFlag=false;
boss[j].ResetPos();
}
}
if (boss[j].first)
{
if(ShotOn(boss[j].GetBoss(),hero.GetHero())||ShotOn(hero.GetHero(),boss[j].GetBoss()))
{
//如果被接到就去20分
//并且置显示位为false
hero.HeroLife-=60;
}
}
}
if (leval==2)
{
boss[3].first=false;//等级为2的时候就激活另一大鱼的跟踪
}
Score=hero.HeroLife;
if (Score<=0)
{
AfxMessageBox("被大鱼吃了~");
}
else if (Score>=20&&temp<=30)//如果在半分钟之内得200分,就算通关
{
Score=10;
MessageBox("超过200分,可以吃大鱼了哦!");
boss[3].first=false;
boss[2].first=false;
boss[1].first=false;
boss[0].first=false;
}
Invalidate(false);
12
CView::OnKeyDown(nChar, nRepCnt, nFlags); }
void CGameView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch (nChar)
{
case '1':
hero.m_pointHero.x-=10;
hero.m_pointHero.y+=10;
break;
case '2':
hero.m_pointHero.x+=10;
hero.m_pointHero.y+=10;
break;
case '3':
hero.m_pointHero.x+=10;
hero.m_pointHero.y-=10;
break;
case '4':
hero.m_pointHero.x-=10;
hero.m_pointHero.y-=10;
break;
}
CView::OnChar(nChar, nRepCnt, nFlags); }
void CGameView::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
CMenu *popmenu=menu.GetSubMenu(0);//获取“命令”菜单项
popmenu->TrackPopupMenu(
TPM_LEFTALIGN,
point.x,point.y,this); }
void CGameView::OnLeval()
{
// TODO: Add your command handler code here
if (IDOK==Dlg.DoModal())
{
leval=Dlg.m_leval;
}
CString str;
str.Format("%d",leval);
AfxMessageBox("有"+str+"个大鱼要追着吃你哦");
}
void CGameView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
hero.m_pointHero=point;
Invalidate(false);
CView::OnLButtonDown(nFlags, point); }
13
四、问题与讨论
遇到了屏幕闪的问题,原因是在OnTimer和OnKeyDown函数中调用了Invalidate,默认的是Invalidate(TRUE);通过增加一个buffer缓存,先将位图存入缓存中,然后一次性将缓存内的copy到内存中,就实现了不闪动的频繁。这时候要注意Invalidate(FALSE);
关于显示多个对象的问题,通过定义一个数组来实现。
关于让小鱼移动的更真实,采用伪随机函数来改变小鱼的移动的变量,还有让小鱼间隔性的出现,通过添加一个标记,来区分显示与否。
增加难度的设置,添加模态对话框,并添加关联变量来实现数据的交换。
通过添加皮肤的库文件,加载皮肤,然后释放资源。
五、程序截图
14
15
六、改进与展望
鉴于我们团队的技术和时间问题,有很多好的想法都没有实现: 这个程序,我们学习了另外一种常见的游戏。我们还学习了屏幕显示方法,虽然这里的全屏显示并不完全;但是它说明了一个道理:
圆是不存在的,因为它太完美了~
所有的程序,所有的算法都是不完美的,都是有待改进的。我们必须承认它的存在,当然,我们也必须努力改进它,尽量使它完美。
这个程序,并不是我们没有能力,我们只是为了说明上面的道理。 七、总结
通过这次课程设计,加深了对游戏的认识,发现了很多问题,不是不能实现,而是想法是否逻辑,我了解了游戏的最基本形式。ontimer()函数是控制游戏运行的根本函数,借助这一函数,能实现贪吃蛇、俄罗斯方块、赛车等多个游戏的开发。随机数生成函数rand()的应用在游戏中是一个关键步骤,通过不断的循环和调用,能保证游戏的持续进行和更新,其实不止是这个游戏,在大多数需要随机生成元素的游戏中,都可以用rand()函数生成随机数,再控制坐标等变量实现“随机生成”功能。
碰撞检测是一个逻辑性比较强的地方,这一段代码的实现,我们想了很多,也找了很多资料,不管是检测碰撞类型先后顺序,还是碰撞检测的位置都经过了
16
多次试验,虽然成品游戏中的代码能够实现,但是我们还是改了又改,让它以我们最理想的形式实现。
通过这一次课程设计,我最大的收获就是问题解决问题能力的提高,发现问题,而后解决问题是生活的永续循环,这种能力会伴随我们一生;其次,程序的开发给了我很多经验,相信时间充裕的话,我能独立开发一个小游戏;最后,老师提出的对设计报告的种种也为我以后的各种报告的规范性做好了心理准备。
八、参考文献资料
[1]孙 鑫.《VC++深入详解》.北京.电子工业出版社.2007.11 [2]谭浩强.《C++程序设计》.北京.清华大学出版社.2004.06 [3]刘春辉.《Visual C++程序设计学习笔记》.北京.电子工业出版社.2008.05
[4]Charles Petzold.《Windows 程序设计》.北京.北京大学出版社.1999.03 [5]曾凡锋《.MFC编译技巧与范例详解》.北京.清华大学出版社.2008.10
17