算术24游戏 实验报告.docx
《算术24游戏 实验报告.docx》由会员分享,可在线阅读,更多相关《算术24游戏 实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
算术24游戏实验报告
目录
1、任务书...............................1
2、需求分析.............................7
2.1程序的功能........................7
2.2输入输出的要求....................7
3、概要设计.............................7
4、详细设计.............................8
4.1各模块的类C码算法................8
4.2流程图.............................9
5、调试分析以及设计体会.................10
5.1调试分析...........................10
5.2心得体会...........................12
6、使用说明.............................13
7、附录.................................14
2、需求分析
2.1程序的功能
程序运行后产生4个扑克牌,对应4个整数,其中每个数字只能使用一次;任意使用+-*/(),构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏。
在输入表达式时程序会自动检测用户输入的数据是否为程序产生的那4个整数,如果不是就提醒用户输入有误,重新输入或退出程序。
有的时候程序随机产生的扑克牌对应的整数可能不能算成24,如产生了4个A,这个时候用户只要点击无解程序就会自动退出了。
2.2输入输出的要求
输入的运算符只能是+、-、*、/、(、)这六个,输入的整数必须是程序随机产生的那四个数,而且每个数只能用一次。
3、概要设计
功能模块图
24算法游戏的功能模块不多,也比较容易实现。
基本思想就是由程序先随机产生4张扑克牌,每张扑克牌对应一个整数,所以首先要有一个随机产生扑克牌的模块。
接下来就是用户用程序产生的扑克牌来算24点了,所以要有一个输入用户去接表达式的模块。
用户输入完成后,程序就开始计算表达式了,所以要有一个计算表达式的模块。
程序计算完表达式后就要判断用户输入的表达式是不是为24点了,所以还有一个判断表达式正误的模块。
这4个模块是逐步递进的,是要前一个模块的功能完成后,才能执行后一个模块,否则程序就将出错。
程序所涉及的数据结构主要为整形和字符型,整形数据结构主要是用来计算表达式的,字符型数据结构主要是用来输入表达式的。
程序所涉及的数据库结构主要有数组和栈,数组在计算表达式和产生扑克牌是都要用到,栈只是用来计算表达式的。
4、详细设计
4.1各模块的类C码算法
随机产生扑克牌函数
for(循环4次)
{随机产生一个1到13之间的数,用switch语句输出产生的数,作为扑克牌的数,再随机产生一个数,也用switch语句输出,作为扑克牌的花色。
把产生的数和花色组装成一个扑克牌用图形的方式显示出来;}
将算术表达式转换为后缀表达式
While(从exp读取字符ch,ch!
=’\0’)
{ch为数字:
将后续的所有数字均依次存放到postexp中,并以字符“#”标志数值串的结束;
ch为做括号“(”:
将次括号进栈道运算式栈op中;
ch为右括号“)”:
将运算符栈op中的左括号“(”以前的运算符依次出栈并存放到postexp中,然后将左括号“(”删除;
ch为“+”或“-”:
将运算符栈op中的左括号“(”以前的运算符依次出栈并存放到postexp中,然后将“+”或“-”进栈;
ch为“*”或“/”:
将运算符栈op中“*”或“/”运算符依次出栈并存放到postexp中,然后将“*”或“/”进栈;}
若字符串exp扫描完毕,则将运算符栈op中的所有运算符依次出栈并存放到postexp中。
计算后缀表达式
While(从postexp读取字符ch,ch!
=’\0’)
{ch为“+”:
从栈st中出栈两个数值a和b,计算c=a+b;将c进栈;
ch为“-”:
从栈st中出栈两个数值a和b,计算c=b-a;将c进栈;
ch为“*”:
从栈st中出栈两个数值a和b,计算c=a*b;将c进栈;
ch为“/”:
从栈st中出栈两个数值a和b,若a不为零,计算c=b/a;将c进栈;
ch为数字等:
将连续的数字串转换成数值d,将d进栈;}
4.2流程图
算术表达式转换成后缀表达式的流程图
图3.2.1
计算后缀表达式的流程图
图3.2.2
5、调试分析以及设计体会
5.1调试分析
当程序编译没有错误的时候,我觉得我的程序快要成功了。
可是在运行的时候老是产生四张一样的扑克牌,但是单步调试的时候又能够产生四张不一样的扑克牌,这个困难难了我好久,直到答辩的时候老师帮我找到了原因所在,解决我这个困难。
当程序能够正确运行时,首先进入的是如图5.1.1所示的界面。
图5.1.1
这时我们就可以输入算24的表达式了,如10/5*4*3就等于24,所以我们就可以计算出正确结果来了,并可以继续游戏,如图5.1.2所示。
这时程序又会重新产生四张扑克牌,这次我来测试一下当输入了与所发的扑克牌不一致的牌,看程序能不能检测的出来,如图5.1.3所示,程序能够检测出输入有误的扑克牌,并且要我们重新输入与界面产生的扑克牌所对应的数字,当输入无误时,
图5.1.2
图5.13
图5.1.4
又可以得到正确的结果,如图5.1.4所示。
有的时候程序会产生四张无论怎么计算都不能得到结果为24的扑克牌,这个时候我们就只要将扑克牌所对应的数字输入就可以了,虽然会得出不等于24的结果,但可以重新发牌,如图5.1.5所示。
总的来说经过调试之后,程序大体上都没有错误,但有一些小的细节我还没有解决好,比如产生了四张不能算出结果为24的扑克牌时没有设计重新发牌,所以只能继续运行,得到错误的结果。
图5.1.5
5.2心得体会
课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。
回顾起此次课程设计,至今我仍感慨颇多,从拿到题目到完成整个编程,从理论到实践,在整整两个礼拜的日子里,可以学到很多很多的的东西,同时不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,首先对图形设计一点都不了解,翻阅图书,查找资料花费了我很多的时间和精力。
同时在设计的过程中发现了自己的许多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,所以在做课设的过程之中老是需要翻教材,这严重影响了我完成课设的进度。
不过两周的时间还算是充裕的,所以我还有时间在最后将程序和实验报告写好。
我所做的24点算法游戏是一个经典的课题,并且算一个相对容易的课题。
其主要思路是有程序来随机产生4个扑克牌,每个扑克牌对应一个整数,然后让用户用这4个整数去计算24点,每张扑克牌对应的整数只能够用一次,并且所用的运算符也只能说+、-、*、/、(、)这六个。
如果用户输入的表达式有不是程序随机产生的扑克牌所对应的整数或用了除上面六个运算符以外的运算符的话,程序要能自行的检查出来,并要求用户重新输入或退出程序。
要实现随机产生扑克牌还是很容易做到的,但是要结合图形将扑克牌输出来就有点难了,这就要求我要对图形设计有所了解,而我以前从未接触过图形设计,在做课设前也只是匆匆看了一点书,所以只能够写一些非常简单的程序,所以我的程序在做出来之后,只能显示4个扑克牌和背景颜色,对于界面的布局不甚了解,所以界面就没设计的很好看,只是勉强将图形显示了出来。
我想这应该是我本次课设应该着重需要完善的地方。
本次课程设计的重点是对表达式的计算,这才是数据结构问题。
计算表达式要用到重要的数据结构栈,要用栈先将算术表达式转换成后缀表达式,程序才能执行计算表达式功能。
所以只要对栈的知识掌握了,就会很容易完成表达式的计算的设计。
总体来说,本次课设相对来说比较简单,只要用心去做,是可以顺利完成的。
通过这次课程设计之后,一是把以前所学过的知识重新温习了一下,二是又学到了新的知识,而且对图形设计发生了很大的兴趣,我会在课设完成之后再去钻研图形设计的。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,比如循环程序每次产生的数都是同样的,但是在陈老师的辛勤指导和同学们积极地帮助下,终于解决了。
原因竟然是我将设置种子的函数放到了循环体中,所以每次循环都会重新设置种子,导致每次随机产生的随机数都是一样的,在其他问题都解决了,而单单没有找出这个问题的根本所在,因为编译和链接都没有错误,这样找起来非常不容易,好在老师们经验很多,最后还是发现了问题的所在,所以在此对给过我帮助的所有同学和各位指导老师表示忠心的感谢!
6、使用说明
本游戏的规则很简单,在开始游戏后,会产生4张扑克牌。
要求只有用户输入的表达式中的数字是程序随机产生的扑克牌所对应的整数,运算符只能是+、-、*、/、(、)这6个。
每张扑克牌所对应的整数只能使用一次,上面6个运算符可以任意使用。
若产生的4张扑克牌对应的整数无论怎样计算结果都不可能为24的话(如产生了4个A),用户直接可以输入无解退出游戏。
7、附录
#include
#include
#include
#include
#include
#include
#defineCOL100
#defineROW40
inta[4];
charexp1[20];
voidmain()/*主函数*/
{
voidCreateCard();
voidInput();
intTrans(char*p,charpostexp[]);
intCompvalue(char*q);
voidDisplay(inty);
inta,x;
charc,*p,*q,postexp[20];
intgd=DETECT,gm;
initgraph(&gd,&gm,"");
setbkcolor(BLACK);
while
(1)
{
p=exp1;q=postexp;
clrscr();
CreateCard();
loop:
Input();
a=Trans(p,postexp);
if(a==0);
elsegotoloop;
x=Compvalue(q);
Display(x);
printf("\n\n\tshifoujixu?
(Y/N)");
scanf("%c",&c);
if(c=='N'||c=='n')exit(0);
else;
}closegraph();}
voidCreateCard()/*随机产生扑克牌的函数*/
{
intm,n,i;
charstr1[100],str2[100];
randomize();
for(i=0;i<4;i++)
{m=random(13);a[i]=m+1;
n=random(4);printf("\t");
bar(COL+i*100-35,ROW+100-50,COL+i*100+35,ROW+1*100+50);/*画空牌*/
setcolor(GREEN);
rectangle(COL+i*100-32,ROW+100-48,COL+i*100+32,ROW+100+48);/*画矩形框*/
switch(m)/*显示扑克牌的数字*/
{
case0:
sprintf(str1,"%c",'A');break;
case1:
sprintf(str1,"%d",2);break;
case2:
sprintf(str1,"%d",3);break;
case3:
sprintf(str1,"%d",4);break;
case4:
sprintf(str1,"%d",5);break;
case5:
sprintf(str1,"%d",6);break;
case6:
sprintf(str1,"%d",7);break;
case7:
sprintf(str1,"%d",8);break;
case8:
sprintf(str1,"%d",9);break;
case9:
sprintf(str1,"%d",10);break;
case10:
sprintf(str1,"%c",'J');break;
case11:
sprintf(str1,"%c",'Q');break;
case12:
sprintf(str1,"%c",'K');break;
}
settextstyle(0,0,3);
outtextxy(COL+i*100-15,ROW+100-15,str1);/*显示扑克牌牌体的大小*/
switch(n)
{case0:
setcolor(RED);sprintf(str2,"%c",3);break;
case1:
setcolor(RED);sprintf(str2,"%c",4);break;
case2:
setcolor(BLACK);sprintf(str2,"%c",5);break;
case3:
setcolor(BLACK);sprintf(str2,"%c",6);break;
}
settextstyle(0,0,2);
outtextxy(COL+i*100-30,ROW+100-46,str2);/*显示左上角花色*/
outtextxy(COL+i*100+16,ROW+100+32,str2);/*显示右下角花色*/
printf("\t");
}}
voidInput()/*输入求解表达式函数*/
{charch;
gotoxy(1,15);/*移动光标*/
printf("\n\tshurunideqiujiebiaodashi:
");
scanf("%s%c",exp1,&ch);
}
intTrans(char*p,charpostexp[])/*将后缀表达式转换为中缀表达式*/
{
Struct/*栈,用来转换表达式*/
{chardata[20];
inttop;
}op;
intd,i;
char*q=p;
op.top=-1;i=0;
printf("\t");
while(*q!
='\0'){printf("%c",*q);q++;}/*将你输入的表达式输出来*/
while(*p!
='\0')
{
switch(*p)
{case'(':
op.top++;op.data[op.top]=*p;p++;break;
case')':
while(op.data[op.top]!
='(')
{postexp[i++]=op.data[op.top];op.top--;}
op.top--;p++;break;
case'+':
case'-':
while(op.top!
=-1&&op.data[op.top]!
='(')
{postexp[i++]=op.data[op.top];op.top--;}
op.top++;op.data[op.top]=*p;p++;break;
case'*':
case'/':
while(op.data[op.top]=='*'||op.data[op.top]=='/')
{postexp[i++]=op.data[op.top];op.top--;}
op.top++;op.data[op.top]=*p;p++;break;
default:
d=0;
while(*p>='0'&&*p<='9')
{postexp[i++]=*p;d=10*d+(*p-'0');
p++;}
postexp[i++]='#';
if(d==a[0]||d==a[1]||d==a[2]||d==a[3]);/*设置d来检测输入的数据是否有扑克牌所对应的数一致*/
else{printf("\n\n\tshurushujuyouwu,qingchongxinshurushuju!
");return1;}
}}
while(op.top!
=-1)
{postexp[i++]=op.data[op.top];
op.top--;}
postexp[i]='\0';
return0;
}
intCompvalue(char*q)/*计算后缀表达式*/
{
struct
{
intdata[20];
inttop;
}st;
inta,b,c,d;st.top=-1;
while(*q!
='\0')
{
switch(*q)
{
case'+':
a=st.data[st.top];st.top--;
b=st.data[st.top];st.top--;
c=a+b;st.top++;
st.data[st.top]=c;break;
case'-':
a=st.data[st.top];st.top--;
b=st.data[st.top];st.top--;
c=b-a;st.top++;
st.data[st.top]=c;break;
case'*':
a=st.data[st.top];st.top--;
b=st.data[st.top];st.top--;
c=a*b;st.top++;
st.data[st.top]=c;break;
case'/':
a=st.data[st.top];st.top--;
b=st.data[st.top];st.top--;
if(a!
=0)
{c=b/a;st.top++;
st.data[st.top]=c;}
else
{printf("chushuwei0!
\n");exit(0);}break;
default:
d=0;
while(*q>='0'&&*q<='9')
{d=10*d+(*q-'0');q++;}
st.top++;st.data[st.top]=d;break;}
q++;}
return(st.data[st.top]);
}
voidDisplay(inty)/*显示函数*/
{if(y==24)printf("=24\tsuccess!
");
elseprintf("!
=27\twrong!
");}
_
计算机与通信学院课程设计评分表
课程名称:
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期:
(注:
1.此页附在课程设计报告之后;2.综合成绩按优、良、中、及格和不及格五级评定。
)