a) 从键盘输入n个数,选择升序还是降序输出
b)创新了日历
c) 添加了射箭游戏
d)还加入了好玩的24点游戏
学生签名:
年 月 日
课程设计(论文)评阅意见
等 级 |
项 目 |
||||
课程设计态度评价 |
出勤情况评价 |
设计中创新性评价 |
论文书写规范化评价 |
综合评定等级 |
|
优秀 |
好 |
好 |
6补充 |
好 |
|
良好 |
好 |
好 |
4补充 |
好 |
|
中等 |
好 |
好 |
2补充 |
好 |
|
及格 |
好 |
好 |
无补充 |
好 |
|
不及格 |
不好 |
不好 |
无补充 |
不好 |
|
评阅人 王更生 职称 教 授
2017年 6月 16 日
目 录
一、设计思路
二、功能实现详细设计
三、测试结果分析
四、用户手册
五、设计体会
一、设计思路
首先,(说明一下,一直觉得那些做游戏开发的人非常厉害,于是,我就选了我们课设里面的射箭游戏来做)在做这个程序之前,自己特意去玩了一些射箭游戏qaq,虽然这个射箭游戏玩起来简单,但是要自己来做的话,就很难了。(对于我来说的话)
一开始,我在想那个射箭的箭要怎么来写,肯定是要用字符来做那个箭头的,这就需要很多个for循环来实现了,然后百度上找代码,发现百度上没有qaq(也许是自己比较笨吧,找不到),然后就想起了老师的那个菜单的设计,里面有那个射箭游戏的代码,然后我就拿来了。(说实话,代码看了几天自己才看懂啊,感觉自己真的好笨)。
一开始,觉的这个射箭游戏的内容也太简单了吧,于是,我起初的思路是这样的,(原先的代码运行是只要箭头一碰到那个墙壁的话游戏就结束了)我想那个能不能碰到箭头后可以选择,如果你没选择结束游戏的话,碰到墙壁的话,箭头就转向,再继续走(会转弯的箭诶,哈哈)
我想了一天之后,发现代码还是实现不了(我真的好笨呐),然后,我就换了一种休干的方法,写一个递归函数吧那个游戏弄成一个循环的了(貌似看起来更高级了一点吧),然后你要选择特定的指令这个游戏才会结束,退出程序。于是就写了几个函数
最后还补充了一个24点游戏和一个日历。
1,实现循环和功能选择:编写一个菜单函数menu(),用while循环控制菜单的重复选择,用switch 选择结构对用户的选择,并且实现相应的功能。
2,设计各个选择的功能:对于选择1,利用c++里面的sort函数对一组数字进行排序;对于选择2:添加的24点游戏;对于选择三:设计一个射箭游戏;对于选择4:设计的一个24点游戏;对于选择5:利用while(0)结束程序的运行、。
二、功能实现详细设计
1:switch 选择结构,在主函数里面定义一个变量t,利用while循环,根据t的不同,switch执行指向不同的函数,就是运行菜单中不同的功能。当他等于0 的时候,即while(0),循环不成立,跳出循环,程序就结束了。
2:menu()菜单界面设置函数,主要用于设置菜单的界面
3:排序函数sortq();里面利用了sort()函数对一主数据进行排序,需要使用扥头文件是#include<algorithm>,算法头文件,算法博大精深的,非常有趣。void sortq()
{
int n,p;
int a[10005];
cout<<" 请 输 入 要 排 序 的 数 的 个 数 :"<<endl;
cin>>n;
cout<<" 请 输 入 "<<n<<" 个 数 字 "<<endl;
for(int i=0;i<n;i++)
cin>>a[i];
cout<<" 请 选 择 排 序 方 式 "<<endl<<endl;
sort(a,a+n);
cout<<" 选 1 升 序,选 2 降 序 , 请 选 择 :"<<endl;
cin>>p;
if(p==1)
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
if(p==2)
for(int i=n-1;i>=0;i--)
cout<<a[i]<<" ";
cout<<endl<<endl<<endl;
}//可以选择输出方式,升序和降序。
4设计了chen();cre();exh();这三个函数来实现24点游戏的玩法;
5通过 sjyxhhwo();sfjs();quit();这三个函数来实现射箭游戏的创新;
6通过rili(); 这个函数来实现日历的表达;
这些就是代码细节。
三、测试结果分析
四、用户手册
这是一个比较高级的菜单程序设计,使用起来也非常简单的,还是自己介绍一下吧。
首先你编译运行程序,然后出现了提供菜单界面,界面有五个选项, 选择数字1 2 3 4 5;美国数字有不同的功能,比如选择2就是24点游戏,有提示的,耕者提示选择就行了,这个菜单非常有意思的,相信不会让你们失望哦!
五、设计体会
这次的程序设计是我第一次做的程序设计,虽然程序设计的比较简单,qaq,都是自己太笨了,希望老师能原谅一下哦。对于这次设计,花了好久的时间来想的,先是这个起初的箭头的代码及理解了几天,然后又有了自己的思路,一直很想实现这个思路的,然后就一直想他的代码实现,自己尝试了写过很多次,但都没能成功,元婴石左边那个墙我不会做,最后无奈,只能做出这种循环的了。这次的课设,自己觉得还是做得蛮开心的,因为它让我学会了很多,比如那个清屏函数的,那我以后就可以用了,好开心哦。还逼我看会了这么复杂的代码,好多个for 循环啊。。想想就可怕。
做完这个课程设计,我们的自信一下子提高了,我们也会写程序了;尽管对于有些人这种程序会很简单,可对于我们C语言初学者来说,已经很不容易了。这次体验为以后的学习计算机的我们增强了信心。享受劳动成果的滋味实在美妙啊!
很感谢这次的课程设计,它使我更加地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题;另外,在做任何事倒要有耐心,不要一遇到困难就退缩;在学习和工作中要时刻谨记“团结”二字,它好比通向成功的铺路石,不可或缺。
人生的道路是曲折的,但正是因为曲折人生才光彩夺目,在人生的道路上,总遇到重重困难,但正是因为困难我们才变得更坚强。今后的路还很长,面对困难,让我们用行动去俘虏它吧!
附代码:(比较长)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include <stdlib.h>
using namespace std;
#include<string.h>
#include<math.h>
#include<time.h>
#include <conio.h>
#include <iomanip>
#define Mon 1
#define Tues 2
#define Wed 3
#define Thur 4
#define Fri 5
#define Sat 6
#define Sun 0
#define January_days 31
#define February_days 28
#define March_days 31
#define April_days 30
#define May_days 31
#define June_days 30
#define July_days 31
#define August_days 31
#define September_days 30
#define October_days 31
#define November_days 30
#define December_days 31
#define first1month January_days
#define first2month January_days+February_days
#define first3month January_days+February_days+March_days
#define first4month January_days+February_days+March_days+April_days
#define first5month January_days+February_days+March_days+April_days+May_days
#define first6month January_days+February_days+March_days+April_days+May_days+June_days
#define first7month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days
#define first8month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days
#define first9month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days
#define first10month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days+October_days
#define first11month January_days+February_days+March_days+April_days+May_days+June_days \
+July_days+August_days+September_days+October_days+November_days
int known_weekday = Tues;
int known_year = 1901;
int konwn_month = 1;
int known_day = 1;
char card[] = { 'A','2','3','4','5','6','7','8','9','10','J','Q','K' };
char buf[4];
double nums[4];
char ope[4] = { '+','-','*','/' };
/********************************************************************************/
void menu()
{
cout<<"\n\t\t\t\t\t**********菜单选择**********"<<endl;
cout<<"\n\t\t\t\t\t1.********数字排序**********"<<endl;
cout<<"\n\t\t\t\t\t2.********24点游戏**********"<<endl;
cout<<"\n\t\t\t\t\t3.*******射箭游戏***********"<<endl;
cout<<"\n\t\t\t\t\t4.*********万年历***********"<<endl;
cout<<"\n\t\t\t\t\t5.********退出程序**********"<<endl;
cout<<"\n\t\t\t\t\t****************************"<<endl;
}
/********************************************************************************/
void sortq()
{
int n,p;
int a[10005];
cout<<" 请 输 入 要 排 序 的 数 的 个 数 :"<<endl;
cin>>n;
cout<<" 请 输 入 "<<n<<" 个 数 字 "<<endl;
for(int i=0;i<n;i++)
cin>>a[i];
cout<<" 请 选 择 排 序 方 式 "<<endl<<endl;
sort(a,a+n);
cout<<" 选 1 升 序,选 2 降 序 , 请 选 择 :"<<endl;
cin>>p;
if(p==1)
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
if(p==2)
for(int i=n-1;i>=0;i--)
cout<<a[i]<<" ";
cout<<endl<<endl<<endl;
}
/********************************************************************************************************/
int day_count(int month)
{
switch(month)
{
case 1: return 0;break;
case 2: return first1month;break;
case 3: return first2month;break;
case 4: return first3month;break;
case 5: return first4month;break;
case 6: return first5month;break;
case 7: return first6month;break;
case 8: return first7month;break;
case 9: return first8month;break;
case 10: return first9month;break;
case 11: return first10month;break;
case 12: return first11month;break;
}
}
char * month_name(int month)
{
switch(month)
{
case 1:
return "一月";
break;
case 2:
return "二月";
break;
case 3:
return "三月";
break;
case 4:
return "四月";
break;
case 5:
return "五月";
break;
case 6:
return "六月";
break;
case 7:
return "七月";
break;
case 8:
return "八月";
break;
case 9:
return "九月";
break;
case 10:
return "十月";
break;
case 11:
return "十一月";
break;
case 12:
return "十二月";
break;
default:
break;
}
}
void first_line_print(int month, int year)
{
printf("%8d年 %s \n",year, month_name(month));
}
void week_print()
{
printf("%-3s%-3s%-3s%-3s%-3s%-3s%-3s\n","日", "一", "二", "三", "四", "五", "六");
}
int date_distance_count(int month, int year)
{
int leap_year_count = 0;
int i;
int distance;
if (year > known_year)
{
for (i=known_year; i<year; i++)
{
if(((i%4 == 0) && (i%100 != 0) ) || (i%400 == 0))
{
leap_year_count++;
}
}
if (month > 2)
{
if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0))
{
leap_year_count++;
}
}
}
else
if (year == known_year)
{
if (month > 2)
{
leap_year_count = 1;
}
}
distance = (year - known_year)*365 + leap_year_count + day_count(month);
return distance;
}
int makesure_firstday_weekday(int month, int year)
{
int date_distance = 0;
int weekday;
date_distance = date_distance_count(month, year);
weekday = (known_weekday + date_distance)%7;
return weekday;
}
void print_in_turn(int month, int firstday, int year)
{
int i = 1;
int weekday;
switch(firstday)
{
case Sun:
break;
case Mon:
printf("%-3s","");
break;
case Tues:
printf("%-6s","");
break;
case Wed:
printf("%-9s","");
break;
case Thur:
printf("%-12s","");
break;
case Fri:
printf("%-15s","");
break;
case Sat:
printf("%-18s","");
break;
}
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
for(i=0; i<31; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
case 2:
{
if(((year%4 == 0) && (year%100 != 0) ) || (year%400 == 0)) /*闰年*/
{
for(i=0; i<29; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
else
{
for(i=0; i<28; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
}
case 4:
case 6:
case 9:
case 11:
{
for(i=0; i<30; i++)
{
weekday = (firstday + i)%7;
printf("%-3d",i+1);
if(weekday == Sat)
{
printf("\n");
}
}
break;
}
}
}
void date_print(int month, int year)
{
int firstday;
firstday = makesure_firstday_weekday(month, year);
print_in_turn(month, firstday, year);
printf("\n");
}
void main_month(int month, int year)
{
first_line_print(month, year);
week_print();
date_print(month, year);
printf("\n\n");
}
void main_calendar(int year)
{
int i;
for(i=1; i<=12; i++)
{
main_month(i, year);
}
}
void rili()
{
int year;
printf("请输入年份:year = ");
scanf("%d",&year);
printf("\n");
while(year < 1902)
{
printf("请输入大于1901的年份\n");
printf("请输入年份:year = ");
scanf("%d",&year);
printf("\n");
}
main_calendar(year);
scanf(" ");
//return 0;
}//日历
/******************************************************************************************************************/
void chen()
{
cout<< " ################################################" << endl
<< " # #" << endl
<< " # 欢迎进入24点游戏 #" << endl
<< " # #" << endl
<< " ################################################" << endl<<endl<<endl;
}
void cre()//输入四张牌面
{
//char buf[4];
printf("输入的四张牌面为:");
for (int i = 0; i<4; i++)
{
cin>>buf[i];
//scanf("%c",&buf[i]);
if (buf[i] == 'A') nums[i] = 1;
else if(buf[i] == '2') nums[i] = 2;
else if (buf[i] == '3') nums[i] = 3;
else if (buf[i] == '4') nums[i] = 4;
else if (buf[i] == '5') nums[i] = 5;
else if (buf[i] == '6') nums[i] = 6;
else if (buf[i] == '7') nums[i] = 7;
else if (buf[i] == '8') nums[i] = 8;
else if (buf[i] == '9') nums[i] = 9;
else if (buf[i] == '10') nums[i] = 10;
else if (buf[i] == 'J') nums[i] = 11;
else if (buf[i] == 'Q') nums[i] = 12;
else if (buf[i] == 'K') nums[i] = 13;
}
}
double calcute(double a, double b, char index)
{
if (index == '+') return a + b; //若为+,则返回相应结果
else if (index == '-') return a - b;
else if (index == '*') return a*b;
else if (index == '/')
if (b != 0)
return a / b; //只有当分母不为0时,返回结果
}
void exh()//穷举计算
{
double temp[3], tem[2]; //第一个符号放置后,经过计算后相当于剩下三个数,这个数组用于存储这三个数
double sum; //求得的和
int judge = 0; //判断是否找到一个合理的解
for (int i = 0; i < 4; i++) //第一次放置的符号
{
for (int j = 0; j < 4; j++) //第二次放置的符号
{
for (int k = 0; k < 4; k++) //第三次放置的符号
{
for (int m = 0; m < 3; m++) //首先计算的两个相邻数字,共有3种情况,相当于括号的作用
{
if (nums[m + 1] == 0 && ope[i] == '/') break;
temp[m] = calcute(nums[m], nums[m + 1], ope[i]);
temp[(m + 1) % 3] = nums[(m + 2) % 4];
temp[(m + 2) % 3] = nums[(m + 3) % 4]; //先确定首先计算的两个数字,计算完成相当于剩下三个数,按顺序储存在temp数组中
for (int n = 0; n < 2; n++) //三个数字选出先计算的两个相邻数字,两种情况,相当于第二个括号
{
if (temp[n + 1] == 0 && ope[j] == '/') break;
tem[n] = calcute(temp[n], temp[n + 1], ope[j]);
tem[(n + 1) % 2] = temp[(n + 2) % 3]; //先确定首先计算的两个数字,计算完成相当于剩下两个数,按顺序储存在temp数组中
if (tem[1] == 0 && ope[k] == '/') break;
sum = calcute(tem[0], tem[1], ope[k]); //计算和
if (sum == 24) //若和为24
{
judge = 1; //判断符为1,表示已求得解
if (m == 0 && n == 0)
cout << "((" << nums[0] << ope[i] << nums[1] << ")" << ope[j] << nums[2] << ")" << ope[k] << nums[3] << "=" << sum << endl;
else if (m == 0 && n == 1)
cout << "(" << nums[0] << ope[i] << nums[1] << ")" << ope[k] << "(" << nums[2] << ope[j] << nums[3] << ")=" << sum << endl;
else if (m == 1 && n == 0)
cout << "(" << nums[0] << ope[j] << "(" << nums[1] << ope[i] << nums[2] << ")" << ope[k] << nums[3] << "=" << sum << endl;
else if (m == 1 && n == 1)
cout << nums[0] << ope[k] << "((" << nums[1] << ope[i] << nums[2] << ")" << ope[j] << nums[3] << ")=" << sum << endl;
else if (m == 2 && n == 0)
cout << "(" << nums[0] << ope[j] << nums[1] << ")" << ope[k] << "(" << nums[2] << ope[i] << nums[3] << ")=" << sum << endl;
else if (m == 2 && n == 0)
cout << nums[0] << ope[k] << "(" << nums[1] << ope[j] << "(" << nums[2] << ope[i] << nums[3] << "))=" << sum << endl; //m=0,1,2 n=0,1表示六种括号放置可能,并按照这六种可能输出相应的格式的计算式
}
}
}
}
}
}
if (judge == 0)
cout << "这四张扑克牌无法找到一个合理的解" << endl; //如果没有找到结果,符号位为0
}
//24点游戏
/****************************************************************************************************************************/
void quit()
{
cout<<"\n\n\n\t\t\t谢 谢 欣 赏 此 射 箭 游 戏 !\n\n";
// exit(0);
}
void sjyxhhwo()
{
int i,j,k=0;
char ch=' ';
do
{
if(ch=='q')
{
system("cls");
cout<<"\n\t键入了Q键,游戏中途退出了哦,结束游戏就按q哦,继续玩按其他键喔 "<<endl;
break;
}
switch(ch)
{
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': k+=int(ch-'0');//把字符转化为对应的数字
}
system("cls");
cout<<"请输入1-9(数字表示箭跳格的个数),键入Q键或者箭头触壁退出,键入其它键箭不动"<<endl;
cout<<"\n\n\n";
for(i=0;i<7;i++)
{
for(j=0;j<k;j++)
cout<<" ";
if((i==0)||(i==6))
{
cout<<"$";
for(j=0;j<69-k;j++)
{
if(j==0) cout<<"@";
cout<<" ";}
cout<<"@";
}
else if(i<3)
{
for(j=0;j<i;j++)
cout<<" ";
cout<<"$";
for(j=0;j<-i+32;j++)//33-2=a*1+b;33-3=a*2+b
cout<<" ";
for(j=0;j<2*i-1;j++)//1=a*1+b;3=a*2+b
cout<<"*";
for(j=0;j<-2*i+39-k;j++)//71-34-k=a*1+b;71-36-k=a*2+b
cout<<" ";
cout<<"@";
}
else if(i==3)
{
for(j=0;j<i;j++)
cout<<" ";
for(j=0;j<30;j++)
cout<<"#";
for(j=0;j<2*i-1;j++)
cout<<"*";
if(k>=34)//72-38
{
//cout<<endl;
system("cls");
goto quit;
//sfjs();
}
for(j=0;j<-2*i+39-k;j++)
cout<<" ";
cout<<"@";
}
else
{
for(j=0;j<-i+6;j++)//2=a*4+b;1=a*5+b
cout<<" ";
cout<<"$";
for(j=0;j<i+26;j++)//33-3=a*4+b;33-2=a*5+b
cout<<" ";
for(j=0;j<-2*i+11;j++)//3=a*4+b;1=a*5+b
cout<<"*";
for(j=0;j<2*i+27-k;j++)//71-36-k=a*4+b;71-34-k=a*5+b
cout<<" ";
cout<<"@";
}
cout<<endl;
}
}while(ch=getch());
quit:
// cout<<" \n\n\n\n\t按任意键,返回菜单!"<<endl;
getch();
}
void sfjs()
{
cout<<"你 是 否 还 要 玩 游 戏 呢 ?不 玩 就 按 q 哦 qaq"<<endl;
char ch1;
// cout<<"你 是 否 还 要 玩 游 戏 呢 ?不 玩 就 按 q 哦 qaq"<<endl;
cin>>ch1;
system("cls");
//cout<<"你 是 否 还 要 玩 游 戏 呢 ?不 玩 就 按 q 哦 qaq";
if(ch1=='q'){
cout<<"\n\n\t\t\tQWQ 游戏结束了哦 QWQ"<<endl;
// goto quit;
// quit:;
}
else
{
sjyxhhwo();
sfjs();
}
}
//射箭游戏
/***********************************************************************************************************************************/
int main()
{
int a,t=1;
while(t)
{
menu();
cout<<" 请选择1—5:"<<endl;
cin>>a;
cout<<endl;
system("cls");
switch(a)
{
case 1:
sortq();
break;
case 2:
chen();cre();exh();
break;
case 3:
sjyxhhwo();sfjs();quit();
break;
case 5:
t=0;
break;
case 4:
rili();
break;
}
}
cout<<"程序结束,退出菜单"<<endl;
}