计算机实习报告
班级:
姓名:
学号:
日期:
小学期计算机实习实验报告
一.功能说明
1.1总体功能说明
主要实现俄罗斯方块游戏,添加了音乐文件
1.2用户界面
这两个界面可以实现显示分数,当前等级,以及下一个将会出现的图形
如果按下esc键或到顶时会出现第二个图中的界面,并根据提示选择
消行后实现加分数即score,当消行30行后level加1
1.3使用方法
在游戏中,利用a键,s键,d键,w键分别控制向左,向下,向右,变形。
每消一行就加一分,当满30分时,level加1,游戏的方块落下速度就会加快。
还添加了音乐,可以一边万游戏一边听音乐
二.程序设计说明
2.1 总体设计框架
2.2 关键算法描述
2.3 程序设计的难点和关键点
难点:在工作界面上有一个实际坐标,我们定义一个map数组以后要将实际坐标呵map里 第几个元素的坐标对应
void Init();
主要实现界面的的编译,显示score,level,next等
void drawBlocks( int m[][24],int a[][4],int w,int h,int mapx,int mapy,WORD wColors[],int nColors ,int c);
主要实现显现方块
void Clearsquare( int m[][24],int a[][4],int w,int h,int mapx,int mapy,WORD wColors[],int nColors );
主要实现消除方块
void Judge(int m[][24] ,int a[][4],int w,int h,int *mx,int *my,int *mapxy,WORD wColors[],int nColors);
判断方块是否可以移动
void Cls(WORD wColors[],int nColors);
当游戏结束再来一次是清除屏幕上的方块
void Disappear(int m[][24],int a[][4],int w,int h,int mapx,int mapy,WORD wColors[],int nColors,int c ) ;
当满一行时消除一行并实现加分和level变化
bool IsAvaiable(int m[][24],int a[][4],int mapx ,int mapy,int *mx,int*my,int w,int h,WORD wColors[],int nColors);
判断方块是否可以下落
void Turn(int a[][4],int w,int h,int mapx,int mapy,int* mx ,int *my, int m[][24] ,WORD wColors[],int nColors ,int c);
实现方块的旋转,变形
bool DrawBlocks(int m[][24] ,int a[][4],int w,int h,int mapx,int mapy,WORD wColors[],int nColors,int i);
插入以上的某些函数,可以实现方块下落时各种功能
关键点
主要是界面的编译;
方块的显现及擦除;
方块下落时向左或向右移动不会到框外面;
方块满一行自动消除并使分数加1并判断是否改变level;
暂停游戏或退出游戏
Gameover后怎么再来一次,再来一次之前怎么清除原来方框的方块,并把分数归0和level归一
2.4 调试的方法
调试时可以逐语句调试,也可以逐过程调试,当执行时出现错误时,双击错误,到出错的地方进性更改或是设置断点,进性调试,观察函数中参数的变化并根据错误修改程序
在调试的过程中,我出现的bug如下:
错误 解决方法
1.方块不能擦除 添加了一个擦除函数 Clearsquare;
2.方块下落时会覆盖已经停下的方块 添加一个判断函数看是否可以下落
3方块从左边出来 改变方块的横纵坐标以及其他参数
4.按退出键没有反应 添加判断语句
5.方块无法消行 添加函数Disappear
6方块消行后,其他方块无法下移, 在Disappear中添加语句实现方块的下移
7.分数无法累计 将score定义为全局变量
[过程中出现的问题和解决方法]
2.5 程序性能评价
优点:
界面比较清晰,有各种提示,运行过程中比较容易控制,游戏的方块是不同的颜色,比较美观,添加了音乐功能,可以边玩游戏边听音乐。
缺点:、
消行后原来方块的颜色不能保存
三.心得体会
在编完俄罗斯方块后,最大的感触就是自己还要学的知识还有很多。
在这次编写俄罗斯方块代码的体验中,我遇到了很多困难,甚至有时候连书上的东西都看不懂了,有时候感觉很沮丧,想不做了,但是想到别人能做的,我为什么不能做。所以就一步一步通过看书查资料以及向别人请教,终于有了成果。
在最开始时1,我是一脸迷茫,不知道该怎么动手,看见同学们都有进展,就特别召集,所以一步步尝试编译,设计,调试,修改函数一直到实现一个一个功能。每当一个功能实现时心情时无比激动,想到那么多天的付出终于有回报了!!!
通过这次实习,我学会了怎样查找资料怎
第二篇:北邮小学期计算机实习报告
计算机实习报告
姓名: 大学霸
班级: xxxxxxxxx
学号: xxxxxxxxx
小班序号:xx
指导老师:苗建松
题目:基于mfc的科学计算器
邮箱:xxxxxxxxx@qq.com
题目mfc科学计算器实验报告
一.功能说明
1.1总体功能说明
科学计算器包括双目运算和单目运算功能。双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,反正余弦,对数,开方,百分数,整数的进制转换等运算。可对输入任意操作数或直接点击常数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。出现错误会给出相应提示,同时包含清除,退格,退出功能以及有与所有按钮相对应的菜单项。
1.2用户界面
界面功能:此计算器与现实中的科学计算器类似,每个键都有负责的功能,分为数字键(0,1,……),运算键(+,-,……),功能键(sin,cos,……),进制转换按钮(二进制,……)及界面顶部的编辑框。数字键负责输入操作数,功能键负责执行不同的功能,进制转换按钮可以把结果转换至不同的进制并显示出来,点击等号键输出结果。点击左上方红叉可退出此计算器程序
1.3使用方法
操作数输入:第一种方法,通过单击数字键,正负号,小数点,百分号或常数输入所需的操作数输入结果会在编辑框中显示;第二种方法,单击编辑框,当编辑框中出现I型光标时,直接使用键盘输入所需的操作数。
四则运算及幂:在进行四则运算及幂此类双目运算时,先输入第一个操作数,然后单击所需的双目操作符,接着输入第二个操作数,运算完成。接下来要是点击等号“=”则输出运算结果;输入数字就进行新的运算;再单击双目操作符就是进行连算,将结果第一个操作数进行新的运算。
三角函数,乘方开方,对数运算:此类属于单目运算,输入操作数,单击操作符,进行单目类运算,运算结果会直接显示在编辑框内。特色之处在于当操作数不在运算符运算函数的定义域内时,程序会弹出消息框报错并清楚错误数据。
进制转换按钮:使用方法与单目操作符类似,先输入要转换的十进制数,点击其他进制,屏幕上就会显示转换后的结果。此功能仅限于整数的转换。
退格及清除数据按钮(CE,C):如果数据输入有误,点击CE会将编辑框中的数据的最后一位消去,点击C会清除当前存储的数据,重新进行计算。
二.程序设计说明
2.1 总体设计框架
计算器总流程图
2.2 关键算法描述
2.2.1数字键的程序:
void CTestDlg::OnBnClickedBtn0()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("0");
}
void CTestDlg::OnBnClickedBtn1()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("1");
}
void CTestDlg::OnBnClickedBtn2()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("2");
}
void CTestDlg::OnBnClickedBtn3()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("3");
}
void CTestDlg::OnBnClickedBtn6()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("6");
}
void CTestDlg::OnBnClickedBtn4()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("4");
}
void CTestDlg::OnBnClickedBtn5()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("5");
}
void CTestDlg::OnBnClickedBtn7()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("7");
}
void CTestDlg::OnBnClickedBtn8()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("8");
}
void CTestDlg::OnBnClickedBtn9()
{
// TODO: 在此添加控件通知处理程序代码
ClickNum("9");
}
2.2.2 ClickNum函数
void CTestDlg::ClickNum(const char* strNum)
{
UpdateData(TRUE);
if (m_IsFirstNum)
{
m_strResult = "";
m_IsFirstNum = FALSE; //若是数值的第一个数字,则清空编辑框,显示第一个数字
}
m_strResult = m_strResult+strNum; //若是后续数字,则直接添加到原有数字后面
UpdateData(FALSE);
}
2.2.3四则运算及幂的程序
void CTestDlg::OnBnClickedBtnAdd() //加号函数控件
{
// TODO: 在此添加控件通知处理程序代码
Compute(m_chOper);
m_chOper = '+';
}
void CTestDlg::OnBnClickedBtnResult() //等号函数控件
{
// TODO: 在此添加控件通知处理程序代码
Compute(m_chOper);
m_chOper = '=';
}
void CTestDlg::OnBnClickedBtnMult() //乘号函数控件
{
// TODO: 在此添加控件通知处理程序代码
Compute(m_chOper);
m_chOper = '*';
}
void CTestDlg::OnBnClickedBtnSub() //减号函数控件
{
// TODO: 在此添加控件通知处理程序代码
Compute(m_chOper);
m_chOper = '-';
}
void CTestDlg::OnBnClickedBtnDiv() //除号函数控件
{
// TODO: 在此添加控件通知处理程序代码
Compute(m_chOper);
m_chOper = '/';
}
void CTestDlg::OnBnClickedBtnPow() //幂函数控件
{
// TODO: 在此添加控件通知处理程序代码
Compute(m_chOper);
m_chOper = 'P';
}
2.2.4 compute函数
void CTestDlg::Compute(char chOper) //操作符函数
{
UpdateData(TRUE);
m_nTemp2 = atof(m_strResult); //将CString类型化为浮点型
switch(chOper)
{
case '+':
m_nTemp2 = m_nTemp1 + m_nTemp2;
break;
case '-':
m_nTemp2 = m_nTemp1 - m_nTemp2;
break;
case '*':
m_nTemp2 = m_nTemp1 * m_nTemp2;
break;
case '/':
if(m_nTemp2) //判断被除数是否为零
m_nTemp2 = m_nTemp1 / m_nTemp2;
else{
MessageBox("ERROR:被除数不能为0");
OnBnClickedBtnC();}
break;
case 'P':
if(m_nTemp1<0&&modf(m_nTemp2,&m_nTemp2)!=0){
MessageBox("ERROR:负数只有整数幂");
OnBnClickedBtnC();}
else
m_nTemp2 = pow(m_nTemp1 , m_nTemp2);
default:
break;
}
m_nTemp1 = m_nTemp2;
m_strResult.Format("%g",m_nTemp2); //将浮点型化为CString型
m_IsFirstNum = TRUE;
m_point=FALSE;
UpdateData(FALSE);
}
2.2.5正负号的程序
void CTestDlg::OnBnClickedBtnSign() //正负号控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_nTemp2=atof(m_strResult)*(-1);
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
UpdateData(FALSE);
}
2.2.6百分号的程序
void CTestDlg::OnBnClickedBtnPercent() //百分数函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_nTemp2=atof(m_strResult)/100;
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
2.2.7小数点的程序
void CTestDlg::OnBnClickedBtnPoint() //小数点函数控件
{
// TODO: 在此添加控件通知处理程序代码
if(m_point){}
else
{
ClickNum(".");m_point=TRUE;
}
}
2.2.8三角函数数的程序
void CTestDlg::OnBnClickedBtnSin() //正弦函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
double ang=atof(m_strResult)/180*pi; //弧度转换
m_nTemp2=sin(ang);
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
void CTestDlg::OnBnClickedBtnCos() //余弦函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
double ang=atof(m_strResult)/180*pi; //弧度转换
m_nTemp2=cos(ang);
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
void CTestDlg::OnBnClickedBtnTan() //正切函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
double ang=atof(m_strResult)/180*pi; //弧度转换
m_nTemp2=tan(ang);
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
2.2.9反三角函数的程序
void CTestDlg::OnBnClickedBtnArcsin() //反正弦函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if((atof(m_strResult))>=(-1)&&(atof(m_strResult))<=1) //定义域判断
{
m_nTemp2=asin(atof(m_strResult))/pi*180; //角度转换
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
}
else
{
MessageBox("ERROR:定义域[-1,1]");
OnBnClickedBtnC();
}
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
void CTestDlg::OnBnClickedBtnArccos() //反余弦函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if((atof(m_strResult))>=(-1)&&(atof(m_strResult))<=1) //定义域判断
{
m_nTemp2=acos(atof(m_strResult))/pi*180; //角度转换
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
}
else
{
MessageBox("ERROR:定义域[-1,1]");
OnBnClickedBtnC();
}
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
void CTestDlg::OnBnClickedBtnArctan() //反正切函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_nTemp2=atan(atof(m_strResult))/pi*180; //角度转换
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
2.2.10平方的程序
void CTestDlg::OnBnClickedBtnSquare() //平方函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_nTemp2=pow(atof(m_strResult),2);
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
2.2.11开方的程序
void CTestDlg::OnBnClickedBtnSqrt() //开方函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if(atof(m_strResult)<0) //定义域判断
{
MessageBox("ERROR:操作数应不小于0");
OnBnClickedBtnC();
}
else
{
m_nTemp2=sqrt(atof(m_strResult));
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
}
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
2.2.12对数的程序
void CTestDlg::OnBnClickedBtnLn() //自然对数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if(atof(m_strResult)<=0) //定义域判断
{
MessageBox("ERROR:操作数应大于0");
OnBnClickedBtnC();
}
else
{
m_nTemp2=log(atof(m_strResult));
m_strResult.Format("%g",m_nTemp2);
m_nTemp2=0;
}
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
2.2.13常数的程序
void CTestDlg::OnBnClickedBtnExp() //超越数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_strResult.Format("%g",e);
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
void CTestDlg::OnBnClickedBtnPi() //圆周率常数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_strResult.Format("%g",pi);
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
2.2.14进制转换的程序
voidCTestDlg::OnBnClickedRadioBin() //二进制转换控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
int m_nTemp2=atof(m_strResult),i;
m_strResult="";
while(m_nTemp2!=0){
i=m_nTemp2%2;
m_strResult=char('0'+i)+m_strResult;
m_nTemp2/=2;
}
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
void CTestDlg::OnBnClickedRadioOct() //八进制转换控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
int m_nTemp2=atof(m_strResult);
m_strResult.Format("%o",m_nTemp2);
m_nTemp2=0;
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
void CTestDlg::OnBnClickedRadioHex() //十六进制转换控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
int m_nTemp2=atof(m_strResult);
m_strResult.Format("%X",m_nTemp2);
m_nTemp2=0;
m_IsFirstNum=TRUE;
UpdateData(FALSE);
}
2.2.15 CE&C的程序
void CTestDlg::OnBnClickedBtnCe() //退格函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_strResult = m_strResult.Left(m_strResult.GetLength()-1);
UpdateData(FALSE);
}
void CTestDlg::OnBnClickedBtnC() //清除所有数据函数控件
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
m_nTemp1 = 0;
m_nTemp2 = 0;
m_chOper = ' ';
m_strResult = "0";
m_IsFirstNum = TRUE;
m_point=FALSE;
UpdateData(FALSE);
}
2.3 程序设计的难点和关键点
单目操作符和双目操作符的运算顺序及逻辑不同
某些函数有特定的定义域,操作数是否在定义域要进行判断,如有错误,进行提示
避免输入多个小数点,加入小数点判断变量m_point
编辑框与CString类型变量关联,在计算时用atof函数转化为浮点数,计算结果用format函数格式化输出
2.4 调试的方法
调试报告
2.5 程序性能评价
优点:使用mfc与类的编程方法,面向过程;在课本原有程序上进行功能拓展,加入了指数对数,三角函数,进制转换等功能,并且能进行连续运算。
不足:时间仓促,进制转换只能从十进制的整数转换成其他进制,有待改进;进行连算时不能按运算符的优先级来算。
三.心得体会
经过多番测试,得出结论为设计的计算器能够完成功能描述内容中的全部功能。
正所谓“纸上谈兵终觉浅,觉知此事要躬行。”所以在本学期课程设计是很及时、很必要的。这样不仅能加深我们对MFC程序设计的掌握,而且还及时、真正的做到了学以致用。主要是以下几点。
基本功要过硬。不能马虎经常犯犯小错误。提高自己找错纠错能力,通常错误总是那几种,多练习就熟练了。
要善于查找资料提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。开始着手程序设计时,有些功能感觉无从下手,都不知道要干什么。这些问题只要找到相关的资料就会得到提示从而理解所要解决问题的大致方向。有了明确的目的,就可以发挥自己的头脑来完成它了。
要善于思考。程序中有些实现难点和最初完成程序时免不了的许多不足就需要自己根据代码认真思考来解决。只有这样才能纠正程序的不足并使其更加人性化。