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;
}
