第一篇:24点游戏C语言代码及报告
24点游戏 一,问题分析
二十四点游戏规则:
给出4个数字,所给数字均为有理数,用加、减、乘、除(可加括号)把给出的数算成24.每个数必须用一次且只能用一次,先算出结果者获胜。步骤:比如下面的例子:
例:3、8、8、9,答案1:(9—8)×8×3 答案2: 3×8 ÷(9—8)
答案3:(9—8÷8)×3 利用3×8=24、4×6=24求解
我的主要想法是 首先穷举的可行性问题。我把表达式如下分成三类——
1、无括号的简单表达式。
2、有一个括号的简单表达式。
3、有两个括号的较复
4、杂表达式。
穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。我利用一个嵌套函数实现四个数的排列
二,源程序及注释
//首先穷举的可行性问题。我把表达式如下分成三类—— //
1、无括号的简单表达式。
//
2、有一个括号的简单表达式。
//
3、有两个括号的较复
4、杂表达式。
//穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。我利用一个嵌套函数实现四个数的排列 #include
if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5))putout1(c,p);sum1=cal(a[1],a[2],p[1]);sum2=cal(a[3],a[4],p[3]);sum=cal(sum1,sum2,p[2]);
if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5))putout2(c,p);} } void disorder(float a[],string c[]){ float b[5];string d[5];int i,j,k,l;for(i=1;i<=4;i++)for(j=1;j<=4;j++){ if(j==i)continue;for(k=1;k<=4;k++){ if(k==i||k==j)continue;for(l=1;l<=4;l++){ if(l==i||l==j||l==k)continue;b[1]=a[i];b[2]=a[j];b[3]=a[k];b[4]=a[l];d[1]=c[i];d[2]=c[j];d[3]=c[k];d[4]=c[l];suan(b,d);} } } }
int main(){ cout<<“请输入四个数字”;float a[5];int i,j;string c[5];for(i=1;i<=4;i++){cin>>a[i];if(a[i]==10)c[i]=“10” c[i]=int(a[i])+'0';} disorder(a,c);int v=1,u=0;for(i=1;i<=number;i++){v=1;for(j=1;j
三,运行结果显示
;else
四,调试和运行程序过程中产生的问题及采取的措施:
第二篇:C语言课程设计代码
#include “stdio.h” #include
void main(){ int n=0;struct course *head=NULL;void insert(struct course **head,struct course *cou);void Print(struct course **head,int *n);void Modify(struct course **head,int *n);void Require(struct course **head);void Creat(struct course **head,int *n);void Delete(struct course **head,int *n);void Fun(struct course **head,int *n);
Fun(&head,&n);}
void insert(struct course **head,struct course *cou){ struct course *p0,*p1,*p2;p2=p1=*head;p0=cou;if(*head){
while((p0->semester>p1->semester)&&(p1->next))
{
p2=p1;
p1=p1->next;
}
if(p0->semester
semester)
{
if(*head==p1)*head=p0;
else p2->next=p0;
p0->next=p1;}
else
{
if(p0->semester==p1->semester){ while((p0->cID>p1->cID)&&(p1->next)&&(p0->semester==p1->semester))
{
} if(p0->semester!=p1->semester){
} else {
if(p0->cID<=p1->cID){
if(*head==p1)*head=p0;else p2->next=p0;p2=p1;p1=p1->next;p2->next=p0;p0->next=p1;
p0->next=p1;
}
else
{p1->next=p0;p0->next=NULL;}
}
}
else
{p1->next=p0;p0->next=NULL;}
} } else
{
*head=p0;
p0->next=NULL;} }
void Print(struct course **head,int *n){ struct course *p;p=*head;if(*head){
if(*n==1)printf(“nThis %d record is:n”,*n);
else printf(“nThese %d records are:n”,*n);
printf(“semester cID
name
creditn”);
do
{ printf(“%-10d%-10d%-18s%-12.1f n”,p->semester,p->cID,p->name,p->credit);
p=p->next;
}while(p!=NULL);} else printf(“nList null!n”);}
void Modify(struct course **head,int *n){ struct course *p,*p2;int cID;if(*head){
Print(head,n);while(1){ printf(“nPlease input the cID which you want to modify:”);
scanf(“%d”,&cID);p2=p=*head;while(p->next&&(cID!=p->cID)){
p2=p;
p=p->next;} if(cID==p->cID){
printf(“Please input the new cID(1~60):”);
scanf(“%d”,&p->cID);
while(p->cID<0||p->cID>60)
{
printf(“nError!”);
printf(“nPlease input the new cID(1~60):”);
scanf(“%d”,&p->cID);
}
printf(“Please input the new semester(1~8):”);
scanf(“%d”,&p->semester);while(p->semester<0||p->semester>8)
{
printf(“nError!”);
printf(“nPlease input the new semester(1~8):”);
scanf(“%d”,&p->semester);
}
printf(“Please input the new credit:”);
scanf(“%f”,&p->credit);
printf(“Please input the new name:”);
scanf(“%s”,p->name);
if(p==*head)*head=p->next;
else p2->next=p->next;
insert(head,p);
break;
}
else printf(“%d not been found!n”,cID);
} } else {printf(“nList null!n”);} }
void Require(struct course **head){ struct course *p;float sum=0;int sem,i=0;printf(“nPlease input the semester which is required:”);
scanf(“%d”,&sem);p=*head;while(p){
if(sem==p->semester)
{
i++;if(i==1)printf(“nsemester cID
name
creditn”);printf(“%-10d%-10d%-18s%-12.1f n”,p->semester,p->cID,p->name,p->credit);
sum=sum+p->credit;
}
p=p->next;} printf(“The sum of credit in this term is:%.1fn”,sum);}
void Creat(struct course **head,int *n){ struct course *p1;while(1){
p1=(struct course *)malloc(LEN);
printf(“Please input the cID(1~60):”);
scanf(“%d”,&p1->cID);
while(p1->cID<0||p1->cID>60)
{
printf(“nError!”);
printf(“nPlease input the cID(1~60):”);
scanf(“%d”,&p1->cID);
}
if(p1->cID==0)break;
printf(“Please input the semester(1~8):”);
scanf(“%d”,&p1->semester);
while(p1->semester<0||p1->semester>8)
{
printf(“nError!”);
printf(“nPlease input the semester(1~8):”);scanf(“%d”,&p1->semester);
}
} } printf(“Please input the credit:”);scanf(“%f”,&p1->credit);printf(“Please input the name:”);scanf(“%s”,p1->name);insert(head,p1);*n=*n+1;printf(“nYou can continue until the cID is ”0“!n”);Print(head,n);void Delete(struct course **head,int *n){
struct course *p1,*p2;int cID;Print(head,n);if(*head){ printf(“Please input the cID of the course which you want to delete:”);scanf(“%d”,&cID);p1=*head;
while(cID!=p1->cID&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(cID==p1->cID)
{
if(p1==*head)*head=p1->next;
else p2->next=p1->next;
printf(“Have delete cID:%dn”,cID);
*n=*n-1;
}
else printf(“%d not been found!n”,cID);} }
void Fun(struct course **head,int *n){ char num;
while(1)
{
system(“cls”);
puts(“**************** Main Menu ******************”);
puts(“* 1.Add Records
2.Print Records
*”);
puts(“* 3.Delete Records
4.Modify Records *”);
puts(“* 5.Require Records 6.Exit
*”);
printf(“Please input your choice: ”);
scanf(“%d”,&num);
switch(num)
{
case 1:Creat(head,n);break;
case 2:Print(head,n);break;
case 3:Delete(head,n);break;
case 4:Modify(head,n);break;
case 5:Require(head);break;case 6:exit(0);break;
default: break;
}
printf(“nPress ”Enter“ to continue!”);getchar();getchar();
} }
第三篇:校运动会管理系统报告C语言(含完整代码)
目录 陈
一、程序分析与设计.......................................................................................................................2
二、流程图.......................................................................................................................................4
三、源程序清单...............................................................................................................................4
四、调试过程.................................................................................................................................15
五、程序有待改进的地方.............................................................................................................19
六、本次实习的收获和建议.........................................................................................................19 附录.................................................................................................................错误!未定义书签。
一、程序分析与设计
(标题四号宋体加黑,正文五号宋体,行间距-固定值18,首行缩进2字符)
1.题目描述
初始化输入:N-参赛院系总数,M-男子竞赛项目数,W-女子竞赛项目数;即要求输入一些基础数据,如院系名称,每个院系参赛选手及选手编号。竞赛项目名称与代号。这些数据存储在文本文件中,不需要每次都单条录入。各项目名次取法有如下几种:
取前4名:第1名得分6,第2名得分4,第3名得分2,第4名得分1; 由程序提醒用户填写比赛结果,输入各项目获奖运动员的信息。
所有信息记录完毕后,用户可以查询各个院系或个人的比赛成绩,生成团体总分报表,查看参赛院系信息、获奖运动员、比赛项目信息等。2.需求分析
根据题目要求应提供键盘式菜单实现功能选择,还应提供信息的输入操作,由于在程序中提供查询功能所以应有显示、查找等操作。3.总体设计
根据上面的需求分析,可以将这个系统的设计分为
1、信息输入模块
2、比赛结果录入模块
3、查询模块。具体校际运动会管理系统分为 信息的输入、结果的输入、学校各个项目的得分的查寻、总体报表的生成。4.详细设计(1)主函数
主函数一般设计的比较简洁,只提供输入,处理和输出部分的函数调用。其中功能模块用菜单方式选择。(2)密码登陆函数
首先进入欢迎界面,提示用户输入密码进入系统,密码输入次数限制为三次,三次输入错误则退出系统,登陆成功显示菜单栏(3)菜单函数
提醒用户根据要求选择功能,以及多次功能选取(4)输入函数
进入该功能后提醒用户输入相应信息,即数据结构,数据结构采用结构体的形式,选手结构体成员包括选手的姓名、编号、各项目的成绩排名、选手所在学院等。(5)查找函数
提醒用户输入运动员的姓名或编号,根据姓名或编号逐一比对信息,若条件满足则输出该选手的数据,若不满足则返回‘你要找的运动员未找到’(6)排序函数
根据运动员的百米成绩进行冒泡排序,并输出结果(7)修改函数
提醒用户输入运动员的姓名,根据姓名逐一比对信息,若找到则提供修改选项,对数据进行覆盖(8)得分计算函数
根据用户输入各项成绩排名,进行得分运算 并得出学院排名(9)删除函数 用于输入信息的删除(10)插入函数 用于输入新的信息(11)保存函数
将用户输入的信息保存到文本文件中(12)显示函数 显示用户保存的信息
二、流程图
三、源程序清单
(此部分采用小五号宋体,行间距-固定值14)#include
int size=3;struct student {
void input()//输入原始数据// {
} void find()//查找函数// {
system(“cls”);printf(“t************查找界面************n”);char fs[20];read();printf(“输入你要查找运动员的号码或姓名:”);scanf(“%s”,&fs);for(int i=0;i printf(“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].scor } else if(strcmp(stu[i].name,fs)==0){ printf(“你要找的运动员已找到:n”);break;if(strcmp(stu[i].num,fs)==0){ printf(“你要找的运动员已找到:n”);printf(“该生的号码,姓名,100米成绩,铅球成绩,跳高成绩,跳远成绩,系名:n”);printf(“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].scoreq,stu[i].scoreg,stu[i].scorey,stu[i].ximing);scanf(“%s%s%d%d%d%d%s”,&stu[i].num,&stu[i].name,&stu[i].scorem,&stu[i].scoreq,&stu[i].printf(“输出运动员号码,姓名,100成绩,铅球成绩,跳高成绩,跳远成绩,系名:n”);for(i=0;i } printf(“该生的号码,姓名,100米成绩,铅球成绩,跳高成绩,跳远成绩,系名:n”);printf(“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].scor } } else { } printf(“你要找的运动员未找到:n”);printf(“该运动员缺赛或不存在!”);break;break;eq,stu[i].scoreg,stu[i].scorey,stu[i].ximing);void paixu()//排序函数// { } void xiugai()//修改函数// { printf(“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].scorsystem(“cls”);printf(“t************修改界面************n”);char ch2[20],c;char num[10],name[20];int scorem,scoreq,scoreg,scorey,i;char ximing[20];printf(“原始数据:n”);/*for(int i=0;i system(“cls”);printf(“t************排序界面************n”);printf(“对一百米的成绩排序:n”);for(int i=0;i } printf(“排序后:n”);for(i=0;i } if(stu[i].scorem } temp=stu[i];stu[i]=stu[j];stu[j]=temp; eq,stu[i].scoreg,stu[i].scorey,stu[i].ximing);*/ read();printf(“输入你要修改运动员的姓名:”);scanf(“%s”,ch2);for(i=0;i if(strcmp(stu[i].name,ch2)==0){ printf(“1.修改号码n2.修改姓名n3.修改100米成绩n4.修改铅球成绩n5.修改跳高成绩n6.修改跳远成绩n7.修改系名n”); scanf(“%d”,&c);switch(c){ case 1: { printf(“请输入你修改的运动员号码:”);scanf(“%s”,&num);strcpy(stu[i].num,num);break;} case 2: { printf(“输入你修改的运动员姓名:n”);scanf(“%s”,&name);strcpy(stu[i].name,name);break;} case 3: { printf(“输入你修改的运动员100米成绩:”);scanf(“%d”,&scorem);stu[i].scorem=scorem;break;} case 4: { printf(“输入你修改运动员铅球成绩:”);scanf(“%d”,&scoreq);stu[i].scoreq=scoreq;break;} case 5: { printf(“输入你修改运动员跳高成绩:”);scanf(“%d”,&scoreg);stu[i].scoreq=scoreq;break;} case 6: { } } printf(“输入你修改运动员跳远成绩:”);scanf(“%d”,&scorey);stu[i].scorey=scorey;break;case 7: { } default: } printf(“修改后的运动员数据:n”);for(int i=0;i if(stu[i].scoreq==1)y=3;else if(stu[i].scoreq==2)y=2;else if(stu[i].scoreq==3)y=1;else y=0;printf(“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].scorread();printf(“各系的得分总分排序:n”);for(i=0;i if(stu[i].scorem==1)x=3;else if(stu[i].scorem==2)x=2;else if(stu[i].scorem==3)x=1;else x=0;eq,stu[i].scoreg,stu[i].scorey,stu[i].ximing);*/ system(“cls”);printf(“t************得分界面************n”);int x,y,z,w,o,p,q,i;char ch1[20]=“ruanjian”,ch2[20]=“shumei”,ch3[20]=“guangdian”;printf(“原始数据:n”);/*for(int i=0;i } } if(stu[i].scoreg==1)z=3;else if(stu[i].scoreg==2)z=2;else if(stu[i].scoreg==3)z=1;else z=0;if(stu[i].scorey==1)w=3;else if(stu[i].scorey==2)w=2;else if(stu[i].scorey==3)w=1;else w=0;for(i=0;i } if(strcmp(stu[i].ximing,ch1)==0){ } else if(strcmp(stu[i].ximing,ch2)==0){ } else if(strcmp(stu[i].ximing,ch3)==0){ } q=x+y+z+w;printf(“光电系总得分:%dn”,q); p=x+y+z+w;printf(“数媒系总得分:%dn”,p);o=x+y+z+w;printf(“软件系总得分:%dn”,o);void shancchu()//删除函数// { printf(“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].scorread();printf(“输入你要删除的运动员的姓名:n”);scanf(“%s”,&ch1);for(i=0;i if(strcmp(stu[i].name,ch1)==0){ for(int j=i;j } { } } stu[j]=stu[j+1];printf(“删除后的运动员数据:n”);for(i=0;i void charu()//插入函数 system(“cls”);int a;printf(“t************插入界面************n”);printf(“请输入要插入的运动员个数:”);scanf(“%d”,&a);for(int j=0;j } printf(“输入要插入的运动员数据:n”);printf(“号码:”);scanf(“%s”,&stu[size].num);printf(“姓名:”);scanf(“%s”,&stu[size].name);printf(“100米成绩:”);scanf(“%d”,&stu[size].scorem);printf(“铅球成绩:”);scanf(“%d”,&stu[size].scoreq);printf(“跳高成绩:”);scanf(“%d”,&stu[size].scoreg);printf(“跳远成绩:”);scanf(“%d”,&stu[size].scorey);printf(“系名:”);scanf(“%s”,&stu[size].ximing);for(int i=0;i for(int j=i+1;j if(stu[i].scorem } temp=stu[i];stu[i]=stu[j];stu[j]=temp;size++;printf(“插入后运动员数据:n”);for(int i=0;i } void save(){ } void read(){ } printf(“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].scor} fclose(fp); //关闭文件 eq,stu[i].scoreg,stu[i].scorey,stu[i].ximing);fscanf(fp,“%st%st%dt%dt%dt%dt%sn”,&stu[i].num,&stu[i].name,&stu[i].scorem,&stu[i].scoreq,&stu[i].scoreg,&stu[i].scorey,&stu[i].ximing);for(int i=0;i if((fp=fopen(“e:xiao.txt”,“r”))==NULL){ } fscanf(fp,“运动员号码,姓名,100成绩,铅球成绩,跳高成绩,跳远成绩,系名:n”);printf(“打不开文件Cannot open the filen”);return; //若打不开则返回菜单 //为输出打开一个二进制文件,为只fprintf(fp,“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].fclose(fp); //关闭文件 scoreq,stu[i].scoreg,stu[i].scorey,stu[i].ximing);printf(“保存成功....Save the file successfully!n”);FILE *fp; //定义指向文件的指针 //char outfile[20];//printf(“输出文件例如:c:score Enter outfile name,for example c:scoren”);//scanf(“%s”,outfile);if((fp=fopen(“e:xiao.txt”,“w”))==NULL){ } printf(“n保存中...Saving the file......n”);//fprintf(fp,“运动员号码,姓名,100成绩,铅球成绩,跳高成绩,跳远成绩,系名:n”);for(int i=0;i //若打不开则返回菜单 //为输出打开一个二进制文件,为只 //保存数据到文件函数 printf(“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].scorsave();eq,stu[i].scoreg,stu[i].scorey,stu[i].ximing);写方式 写方式 int login(char password[]){ //密码校对函数*********** static char key[10]=“12345”;if(strcmp(password,key)==0)return 1;else return 0;} void Logon(){ } if(s==0){ count++;while(count!=3){ printf(“请再次输入密码:n”);scanf(“%s”,password);s=login(password);if(s==1)char a;printf(“n”);printf(“****************欢迎进入校运动会管理界面****************n”);printf(“********************************************************n”);printf(“********************登陆请按回车键**********************n”);printf(“********************************************************n”);printf(“n”);scanf(“%c”,&a);if(a=='n'){ FILE *fp;char password[10];int count=0,s;printf(“您有三次输入机会!nn”);printf(“请输入密码:n”);scanf(“%s”,password);s=login(password);if(s==1){ fp=fopen(“C:UsersAdministratorDesktop实训password.txt”,“w”);fprintf(fp,“%s”,password);fclose(fp);system(“CLS”);printf(“密码正确!n”);printf(“********************************************************n”);printf(“***************************欢迎进入*********************n”);printf(“********************************************************nnn”); //比较输入字符和系统设定的密码是否相同 } } } } { fp=fopen(“C:UsersAdministratorDesktop实训fprintf(fp,”%s“,password);fclose(fp);system(”CLS“);printf(”密码正确!n“);password.txt”,“w”);printf(“********************************************************n”);printf(“***************************欢迎进入*********************n”);printf(“********************************************************n”);} if(s==0)count++;return;if(count==3)printf(“你已经错误输入3次,系统退出!n”);exit(0);else exit(1);void menu(){ int ch1;char ch2;struct tm *pt;/*定义时间结构体*/ time_t t;t=time(NULL);pt=localtime(&t);/*读取系统日期并把它放到结构体中*/ do{ { printf(“tt当前系统日期:%d-%d-%dn”,pt->tm_year+1900,pt->tm_mon+1,pt->tm_mday);printf(“======================菜单=====================n”);printf(“ 1.输入 printf(” 3.排序 printf(“ 5.得分 printf(” 7.插入 printf(“ 9.显示 2.查找 4.修改 6.删除 8.保存 n”);n“);n”);n“);/*显示当前系统日期*/ 0.退出n”);printf(“=n”);printf(“请选择功能<1-8>:[ ]bb”);//getchar();scanf(“%d”,&ch1);switch(ch1) } } case 1: input();break;find();break;paixu();break;xiugai();break;defen();break;shancchu();break;charu();break;save();break;read();break;exit(0);printf(“未进行任何操作!”);case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 0: default: printf(“n”);printf(“想要继续操作请按yn”);getchar();scanf(“%2c”,&ch2); //条件判断 }while(ch2=='y'); void main(){ } system(“color 3f”);//Logon();menu(); 四、调试过程 在程序运行的过程中,出现了很多的错误。有很复杂的问题,也不乏许多低级的错误。在写入文件的时候,首先我用的是fwrite,而在读入文件的时候用的是fread,后来才发现这两个语句都只是对二进制的文件进行操作,实际上我们要用到的fscanf、fprintf这两个语句。修改完的代码 FILE *fp;//定义指向文件的指针 if((fp=fopen(“e:xiao.txt”,“r”))==NULL) //为输出打开一个二进制文件,为只写方式 fscanf(fp,“%st%st%dt%dt%dt%dt%sn”,&stu[i].num,&stu[i].name,&stu[i].scorem,for(int i=0;i } fscanf(fp,“运动员号码,姓名,100成绩,铅球成绩,跳高成绩,跳远成绩,系名:n”);printf(“打不开文件Cannot open the filen”);return; //若打不开则返回菜单 &stu[i].scoreq,&stu[i].scoreg,&stu[i].scorey,&stu[i].ximing);printf(“%st%st%dt%dt%dt%dt%sn”,stu[i].num,stu[i].name,stu[i].scorem,stu[i].scoreq,stu[i].scoreg,stu[i].scorey,stu[i].ximing);} fclose(fp); //关闭文件 做菜单功能多次选择时,令用户输入字符进行选择,然而程序总是退出,后来才知道‘n’也被算入用户输入的字符内,要在字符输入后添加getchar()才能避免菜单失效 做显示函数,屏幕显示异常,总是反复显示相同数据和乱码,原来是结构体初始化,当中的数组已经存储了数据,在显示时与函数同时输出了,要再定义一个相同的数组应用它输出。(1)登陆 (2)菜单 (3)输入 (4)查找 (5)排序 (6)修改 (7)得分 (8)删除 (9)插入 (10)保存 (11)退出 五、程序有待改进的地方 六、本次实习的收获和建议 通过这次课程设计我得出一个结论:知识必须通过应用才能实现其价值!有些东西以为学会了,但真正到用的时候才发现是两回事,所以我认为只有到真正会用的时候才是真的学会了。同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说指针。编程时要养成良好的风格,注意相同内容的缩进和对齐。这样做,可以使程序代码出错的情况下,可以快速并且便捷的查找到错误的行,利于很好的修改。 在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。虽然这个设计做的也不太好,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我终身受益。 在本次实践中,给我印象最为深刻的是在文件删除程序的编译过程中,这个程序将是关键。老天不会让我太过顺利,他在这最后的时刻设置的障碍,但是我鼓起勇气,到处查找资料,终于让我实现了这个函数,谢谢给我指点迷津的朋友和同学。对我而言,知识上的收获重要,精神上的丰收是可喜的。挫折是一份财富,经历是一份拥有。这次实际操作必将成为我们人生旅途上一个非常美好的回忆! 《c语言课程设计》课程设计报告 课程主题: 聪明的小蛇 Smart Snake 需求分析 【阐述课程设计应该完成的功能】 使用键盘的上下左右键来控制蛇的运动方向,ESC键退出,显示现在得分,三个难度选择(每一关地图不同,小蛇移动速度不同)系统分析和设计 2.1 数据结构的设计和选择的理由 本游戏中涉及的主要数据结构是如何表示运动的蛇、食物状态等问题。 2.1.1 蛇是由一连串举行组成,用结构体数组表示蛇每一节的横纵坐标。用数组实现 struct Snake { int x[N];int y[N];int node;/*蛇的节数*/ int direction;/*蛇移动方向*/ int life;/* 蛇的生命,0活着,1死亡*/ }snake;//这是蛇的结构体 小蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点: 1.蛇头由键盘控制,在无操作的时候蛇需要以原来的方向继续前进 2.运动时,蛇身后面一节移动到前面一节的位置。2.1.2 关于食物有两个属性: 1.坐标位置 2.状态:存在,或被吃。 (由于三者的存在状态基本相同所以我们用一个结构体表示)struct Food { int x;/*食物的横坐标*/ int y;/*食物的纵坐标*/ int yes;/*判断是否要出现食物的变量*/ }food;/*食物的结构体*/ 2.2 系统模块划分和模块结构 开始动画 游戏开始界面 游戏过程界面 游戏结束界面 2.3 流程图 2.4 数据类型、全局变量和函数说明 2.4.1数据类型&2.4.2全局变量 #include “stdafx.h” #include “graphics.h” #include “stdlib.h” #include “conio.h” #include “time.h” #include “stdio.h” #include “snake.h” #pragma comment(lib,“Winmm.lib”)//播放音乐 #ifndef SNAKE_H #define SNAKE_H #define LEFT 'a' #define RIGHT 'd' #define DOWN 's' #define UP 'w' #define ESC 27 #define N 200 #define ENTER 13 #define JACK 'j' #define KING 'k' #define LONG 'l' int score = 0;int Func = 0;int gamespeed = 200;//蛇运行速度 char mx1,mx2;int level=1;char string_score[100];char str[100]; 2.5 涉及的函数 static void Init(void);/*图形驱动*/ static void Close(void);/*图形结束*/ static void Game_interface(void);/*游戏界面*/ static void GameOver(void);/*结束游戏*/ static void GamePlay(void);/*游戏过程*/ static void PrScore(void);/*输出成绩*/ static void textdown(void);//选关焦点乡下 static void textup(void);//选关焦点向上 static void choose(void);//选关界面 static void difficult(void);//难度选择 程序测试和运行结果 反复调试 效果良好,能正常运行 课程报告小结 【遇到的问题及解决方法分析等】 4.1小蛇和指示标走过有显示 解决方法:每次都用一块与背景色相同的的矩形覆盖。 4.2食物出现在边界上 解决方法: if(level==1){ while(food.x%10!= 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } if(level==2){while((food.x%10!= 0)||((food.x>=145)&&(food.x<=510))&&((food.y>=250)&&(food.y<=270)))/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } /这段代码保证了食物不被产生在障碍上 附录 程序源代码: // mff.cpp : Defines the entry point for the console application.// #include “stdafx.h” #include “graphics.h” #include “stdlib.h” #include “conio.h” #include “time.h” #include “stdio.h” #include “snake.h” #pragma comment(lib,“Winmm.lib”)//播放音乐 int score = 0;int Func = 0;int gamespeed = 200;//蛇运行速度 char mx1,mx2;int level=1;char string_score[100];char str[100]; static void Init(void);/*图形驱动*/ static void Close(void);/*图形结束*/ static void Game_interface(void);/*游戏界面*/ static void GameOver(void);/*结束游戏*/ static void GamePlay(void);/*游戏过程*/ static void PrScore(void);/*输出成绩*/ static void textdown(void);static void textup(void);static void choose(void);static void difficult(void);int _tmain(int argc, _TCHAR* argv[]){ } /*图形驱动*/ static void Init(void){ int gd=9,gm=2; initgraph(&gd,&gm,“ ”);cleardevice();} /* 开始画面,左上角坐标为(,),右下角坐标为(,)的围墙*/ static void Game_interface(void){ int i;int j;int k; setcolor(YELLOW);/*setbkcolor(LIGHTGREEN);*/ setlinestyle(PS_SOLID,0,1);/*设置线型*/ for(i=50;i<=600;i+=10)/*画边框*/ { rectangle(i,40,i+10,49);/*上边框*/ rectangle(i,451,i+10,460);/*下边框*/ } if(level==2){ for(j=150;j<=500;j+=10) } if(level==3)///*画Level3下两条横向隔断*/ rectangle(j,245,j+10,254);/*画Level2下横向隔断*/ mciSendString(_T(“open 2.mp3 alias mymusic”), NULL, 0, NULL);mciSendString(_T(“play mymusic repeat”), NULL, 0, NULL);choose();return 0;system(“pause”);{ for(j=150;j<=500;j+=10)rectangle(j,180,j+10,189);for(k=150;k<=500;k+=10)rectangle(k,350,k+10,359);} for(i=40;i<=450;i+=10){ rectangle(50,i,59,i+10);/*左边框*/ rectangle(601,i,610,i+10);/*右边框*/ } } /* 游戏主函数*/ static void GamePlay(void){ int i;srand(time(NULL));/*随机数发生器*/ food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/ snake.life = 0;/*活着*/ snake.direction = 1;/*方向往右*/ snake.x[0] = 100;snake.y[0] = 100;snake.x[1] = 110;snake.y[1] = 100;snake.node = 2;/*节数*/ PrScore();/*输出得分*/ while(1)/*可以重复玩游戏,压ESC键结束*/ { while(!kbhit())/*在没有按键的情况下,蛇自己移动*/ { if(food.yes == 1)/*需要出现新食物*/ { food.x = rand()%400 + 60;food.y = rand()%350 + 60;if(level==1){ while(food.x%10!= 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } if(level==2){while((food.x%10!= 0)||((food.x>=145)&&(food.x<=510))&&((food.y>=250)&&(food.y<=270)))/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } if(level==3){while((food.x%10!= 0)||(((food.x < 530)&&(food.x > 135))&&((food.y < 185)&&(food.y > 185)))||(((food.x < 530)&&(food.x > 135))&&((food.y < 379)&&(food.y > 350))))/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food.x++;while(food.y%10!= 0)food.y++;food.yes = 0;/*画面上有食物了*/ } } if(food.yes == 0)/*画面上有食物了就要显示*/ { setcolor(GREEN);rectangle(food.x,food.y,food.x + 10,food.y-10);} for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i] = snake.x[i-1];snake.y[i] = snake.y[i-1];} /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction){ case 1: snake.x[0] += 10;break;case 2: snake.x[0]-= 10;break;case 3: snake.y[0]-= 10;break;case 4: snake.y[0] += 10;break;} /* 从蛇的第四节开始判断是否撞到自己*/ for(i=3;i if(level==3){ if((((snake.x[0] < 520)&&(snake.x[0] > 145))&&((snake.y[0] < 195)&&(snake.y[0] > 175)))||(((snake.x[0] < 510)&&(snake.x[0] > 140))&&((snake.y[0] < 369)&&(snake.y[0] > 330))))/*蛇是否撞到level3中两条横向隔断*/ { GameOver();/*本次游戏结束*/ snake.life = 1;/*蛇死*/ } } if(snake.life == 1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break;if((snake.x[0] == food.x)&&(snake.y[0] == food.y))/*吃到食物以后*/ { setcolor(BLACK);/*把画面上的食物东西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10);snake.x[snake.node] =-20;snake.y[snake.node] =-20; /* 新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food.yes = 1;/*画面上需要出现新的食物*/ score += 10;PrScore();/*输出新得分*/ } setcolor(RED);/*画出蛇*/ for(i=0;i if(snake.life == 1)/*如果蛇死就跳出循环*/ break; key=getch();/*接收按键*/ if(key == ESC)break;/*按ESC键退出*/ switch(key){ case UP: if(snake.direction!= 4)/*判断是否往相反的方向移动*/ snake.direction = 3;break;case RIGHT: if(snake.direction!= 2)snake.direction = 1;break;case LEFT: if(snake.direction!= 1)snake.direction = 2;break;case DOWN: if(snake.direction!= 3)snake.direction = 4;break;} }/*endwhile(1)*/ } /*游戏结束*/ static void GameOver(void){ cleardevice();PrScore();setcolor(RED);setfont(50, 0, _T(“楷体”));outtextxy(200, 200, _T(“GAME OVER”));getch();} /*输出成绩*/ static void PrScore(void){ setfillstyle(YELLOW);// bar(235, 560, 300, 580);char s[5] = {' '};setcolor(RED);setfont(50, 0, _T(“楷体”));outtextxy(200, 600, _T(“您的得分”));sprintf(s, “%d”, score); } outtextxy(450, 600, s[0]);outtextxy(480, 600, s[1]);outtextxy(510, 600, s[2]);outtextxy(540, 600, s[3]);outtextxy(570, 600,s[4]);static void Close(void){ closegraph();mciSendString(_T(“stop mymusic”), NULL, 0, NULL);mciSendString(_T(“close mymusic”), NULL, 0, NULL);exit(0);} void textdown(){ } } break; break;case 2: setcolor(BLACK);circle(250,320,10); setcolor(WHITE);circle(250,230,10);Func=0;switch(Func){ case 0: setcolor(BLACK); setcolor(WHITE);circle(250,275,10);Func++;break;circle(250,230,10);case 1: setcolor(BLACK);circle(250,275,10); setcolor(WHITE);circle(250,320,10);Func++; //功能按钮焦点向上 void textup(){ } static void choose(void){ Init();initgraph(700, 700);setcolor(GREEN); switch(Func){ case 0: } setcolor(BLACK);circle(250,230,10);setcolor(WHITE);circle(250,320,10);Func=2;break;circle(250,275,10); setcolor(WHITE);circle(250,230,10);Func=0;break;case 1: setcolor(BLACK);case 2: setcolor(BLACK);circle(250,320,10); setcolor(WHITE);circle(250,275,10);Func=1; break; setfont(30, 0, _T(“楷体”));outtextxy(220, 150, _T(“Smart Snake”)); setcolor(WHITE);setfont(25, 0, _T(“隶书”));circle(250,230,10);outtextxy(290, 220, _T(“开始游戏”));setfont(25, 0, _T(“隶书”));outtextxy(290, 310, _T(“退出游戏”));outtextxy(150, 400, _T(“当前难度:”));outtextxy(150, 450, _T(“简单”));setcolor(YELLOW);setfont(20, 0, _T(“楷体”));outtextxy(270, 525, _T(“Presented By:漂浮de星儿”));outtextxy(270, 550, _T(“Date:-03-08”));outtextxy(270, 575, _T(“Verson:.1.3(The Final Edition)”));setfont(25, 0, _T(“隶书”));outtextxy(290, 265, _T(“难度选择(默认为简单)”));{ while(true)if(mx1=getch()){ } // 延时(降低CPU 占用率)switch(mx1){ case ENTER: switch(Func){ case 0: cleardevice(); Game_interface();GamePlay(); Close();break;case 1:difficult();break;case 2:Close();break;};break;case DOWN:textdown();break;case UP:textup();break; } } } Sleep(20); void difficult()//难度选择函数 { outtextxy(150, 490, _T(“j-简单,k-中等,l-困难”));if(mx2=getch()){ case KING: //按键K gamespeed=150;switch(level)switch(mx2)gamespeed=200;switch(level){case 1:setcolor(BLACK); setcolor(WHITE);outtextxy(150, 450, _T(“简单”));level=1;break;{case JACK: //按键J outtextxy(150, 450, _T(“简单”));case 2: setcolor(BLACK);outtextxy(150, 450, _T(“中等”)); setcolor(WHITE);outtextxy(150, 450, _T(“简单”));level=1;break;case 3: setcolor(BLACK);outtextxy(150, 450, _T(“困难”)); setcolor(WHITE);outtextxy(150, 450, _T(“简单”));level=1;break;}break;{case 1:setcolor(WHITE);setcolor(WHITE);outtextxy(150, 450, _T(“中等”));outtextxy(150, 450, _T(“简单”)); } } level=2;break;case 2: setcolor(BLACK);outtextxy(150, 450, _T(“中等”)); setcolor(WHITE);outtextxy(150, 450, _T(“中等”));level=2;break;case 3: setcolor(BLACK);outtextxy(150, 450, _T(“困难”)); setcolor(WHITE);outtextxy(150, 450, _T(“中等”));level=2;break;}break;gamespeed=80;switch(level){case 1:setcolor(BLACK); } setcolor(WHITE);outtextxy(150, 450, _T(“困难”));level=3;break;case LONG: //按键L outtextxy(150, 450, _T(“简单”));case 2: setcolor(BLACK);outtextxy(150, 450, _T(“中等”)); setcolor(WHITE);outtextxy(150, 450, _T(“困难”));level=3;break;case 3: setcolor(BLACK);outtextxy(150, 450, _T(“困难”)); setcolor(WHITE);outtextxy(150, 450, _T(“困难”));level=3;break;}break;Snake.h: #ifndef SNAKE_H #define SNAKE_H #define LEFT 'a' #define RIGHT 'd' #define DOWN 's' #define UP 'w' #define ESC 27 #define N 200 #define ENTER 13 #define JACK 'j' #define KING 'k' #define LONG 'l' /*蛇的最大长度*/ char key;struct Food { int x;int y;int yes;}food; struct Snake { int x[N];int y[N];int node;int direction;int life;}snake;#endif /*控制按键*/ /*食物的横坐标*/ /*食物的纵坐标*/ /*判断是否要出现食物的变量*/ /*食物的结构体*/ /*蛇的节数*/ /*蛇移动方向*/ /* 蛇的生命,0活着,1死亡*/ C语言迷宫问题代码如下: #include #include #define LEN sizeof(SEAT) #define MAXSIZE 100 #define LENGTH 30 typedef struct { int x;//横坐标 int y;//纵坐标 int di;//表示方向,0-3分别表示东南西北。 }SEAT; struct StackList { SEAT stack[MAXSIZE]; int top; }*Stack; int EmptyStack(StackList*Stack)//判断是否为空栈 { if(Stack->top==0) return 0; else return 1; } int Move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//分别表示向东、西、南、北需要加上的坐标 int Mase[LENGTH][LENGTH]={0};//初始化为0 int length,width; void InitMase()//在迷宫的外围添加一层“墙壁”(赋值为1),使得迷宫的任意一点都有四个方向 { int i,j; for(i=0;i { for(j=0;j Mase[i][j]=1; } for(i=0;i { for(j=0;j Mase[j][i]=1; } } void InitStack(StackList*Stack)//初始化 { Stack->top=0; return; } int PushStack(StackList*Stack,SEAT CurSeat)//进栈 { if(Stack->top==MAXSIZE-1) return false; else { Stack->stack[Stack->top].x=CurSeat.x; Stack->stack[Stack->top].y=CurSeat.y; Stack->stack[Stack->top].di=CurSeat.di; Stack->top++; return true; } } int PopStack(StackList*Stack)//出栈 { if(Stack->top==0) return false; else { Stack->top--; return true; } } int Pass(SEAT p)//判断当前是否可行 { if(Mase[p.x][p.y]==0) { return true; } else return false; } SEAT NextSeat(SEAT CurSeat)//查找下一个点,并返回 { SEAT temp; temp.x=CurSeat.x+Move[CurSeat.di][0]; temp.y=CurSeat.y+Move[CurSeat.di][1]; return temp; } void Mark(SEAT p)//标记已经走过的点,避免重复 { Mase[p.x][p.y]=-1; } int PathWay(SEAT start,SEAT end)//找路线 { Stack=(struct StackList*)malloc(sizeof(struct StackList)); InitStack(Stack); SEAT CurSeat; CurSeat.x=start.x+1;//由于多加了一层墙壁,因此坐标的值要加1 CurSeat.y=start.y+1;// CurSeat.di=start.di;// do { if(Pass(CurSeat)) { PushStack(Stack,CurSeat); Mark(CurSeat); if(CurSeat.x==end.x+1&&CurSeat.y==end.y+1)//如果找到出口,返回{ return true; } else { int find=0; while(CurSeat.di<3&&find==0)//找下一个结点的方向 { CurSeat.di++; SEAT temp; temp=NextSeat(CurSeat); if(Mase[temp.x][temp.y]==0) { temp.di=-1; CurSeat=temp; find =1; } } } } else { if(EmptyStack(Stack))//当前的点不能走,出栈 PopStack(Stack); if(EmptyStack(Stack))//当前的点变为前一个点 { CurSeat=Stack->stack[Stack->top-1]; } while(CurSeat.di==3&&EmptyStack(Stack))////当前的点找不到下一个点,出栈 { PopStack(Stack); CurSeat=Stack->stack[Stack->top-1];//当前的点变为前一个点} if(EmptyStack(Stack)) { int find=0; while(CurSeat.di<3&&find==0)////找下一个结点的方向 { CurSeat.di++; SEAT temp; temp=NextSeat(CurSeat); if(Mase[temp.x][temp.y]==0) { temp.di=-1; CurSeat=temp; find =1; } } } } }while(EmptyStack(Stack)); return false; } void PrintStack(StackList*Stack)//输出路线 { if(Stack->top==0) printf(“There is no route can be out of the mazen”); else { int i; for(i=0;i { if(i!=0) printf(“->(%d,%d)”,Stack->stack[i].x-1,Stack->stack[i].y-1); else printf(“(%d,%d)”,Stack->stack[i].x-1,Stack->stack[i].y-1); } } } void PrintMase()//输出迷宫 { int i,j; for(i=1;i { for(j=1;j { if(j!=1) printf(“ %d”,Mase[i][j]); else printf(“%d”,Mase[i][j]); } printf(“n”); } } int main() { int n; SEAT start,end; printf(“Please enter the maze of the length and width:n”); scanf(“%d%d”,&length,&width); printf(“Please enter the number of the maze wall unit(0 printf(“Please enter the labyrinth of the coordinates of the wall unit(0<=row,column):n”);while(--n>=0) { int x,y; scanf(“%d%d”,&x,&y); Mase[x+1][y+1]=1; } InitMase(); PrintMase(); printf(“Please enter the coordinates entrance(0<=x<%d,0<=y<%d):n”,length,width); scanf(“%d%d”,&start.x,&start.y); start.di=-1; printf(“Please enter the coordinates exports(0<=x<%d,0<=y<%d):n”,length,width); scanf(“%d%d”,&end.x,&end.y); end.di=0; if(PathWay(start,end)) PrintStack(Stack); else printf(“There is no route can be out of the mazen”);return 0; } of the of the maze maze第四篇:C语言课设 贪食蛇 含完整代码 课设报告
第五篇:c语言迷宫问题代码实现