admin 管理员组

文章数量: 1086019


2024年4月17日发(作者:selector document)

成绩

课程设计报告

题 目 24点游戏

课 程 名 称 软件项目实践(二)

院 部 名 称 龙蟠学院

专 业 计算机科学与技术

班 级

学 生 姓 名

学 号

课程设计地点 校内实验室

课程设计学时 2周(40学时)

指 导 教 师 沈 奇

金陵科技学院教务处制

课程设计报告目录

一、实验目的和要求 ....................................................................................................................... 2

二、实验仪器和设备 ....................................................................................................................... 2

三、实验过程 ................................................................................................................................... 2

四、实验结果与分析 ....................................................................................................................... 6

五、实验心得 ................................................................................................................................. 10

1

一、实验目的和要求

1.实验目的

1) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

2) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方

法和技能;

3) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

4) 训练用系统的观点和软件开发一般规范进行软件开发。

5) 培养快速学习新的知识,并在项目中使用的能力。

2.实验要求

设计并实现24点游戏,满足以下基本要求:

① 运行系统后,用户登录,输入用户名后,可以进入游戏,或查看英雄榜。

② 玩家开始游戏后,系统随机产生四个1-13的数,分别代表13张牌。提示

玩家输入算式。判断玩家输入的表达式是否合法,其中算式中的四个数字只能是

程序所给的四个数字。当玩家正确输入算式后,运用“用堆栈求解表达式”的原

理,求出结果并判断是否为24,得出用户是输是赢的结果。

③ 如果用户赢,计算其所用时间(从输入算式开始计算,直至输入算式结束),

并与英雄榜中成绩进行比较。可以进入英雄榜的,则需更新英雄榜。英雄榜只按

成绩降序记录1-5名相关信息。

二、实验仪器和设备

Microsoft WindowsXP / Windows 7Turbo C/Visual C++

三、实验过程

一.需求分析

1.1 需求概述分析

本系统共分为四个模块:普通用户登录模块,用户模块,游戏模块和更改用

户模块以下是各个模块的功能简介。

(1)普通用户登录模块

检测用户名是否存在,检查密码是否正确;

(2)用户模块

选择用户需要执行的操作(进入游戏、查看英雄榜、切换用户、退出)。

(3)游戏模块

用户进行游戏,计算用户游戏时间,更新英雄榜。

(4)更改用户模块

提供对用户的更改功能。

2

1.2模块分析

24算法游戏的功能模块不多,也比较容易实现。基本思想就是由程序先随

机产生4张扑克牌,每张扑克牌对应一个整数,所以首先要有一个产生随机数模

块。接下来就是用户用程序产生的随机数来算24点了,所以要有一个输入用户

去接表达式的模块。用户输入完成后,判断输入表达式是否合法,所以要有一个

判断表达式合法与否的模块。如果表达式合法程序就开始计算表达式了,所以要

有一个计算表达式的模块。程序计算完表达式后就要判断用户输入的表达式是不

是为24点了,所以还有一个判断表达式正误的模块。这5个模块是逐步递进的,

是要前一个模块的功能完成后,才能执行后一个模块,否则程序就将出错。程序

所涉及的数据结构主要为整形和字符型,整形数据结构主要是用来计算表达式

的,字符型数据结构主要是用来输入表达式的。程序所涉及的数据库结构主要有

数组和栈,数组在计算表达式和产生随机数是都要用到,栈只是用来计算表达式

的。

二.面向对象分析

2.1 用例图

登录

用户

退出

(1) 用户用例图

进入游

查看英

雄榜

用户

切换用

退出

(2)系统用例图

3

2.2类图

用户名:admin,user,lily

密码:user

登录()

进入游戏()

查看英雄榜()

退出()

2.3 流程图

24点程序整体流程图:

开始

开始界面

输入用户名和密

与数据库进行核

选择事件

切退

换出

返回上一层

游戏算法流程图:

4

启动程序

判断表达式是否

符合要求

符合

NO

判断表达式结果

是否为24

