第一章 课程设计的目的和要求
1.1 课程设计的目的:
用高级程序语言设计出猜数字游戏系统,实现猜数字游戏。通过用高级程序语言制作程序,熟悉用高级程序语言编程的操作和步骤,学习高级程序语言的运用,以及高级程序语言实验报告的书写格式。
1.2 课程设计的要求:
1) 只能使用高级程序语言,源程序要有适当的注释,使程序容易阅读;
2) 至少采用文本菜单界面;
3) 建议使用结构体和链表等数据结构;
4) 学生可自动增加新功能模块;
5) 写出课程设计报告,具体要求见相关说明文档。
第二章 课程设计任务内容
2.1 总体目标:
猜数字游戏软件的总体目标是按照特定游戏规则为用户提供一个方便友好的游戏界面,同时给用户提供排行榜的功能使用户能够按照特定的目标提高自己的成绩,并且提供相应的帮助功能。游戏规则如下:
1)游戏软件随机产生4个数字,但不显示,给用户提供输入提示符,让用户猜4个数字的值和位置顺序。如果数字值和位置均正确,则猜数字成功。
2)玩家有10次猜数字机会,如果在10次之内仍未猜出正确的数字和位置顺序,则提示用户游戏失败。
3)一旦玩家在10次的次数限制内猜出正确的数字和位置顺序,则赢的游戏。
4)当玩家赢得游戏后会与排行榜中的前五名玩家的游戏纪录比较,如果排名能够进入前五名,则更新排行榜,使当前玩家成为入榜选手。
5)计分规则:猜数字所用次数即为分数,所以分数越少证明玩家水平越高,排行榜中也是排列分数最少的前五名选手。
2.2 基本功能:
本游戏软件需要实现以下一些基本功能:
游戏区:玩家可以在游戏区逐次猜数字,系统会给玩家每次猜数字后的提示,包括数值,位置均正确的数字个数和数值正确,但位置不正确的数字个数。
1) 刷新排行榜:当玩家成功完成一轮猜数字游戏后,可以通过和排行榜中相应记录的比较判断玩家是否可以进入排行榜,进入排行榜的资格是游戏成绩在前五名的玩家。
2) 查看排行榜:玩家可以查看当前排行榜中的排名顺序,从而确定自己的游戏目标。排行榜的查看按一定的顺序显示给用户,便于查看。
3) 清除排行榜:玩家可以选择清除排行榜功能,使得排行榜的玩家名字和玩家游戏的记录从系统中清除,只留下系统默认的玩家名(player)和系统默认记录10次。
4) 帮助:玩家通过帮助功能了解游戏规则和排行榜设置规则。
第三章 详细设计说明
3.1程序设计思路:
猜数游戏的目标是按照设定的游戏规则为玩家提供一个简单而愉快的游戏界面,同时给玩家一些特定的功能,便于更好的使用该游戏软件。
在对本程序的实现过程中,将各个功能分别由不同的函数来实现,从而完成了对本程序的模块划分。该游戏共分为4个模块,分别是游戏模块,查询模块,帮助模块,退出模块。围绕这4个模块,大量函数,互相调用,如:StartProgram();SortByName();PrintHelp();等等,还用了大量的文件指针,文件的读写与存储。
本程序在实现游戏的基本功能同时,还提供了查询与帮助的功能,因此玩家可以更好的适应这个游戏,也达到了设计这个游戏的目的了。而设计的重点在于随机数字的产生与游戏的提示,这两个方面的设计决定了程序运行的正确性和质量。
3.2 主程序模块结构示意图:
图3-1 主程序模块图
3.3 函数流程图:
图3-2 总流程图
图3-3 游戏流程图
第四章 软件使用说明
4.1. 软件使用说明:
1) 本程序的运行环境为DOS操作系统,执行文件为:猜数字.exe;
2) 进入演示程序后,即显示主菜单界面,如图所示:
3) 用户输入相应命令的数字;
4) 游戏部分:用户按提示分别输入4各不相同的数字,两个数字间用“空白键”隔开,每行结束符为“回车符”。
4.2. 软件运行界面:
1) 游戏界面
2) 按玩家姓名浏览排行榜
3) 按玩家成绩浏览排行榜
4) 帮助选项
第五章 课程设计心得与体会
课程设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的一个程序的设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。这是我们都希望看到的也正是我们进行课程设计的目的所在。
虽然设计内容繁多,过程繁琐但我的收获却更加丰富。各种组件的运用,各种算法的应用,各种控件的利用我都是随着设计的不断深入而不断熟悉并逐步掌握的。和老师以及同学的沟通交流更使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。
提高是有限的但提高也是全面的,正是这一次设计让我积累了许多实际经验,也必然会让我在未来的工作学习中表现出更高的应变能力和理解力。
顺利如期的完成本次课程设计给了我很大的信心,但是也让多不足的地方,学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处,在以后的生活中也要保持同样的态度,不断的完善自己。
附录一 参考文献
郭翠英主编的《C语言课程设计实例精编》;
张芳妮 吕波 译《C语言编程常见问题解答》;
谭浩强《C程序设计题解与上机指导(第二版)》。
伍俊良.VB课程设计与系统开发案例[M].北京:清华大学出版社,2002
附录二 程序清单
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
#include "string.h"
int w;
struct node
{
char name[20];
int scores;
struct node *next;
};
void display(struct node *head);
struct node *insert(struct node *head,struct node data1);
struct node *del(struct node *head,char *name);
main()
{
struct node *head=NULL;
/* struct node z=("king",10); */
struct node people[5]={ {"booshi",6},
{"bulaie",5},
{"jiabao",1},
{"jintao",3},
{"pujing ",2}
}; //已存档的用户得分情况
int z=1;
int a[4],b[4];
int command,m,n,i,j,f,g;
int k=0,t=0;
char str[8],str1[8]="king";
struct node charu;
struct node moren;
while(1&&z)
{
printf("================== Geuss The Number =========================\n");
printf(" 1. New Game 2. Scan list by score\n");
printf(" 3. Scan list by name 4. Clear List\n");
printf(" 5. Hlep 6. Exit\n");
printf("===============================================================\n");
printf("Please enter the command:");
scanf("%d",&command);
if(command==6) z=0; //
scanf("%d",&command);
switch(command){
case 1 :
{ for(g=0;g<=4;g++)
head=insert(head,people[g]);
printf("the best one is %s,%d\n",head->name,head->scores);
srand((unsigned)time(NULL));
do{ m=0;
for( m=0; m<4;m++)
{a[m]=rand()%10; }
} //随机产生四个数字
while(!(a[0]!=a[1]&&a[0]!=a[2]&&a[0]!=a[3]&&a[1]!=a[2]&&a[1]!=a[3]&&a[2]!=a[3])); //前提条件,四个数字各不相同
for(m=0;m<4;m++)
printf("%d",a[m]);
printf("\n");
for( n=1;n<=10;n++)
{
printf("please input four numbers(0-9):\n");
for( f=0;f<4;f++)
scanf("%d",&b[f]); //按提示输入四个数字
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if((j==i)&&(b[j]==a[i])) k++;
else if(b[j]==a[i]) t++;
}
printf("you have tried %d times\n",n);
printf("%dA%dB\n",k,t); //输出游戏提示信息
if(k!=4)
k=0,t=0;
else
{ printf("good job!\n");
printf("please input your name:");
scanf("%s", str);
strcpy(charu.name,str);
charu.scores=n;
head=insert(head,charu);
display(head);
system("pause");
break;
}} } //游戏模块
case 2:
w=0;
for (g=0;g<=4;g++)
head=insert(head,people[g]);
display(head);
printf("\n");
system("pause");
break; // 按玩家得分查看排行榜
case 3:
w=1;
for (g=0;g<=4;g++)
head=insert(head,people[g]);
display(head);
printf("\n");
system("pause");
break; //按玩家姓名查看排行榜
case 4:
strcpy(moren.name,str1);
moren.scores=10;
printf("the list is empty!\n");
head=insert(head,moren);
display(head);
system("pause");
break; //清除排行榜
case 5:
printf("welcome to the game,you have ten times to guess\n");
printf("the numbers the system given,if you get the\n");
printf("right numbers congradulations to you ,if not,\n");
printf("do not lose your confidence,try again,you make it!\n");
system("pause");
break; //帮助模块
case 6:
printf("game over!\n");
system("pause");
break;
}
} }
void display(struct node *head)
{
int g,a1=0;
struct node *p;
if (head==NULL)
printf("\n not display!");
else
{
p=head;
while (p!=NULL&&a1<5)
{
printf("%s,%d\n",p->name,p->scores);
p=p->next;
a1++;
}
}
}
struct node *del(struct node *head,char *name)
{
struct node *p,*q;
if (head==NULL) printf("empty table,not delete!");
else if (strcmp(head->name,name)==0)
{
q=head;head=head->next;free(q);
}
else
{
p=head;
while((p->next!=NULL)&&(strcmp(p->next->name,name)!=0))
p=p->next;
if (p->next!=NULL)
{
q=p->next;p->next=q->next;free(q);
}
else
printf("no name\n");
}
return (head);
}
struct node *insert(struct node *head,struct node data1)
{
struct node *s,*p;
s=(struct node *)malloc(sizeof(struct node));
strcpy(s->name,data1.name);
s->scores=data1.scores;
s->next=NULL;
switch(w){
case 0:
if (head==NULL)
head=s;
else if(head->scores>s->scores)
{
s->next=head;
head=s;
}
else
{
p=head;
while (p->next!=NULL &&(s->scores>p->next->scores))
{
p=p->next;
}
s->next=p->next;
p->next=s;
}
return(head);
/* break; */
case 1:
if (head==NULL)
head=s;
else if(strcmp(head->name,s->name)>0)
{
s->next=head;
head=s;
}
else
{
p=head;
while (p->next!=NULL&&(strcmp(p->next->name,s->name)<0))
{
p=p->next;
}
s->next=p->next;
p->next=s;
}
return(head);
/* break; */
}
}