实验报告嘉美142601017.docx
《实验报告嘉美142601017.docx》由会员分享,可在线阅读,更多相关《实验报告嘉美142601017.docx(62页珍藏版)》请在冰豆网上搜索。
![实验报告嘉美142601017.docx](https://file1.bdocx.com/fileroot1/2023-2/21/9486760d-7eed-49d1-98b7-8c69d3935405/9486760d-7eed-49d1-98b7-8c69d39354051.gif)
实验报告嘉美142601017
2015----2016学年第二学期
系部:
计算机科学系________
班级:
应本141____________
姓名:
李嘉美______________
学号:
142601017___________
专业:
计算机网络技术(网络工程方向)
指导教师:
薄文娟___________
课设时间:
2016年6月6日—12日
成绩:
_________________________
一、课程设计目的:
1.巩固面向对象程序设计语言C++的基本语法和基本操作技能。
2.掌握面向对象程序设计方法和使用集成环境调试和修改程序的方法。
3.提高分析问题和解决问题的能力,为学习后续专业课程打好基础。
二、系统环境
题目一、硬件环境:
windows2007
软件环境:
MicrosoftVisualc++2010Express
题目二、硬件环境:
windows2007
软件环境:
Visualc++6.0
三、需求分析:
1、题目一:
吃豆子游戏
吃豆子游戏敌人与吃豆人遇到墙的位置都不能穿越,需绕道而行。
红色随机动,接近吃豆人时动作没有任改变;黄色S形接近吃豆人,直到找到吃豆人;蓝色与吃豆人在同一行时,会直线追逐吃豆人。
游戏中有五个文件,GMap.h,GMap.cpp,GObject.h,GObject.cpp,pacman.cpp
题目二:
简单文本编辑器
启动VisualC++,选择“文件”->“新建”,弹出“新建”对话框新建一个工程项目。
2、类视图:
四、题目一课程设计的解决方案(具体实现):
1、打开MicrosoftVisualc++2010Express
2、进入起始页点击文件新建项目
3、选择Win32控制台应用程序添加名称、位置点击下一步
4、选择应用程序设置Windows应用程序点击完成
5、点击项目添加类选择c++类并填写类名GMap点击完成
6、点击项目添加类选择c++类并填写类名GObject点击完成
7、编辑pacman.Cpp,编辑完成后打开pacman.Cpp启动调试
题目二课程设计的解决方案(具体实现):
选择“工程”选项卡列表中的“MFCAppWizard(exe)”选项,创建一个使用MFC基础类库进程编程的可执行程序。
在“工程名称”编辑框中输入要创建的项目名称:
MyEdit。
单击“确定”,进入“MFC应用程序向导-步骤1”对话框,选择创建的应用程序类型为“基本对话框”,之后各个步骤均选用默认设置,生成应用程序框架。
五、题目一课程设计内容(涉及的步骤、流程图、结构图、源程序及输出结果)
1、GMap.h
#pragmaonce
#include"stdafx.h"
#include
#defineMAPLENTH19
#defineP_ROW10
#defineP_ARRAY9
#defineE_ROW8
#defineE_ARRAY9
usingstd:
:
list;
//抽象类GMap
classGMap{
protected:
staticintLD;//障碍物尺寸
staticintPD;//豆子的半径
voidInitOP();//敌我双方出现位置没有豆子出现
boolmapData[MAPLENTH][MAPLENTH];//障碍物逻辑地点阵
boolpeaMapData[MAPLENTH][MAPLENTH];//豆子逻辑地点阵
COLORREFcolor;
public:
voidDrawMap(HDC&hdc);//绘制地图
voidDrawPeas(HDC&hdc);//绘制豆子
virtual~GMap();
GMap(){
}
friendclassGObject;//允许物体类使用直线的起点和终点的信息做碰撞检测
friendclassPacMan;//允许“大嘴”访问豆子地图
};
//“第一关”
classStage_1:
publicGMap
{
private:
boolstaticinitData[MAPLENTH][MAPLENTH];
public:
Stage_1();
};
//“第二关”
classStage_2:
publicGMap
{
private:
boolstaticinitData[MAPLENTH][MAPLENTH];
public:
Stage_2();
};
//“第三关”
classStage_3:
publicGMap
{
private:
boolstaticinitData[MAPLENTH][MAPLENTH];
public:
Stage_3();
};
2、GMap.cpp
#include"StdAfx.h"
#include"GMap.h"
intGMap:
:
LD=36;
intGMap:
:
PD=3;
//敌我双方出现位置没有豆子出现
voidGMap:
:
InitOP()
{
peaMapData[E_ROW][E_ARRAY]=false;
peaMapData[E_ROW][E_ARRAY]=false;
}
voidGMap:
:
DrawMap(HDC&memDC)
{
for(inti=0;i{
for(intj=0;j{
//绘制墙壁
if(!
mapData[i][j])
{
RECTrect;
rect.left=j*LD;
rect.top=i*LD;
rect.right=(j+1)*LD;
rect.bottom=(i+1)*LD;
FillRect(memDC,&rect,CreateSolidBrush(color));
}
}
}
}
voidGMap:
:
DrawPeas(HDC&hdc)
{
for(inti=0;i{
for(intj=0;j{
if(peaMapData[i][j])
{
Ellipse(hdc,(LD/2-PD)+j*LD,(LD/2-PD)+i*LD,(LD/2+PD)+j*LD,(LD/2+PD)+i*LD);
}
}
}
}
GMap:
:
~GMap(void)
{
}
//Stage_1成员定义:
#defineAtrue
#defineBfalse
boolStage_1:
:
initData[MAPLENTH][MAPLENTH]=
{
B,B,B,B,B,B,B,B,B,A,B,B,B,B,B,B,B,B,B,
B,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,
B,A,A,B,A,A,B,B,B,A,B,B,B,A,A,B,A,A,B,
B,A,B,B,A,A,A,A,A,A,A,A,A,A,A,B,B,A,B,
B,A,B,A,A,A,B,B,B,A,B,B,B,A,A,A,B,A,B,
B,A,B,A,A,A,A,A,A,A,A,A,A,A,A,A,B,A,B,
B,A,A,A,A,A,B,B,A,A,A,B,B,A,A,A,A,A,B,
B,A,B,A,A,A,A,A,A,A,A,A,A,A,A,A,B,A,B,
B,A,B,A,A,A,A,A,B,A,B,A,A,A,A,A,B,A,B,
A,A,A,A,A,A,A,A,B,B,B,A,A,A,A,A,A,A,A,
B,A,B,A,A,A,A,A,A,A,A,A,A,A,A,A,B,A,B,
B,A,B,A,A,B,A,A,A,A,A,A,A,B,A,A,B,A,B,
B,A,B,A,B,B,B,A,A,A,A,A,B,B,B,A,B,A,B,
B,A,A,A,A,B,A,A,A,A,A,A,A,B,A,A,A,A,B,
B,A,B,B,A,A,A,A,A,A,A,A,A,A,A,B,B,A,B,
B,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,
B,A,A,A,A,B,B,B,A,B,A,B,B,B,A,A,A,A,B,
B,A,A,A,A,B,A,A,A,A,A,A,A,B,A,A,A,A,B,
B,B,B,B,B,B,B,B,B,A,B,B,B,B,B,B,B,B,B,
};
#undefA
#undefB
Stage_1:
:
Stage_1()
{
color=RGB(140,240,240);
for(inti=0;i{
for(intj=0;j{
this->mapData[i][j]=this->initData[i][j];
this->peaMapData[i][j]=this->initData[i][j];
}
}
//敌我双方出现位置没有豆子出现
this->InitOP();
}
//Stage_2成员定义:
#defineAtrue
#defineBfalse
boolStage_2:
:
initData[MAPLENTH][MAPLENTH]=
{
B,B,B,B,B,B,B,B,B,A,B,B,B,A,B,B,B,B,B,
A,A,A,A,A,A,A,B,A,A,B,A,A,A,B,A,B,A,A,
B,A,A,A,B,A,A,B,A,A,B,A,B,A,B,A,B,A,B,
B,B,B,A,B,A,A,B,B,A,B,A,B,A,B,A,B,B,B,
B,A,A,A,A,A,A,A,A,A,A,A,B,B,B,A,A,A,B,
B,A,A,B,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,
B,A,A,B,A,A,A,B,B,B,B,B,B,A,A,B,A,A,B,
B,A,A,B,A,B,A,A,A,A,A,A,A,A,A,B,A,A,B,
B,A,A,B,A,B,A,A,B,A,B,A,A,B,A,B,A,A,B,
A,A,A,B,A,B,A,A,B,B,B,A,A,B,A,B,A,A,A,
B,A,A,B,A,B,A,A,A,A,A,A,A,B,A,A,A,A,B,
B,A,A,B,A,A,A,B,B,B,B,B,A,B,A,A,A,A,B,
B,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,B,
B,A,A,A,B,B,B,B,B,B,B,A,A,A,A,A,A,A,B,
B,A,A,A,A,A,A,A,A,A,A,A,A,B,A,A,A,A,B,
B,B,B,B,B,A,A,A,A,B,B,B,A,B,A,A,A,A,B,
B,A,A,A,B,B,B,A,A,A,A,B,A,B,B,B,A,A,B,
A,A,A,A,B,A,A,A,A,A,A,B,A,A,A,B,A,A,A,
B,B,B,B,B,B,B,B,B,A,B,B,B,A,B,B,B,B,B,
};
#undefA
#undefB
Stage_2:
:
Stage_2()
{
color=RGB(240,140,140);
for(inti=0;i{
for(intj=0;j{
this->mapData[i][j]=this->initData[i][j];
this->peaMapData[i][j]=this->initData[i][j];
}
}
//敌我双方出现位置没有豆子出现
this->InitOP();
}
//Stage_3成员定义:
#defineAtrue
#defineBfalse
boolStage_3:
:
initData[MAPLENTH][MAPLENTH]=
{
B,B,B,B,B,B,B,B,B,A,B,B,B,B,B,B,B,B,B,
A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,A,
B,A,A,B,A,A,B,B,B,B,B,B,B,A,A,A,B,A,B,
B,A,B,B,A,A,A,A,A,A,A,A,B,A,A,A,B,A,B,
B,A,B,A,A,A,B,B,B,B,B,B,B,A,A,A,B,A,B,
B,A,B,A,B,B,B,A,A,A,A,A,B,B,B,A,B,A,B,
B,A,A,A,B,A,B,A,A,A,A,A,A,A,A,A,B,A,B,
B,A,B,A,B,A,A,A,A,A,A,A,A,B,A,A,B,A,B,
B,A,B,A,B,B,A,A,B,A,B,A,A,B,A,A,B,A,B,
B,A,A,A,A,B,A,A,B,B,B,A,A,B,A,A,B,A,B,
B,A,B,A,A,B,A,A,A,A,A,A,A,B,A,A,A,A,B,
B,A,B,A,A,B,A,A,A,A,A,A,B,B,B,A,B,A,B,
B,A,B,A,A,B,A,B,B,B,B,B,B,A,B,A,B,A,B,
B,A,B,A,A,B,A,A,A,A,A,A,A,A,B,A,B,A,B,
B,A,B,B,A,B,B,B,B,B,B,A,B,A,B,A,B,A,B,
B,A,A,A,A,B,A,A,A,A,A,A,B,A,B,A,B,A,B,
B,B,B,B,B,B,A,A,B,B,B,A,B,A,B,A,B,A,B,
A,A,A,A,A,A,A,A,B,A,A,A,A,A,B,A,A,A,A,
B,B,B,B,B,B,B,B,B,A,B,B,B,B,B,B,B,B,B,
};
#undefA
#undefB
Stage_3:
:
Stage_3()
{
color=RGB(100,300,100);
for(inti=0;i{
for(intj=0;j{
this->mapData[i][j]=this->initData[i][j];
this->peaMapData[i][j]=this->initData[i][j];
}
}
//敌我双方出现位置没有豆子出现
this->InitOP();
}
3、GObject.h
#include"stdafx.h"
//方向枚举
#include"GMap.h"
#definePLAYERSPEED6//玩家速度
#defineENERMYSPEED4//敌人速度
#defineLEGCOUNTS5//敌人腿的数量
#defineDISTANCE10//图形范围
#defineBLUE_ALERT8//蓝色警戒范围
#defineD_OFFSET2//绘图误差
#defineRD(DISTANCE+D_OFFSET)//绘图范围12
#include
//方向枚举
enumTWARDS{UP,DOWN,LEFT,RIGHT,OVER};
//物体类
classGObject
{
protected:
intmX;
intmY;
TWARDStwCommand;//指令缓存
POINTpoint;//中心坐标
intdRow;//逻辑横坐标
intdArray;//逻辑纵坐标
intspeed;//速度
TWARDStw;//朝向
intframe;//帧数
//子程序
boolAchive();//判断物体是否到达逻辑坐标位置
boolCollision();//逻辑碰撞检测,将物体摆放到合理位置
intPtTransform(intk);//将实际坐标转换为逻辑坐标
virtualvoidAchiveCtrl();//到达逻辑点后更新数据
public:
intGetRow();
intGetArray();
voidSetPosition(intRow,intArray);
voidDrawBlank(HDC&hdc);
voidvirtualDraw(HDC&hdc)=0;//绘制对象
staticGMap*pStage;//指向地图类的指针,设置为静态,使所有子类对象都能够使用相同的地图
GObject(intRow,intArray){
frame=1;
pStage=NULL;
this->dRow=Row;
this->dArray=Array;
this->point.y=dRow*pStage->LD+pStage->LD/2;
this->point.x=dArray*pStage->LD+pStage->LD/2;
this->mX=point.x;
this->mY=point.y;
}
voidvirtualaction()=0;//数据变更的表现
};
//大嘴,玩家控制
classPacMan:
publicGObject{
protected:
virtualvoidAchiveCtrl();//重写函数
public:
POINTGetPos();
TWARDSGetTw();
boolWin();
voidDraw(HDC&hdc);
voidSetTwCommand(TWARDScommand);
voidOver();
PacMan(intx,inty):
GObject(x,y)
{
this->speed=PLAYERSPEED;
twCommand=tw=LEFT;
}
voidaction();
};
classEnermy:
publicGObject{
protected:
voidCatch();
voidvirtualMakeDecision(boolb)=0;
COLORREFcolor;
public:
staticPacMan*player;
voidvirtualDraw(HDC&hdc);
Enermy(intx,inty):
GObject(x,y)
{
this->speed=ENERMYSPEED;
tw=LEFT;
twCommand=UP;
}
voidvirtualaction();
};
classRedOne:
publicEnermy
{
protected:
voidvirtualMakeDecision(boolb);
public:
voidDraw(HDC&hdc);
RedOne(intx,inty):
Enermy(x,y)
{
color=RGB(255,0,0);
}
};
classBlueOne:
publicRedOne
{
protected:
voidvirtualMakeDecision(boolb);
public:
voidDraw(HDC&hdc);
BlueOne(intx,inty):
RedOne(x,y)
{
color=RGB(0,0,255);
}
};
classYellowOne:
publicRedOne
{
protected:
voidvirtualMakeDecision(boolb);
public:
voidDraw(HDC&hdc);
YellowOne(intx,inty):
RedOne(x,y)
{
color=RGB(200,200,100);
}
};
4、GObject.cpp
#include"StdAfx.h"
#include"GObject.h"
//GObject成员定义:
GMap*GObject:
:
pStage=NULL;
boolGObject:
:
Achive()
{
intn=(point.x-pStage->LD/2)%pStage->LD;
intk=(point.y-pStage->LD/2)%pStage->LD;
booll=(n==0&&k==0);
return1;
}
voidGObject:
:
AchiveCtrl()
{
if(Achive())
{
dArray=PtTransform(point.x);//更新列
dRow=PtTransform(point.y);//更新行
}
}
intGObject:
:
PtTransform(intk)
{
return(k-(pStage->LD)/2)/pStage->LD;
}
intGObject:
:
GetRow()
{
returndRow;
}
intGObject:
:
GetArray()
{
returndArray;
}
voidGObject:
:
DrawBlank(HDC&hdc)
{
RECTrect;
rect.top=mY-RD;
rect.left=mX-RD;
rect.right=mX+RD;
rect.bottom=mY+RD;
FillRect(hdc,&rect,:
:
CreateSolidBrush(RGB(255,255,255)));
}
voidGObject:
:
SetPosition(intRow,intArray)
{
dRow=Row;
dArray=Array;
this->point.y=dRow*pStage->LD+pStage->LD/2;
this->point.x=dArray*pStage->LD+pStage->LD/2;
}
boolGObject:
:
Collision()
{
boolb=false;
AchiveCtrl();//更新行,列的数据若是大嘴,则会执行PacMan重写的AchiveCtrl函数消除豆子
//判断指令的有效性
if(dArray<0||dRow<0||dArray>MAPLENTH-1||dRo