输出“Wrong”

YES

输出“very goo”

是否继续

NO

结束

YES

将输入求解的算术表达式转换成后缀表达式的流程图:

开始

*p!=‘0

将算术表达式转

换为后缀表达式

将表达式中未扫描完

的字符存STACK中

结束

三.分工

在此次课程设计中主要负责24点表达式的算法。由系统给出的四个随机数

字(1-13)按要求输入计算表达式,并且验证表达式结果是否为24。同时还有

将算术表达式转换为后缀表达式

四.项目总结

这一次编写大作业的程序又让我感受到学程序可以锻炼缜密的思维了。因为

平时练习的都是小程序,所以句段比较少,一些错误都很容易被检查出来,但是

5

这次实训却是上百段的语句,难以检查,似乎也没有经验去怎么检查,那一刹那

感觉到很急,但又不知如何是好。在编写程序中,真的是细节决定成败,因为不

管程序的语句是多是少,但是只要有一条语句或语法不正确,就不能使程序得到

所需要的结果。没能够使自己编写出来的程序等到想要的结果,意味着这是一个

不理想的程序,对于本次编写来说则是失败的。

此次课程设计系统要求的功能都具备了。还算是成功的。

四、实验结果与分析

4.1.系统模块的运行界面

游戏界面:

(1)回答正确

(2)回答错误

英雄榜界面:

6

4.2编码

部分源代码:

void change(char *e,char *a) /*中缀字符串e转后缀字符串a函数*/

{ STACK2 *top=NULL;

int i=0,j=0;

char w;

while(e[i] != '0')

{ if(isdigit(e[i]))

{ do{a[j]=e[i]; /*将数字原样拷贝到数组a中*/

i++; /*e数组的下标加1*/

j++; /*a数组的下标加1*/

}while(e[i]!='.'); /*直到字符为数字结束符"."为止*/

a[j]='.';j++; /*将数字结束符"."拷贝到a数组依然保持结束标记*/

}

if(e[i]=='(') /*如果字符是"("时*/

top=push2(top,e[i]); /*将其压入堆栈*/

if(e[i]==')') /*如果字符是")"时*/

{ top=ptop2(top,&w); /*取出栈顶元素,并从栈顶删除该元素*/

while(w!='(') /*如果字符不是"("时反复循环*/

{ a[j]=w; /*将栈顶元素存入a数组*/

j++; /*下标加1*/

top=ptop2(top,&w) ; /*取出栈顶元素,并从栈顶删除该元素*/

}

}

if(e[i]=='+'||e[i]=='-') /*如果字符是加或减号时*/

{if(!empty2(top)) /*如栈不为空*/

{ w=topx2(top);

while(w!='(') /*当栈顶元素不是"("时反复循环*/

{ a[j]=w;

j++; /*将栈顶元素存入表达式a中,a的下标加1*/

top=pop2(top); /*删除栈顶元素*/

7

if(empty2(top)) /*如果栈为空*/

break; /*跳出循环*/

else

w=topx2(top); /*否则读栈顶元素*/

}

}

top=push2(top,e[i]); /*将当前e的字符元素压入堆栈*/

}

if(e[i]=='*'||e[i]=='/') /*如果字符是乘或除号时*/

{ if(!empty2(top)) /*如栈不为空*/

{ w=topx2(top); /*读栈顶元素存入w*/

while(w=='*'||w=='/')/*当栈顶元素是乘或除时反复循环*/

{ a[j]=w;

j++; /*将栈顶元素存入字符串a中,a的下标加1*/

top=pop2(top); /*删除栈顶元素*/

if(empty2(top)) /*如果栈为空*/

break; /*跳出循环*/

else

w=topx2(top); /*否则读栈顶元素*/

}

}

top=push2(top,e[i]); /*将当前e字符元素压入堆栈*/

}

i++;

}

while(!empty2(top)) /*当不为空时反复循环*/

top=ptop2(top,&a[j++]); /*将栈顶元素存入数组a中*/

a[j]='0'; /*将字符串结束标记写入最后一个数组元素中构成字符串*/

}

int computer(char *s) /* 计算函数*/

{STACK1 *top=NULL;

int i,k,num1,num2,result;

i=0;

while(s[i]!='0') /*当字符串没有结束时作以下处理*/

{ if(isdigit(s[i])) /*判字符是否为数字*/

{ k=0; /*k初值为0*/

do{ k=10*k+s[i]-'0'; /*将字符连接为十进制数字*/

i++; /*i加1*/

}while(s[i]!='.'); /*当字符不为‘.'时重复循环*/

top=push(top,k); /*将生成的数字压入堆栈*/

}

if(s[i]=='+') /*如果为'+'号*/

{top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/

top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/

8

result=num2+num1; /*将num1和num2相加存入result中*/

top=push(top,result); /*将result压入堆栈*/

}

if(s[i]=='-') /*如果为'-'号*/

{top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/

top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/

result=num1-num2; /*将num1减去num2结果存入result中*/

top=push(top,result); /*将result压入堆栈*/

}

if(s[i]=='*') /*如果为'*'号*/

{ top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/

top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/

result=num1*num2; /*将num1与num2相乘结果存入result中*/

top=push(top,result); /*将result压入堆栈*/

}

if(s[i]=='/') /*如果为'/'号*/

{

top=ptop(top,&num2); /*将栈顶元素取出存入num2中*/

top=ptop(top,&num1); /*将栈顶元素取出存入num1中*/

result=num1/num2; /*将num1除num2结果存入result中*/

top=push(top,result); /*将result压入堆栈*/

}

i++; /*i加1*/

}

top=ptop(top,&result); /*最后栈顶元素的值为计算的结果*/

return result; /*返回结果*/

}

STACK1 *initstack1(STACK1 *top) /*初始化*/

{ top=NULL; /*栈顶指针置为空*/

return top; /*返回栈顶指针*/

}

STACK1 *push(STACK1 *top,int x) /*入栈函数*/

{ STACK1 *p; /*临时指针类型为STACK1*/

p=(STACK1 *)malloc(sizeof(STACK1)); /*申请STACK1大小的空间*/

if(p==NULL) /*如果p为空*/

{

printf("memory is overflown!!"); /*显示内存溢出*/

exit(0); /*退出*/

}

p->data=x; /*保存值x到新空间*/

p->link=top; /*新结点的后继为当前栈顶指针*/

top=p; /*新的栈顶指针为新插入的结点*/

return top; /*返回栈顶指针*/

}

9

STACK1 *pop(STACK1 *top) /*出栈*/

{ STACK1 *q; /*定义临时变量*/

q=top; /*保存当前栈顶指针*/

top=top->link; /*栈顶指针后移*/

free(q); /*释放q*/

return top; /*返回栈顶指针*/

}

int topx(STACK1 *top) /*读栈顶元素*/

{ if(top==NULL) /*栈是否为空*/

{printf("Stack is nulln"); /*显示栈为空信息*/

return 0; /*返回整数0*/

}

return top->data; /*返回栈顶元素*/

}

STACK1 *ptop(STACK1 *top,int *x) /*取栈顶元素,并删除栈顶元素*/

{ *x=topx(top); /*读栈顶元素*/

top=pop(top); /*删除栈顶元素*/

return top; /*返回栈顶指针*/

}

int empty(STACK1 *top) /*判栈是否为空*/

{ if(top==NULL) /*如果为空*/

return 1; /*返回1*/

else

return 0; /*否则返回0*/

}

STACK2 *initstack2(STACK2 *top) /*初始化*/

{ top=NULL; /*栈顶指针置为空*/

return top; /*返回栈顶指针*/

}

4.3功能逻辑设计

登录

a)

b)

c)

判断用户名是否存在:判断用户名是否存在。

判断密码有效性(当用户名存在时):判断密码是否与注册的密码一

选择重新输入或退出。

致。

五、实验心得

10


本文标签: 表达式 程序 模块 元素 用户