c++課程設計之菜單選擇\\


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;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM