1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      c++制作貪吃蛇的案例代碼-創(chuàng)新互聯(lián)

      c++制作貪吃蛇的案例代碼?這個問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

      創(chuàng)新互聯(lián)-云計算及IDC服務(wù)提供商,涵蓋公有云、IDC機房租用、西部信息機房、等保安全、私有云建設(shè)等企業(yè)級互聯(lián)網(wǎng)基礎(chǔ)服務(wù),聯(lián)系電話:18980820575

      c++貪吃蛇代碼是【snake_position position[(N-2)*(N-2)+1],void snake_position::initialize(int &j),{x = 1;y = j;}char s[N][N]】。

      c++制作貪吃蛇的案例代碼

      分析思路

      下面就來講講貪吃蛇的整個設(shè)計思路:

      一、

      貪吃蛇的特點是隨機產(chǎn)生食物后,然后通過上下左右地方向鍵來控制貪吃蛇的移動,

      當(dāng)碰到食物時,便把它吃掉,從而身體長度增加一個,這里便采用“#”作為蛇頭,”*”作為蛇身和食物。

      因此我便想到,產(chǎn)生的食物,是如何達到隨機的目的呢?通過查閱資料得知,在time.h頭文件中,定義了通過rand()函數(shù)來產(chǎn)生隨機數(shù)。下面是相關(guān)知識:

      概述

      rand()函數(shù)是產(chǎn)生隨機數(shù)的一個隨機函數(shù)。C語言里還有srand()函數(shù)等。

      詳述

      (1)使用該函數(shù)首先應(yīng)在開頭包含頭文件stdlib.h

      #include(C++建議使用#include,下同)

      (2)在標(biāo)準(zhǔn)的C庫中函數(shù)rand()可以生成0~RAND_MAX之間的一個隨機數(shù),其中RAND_MAX是stdlib.h 中定義的一個整數(shù),它與系統(tǒng)有關(guān)。

      (3)rand()函數(shù)沒有輸入?yún)?shù),直接通過表達式rand()來引用;例如可以用下面的語句來打印兩個隨機數(shù):

      printf("Random numbers are: %i %i\n",rand(),rand());

      (4)因為rand()函數(shù)是按指定的順序來產(chǎn)生整數(shù),因此每次執(zhí)行上面的語句都打印相同的兩個值,所以說C語言的隨機并不是真正意義上的隨機,有時候也叫偽隨機數(shù)。

      (5)為了使程序在每次執(zhí)行時都能生成一個新序列的隨機值,我們通常通過為隨機數(shù)生成器提供一粒新的隨機種子。函數(shù)srand()(來自stdlib.h)可以為隨機數(shù)生成器播散種子。只要種子不同rand()函數(shù)就會產(chǎn)生不同的隨機數(shù)序列。srand()稱為隨機數(shù)生成器的初始化器。

      由于一開始沒有使用srand()函數(shù),多次運行后發(fā)現(xiàn),每次打開運行后產(chǎn)生的食物位置都是一致的,并沒有真正達到隨機的目的。因此使用srand()函數(shù),又通過time()函數(shù)來每次調(diào)用一個系統(tǒng)時間來作為srand()的種子。由于每次調(diào)用的系統(tǒng)時間并不相同,所以每次的種子也就不相同,從而使得rand()函數(shù)達到了隨機數(shù)的目的。下面是time()函數(shù)相關(guān)知識:

      time() 函數(shù)返回自 Unix 紀(jì)元(January 1 1970 00:00:00 GMT)起的當(dāng)前時間的秒數(shù)。

      主要用來獲取當(dāng)前的系統(tǒng)時間,返回的結(jié)果是一個time_t類型,其值表示從UTC(Coordinated Universal Time)時間1970年1月1日00:00:00(稱為UNIX系統(tǒng)的Epoch時間)到當(dāng)前時刻的秒數(shù)。然后調(diào)用localtime函數(shù)將time_t所表示的UTC時間轉(zhuǎn)換為本地時間(我們是+8區(qū),比UTC多8個小時)并轉(zhuǎn)成struct tm類型,該類型的各數(shù)據(jù)成員分別表示年月日時分秒。需要包含頭文件

      C標(biāo)準(zhǔn)庫函數(shù)

      time_t time(time_t *t);

      如果t是空指針,直接返回當(dāng)前時間。如果t不是空指針,返回當(dāng)前時間的同時,將返回值賦予t指向的內(nèi)存空間。

      這樣便通過rand()函數(shù)產(chǎn)生了隨機數(shù),對其進行取模,便得到一定范圍內(nèi)的隨機數(shù)了。

      二、

      然后便是吃食的問題了,當(dāng)蛇頭遇到一個食物時(食物在貪吃蛇前進的方向上),便將該食物變?yōu)樯哳^,然后將原先的蛇頭變?yōu)樯呱恚瑥亩_到了吃食的目的。

      那如果沒有碰到食物呢?就按照原來的方向或者鍵盤按下的方向繼續(xù)前進就是了。

      三、

      下面就是實現(xiàn)的問題了,如何將每個動態(tài)都展現(xiàn)出來呢?就是說貪吃蛇是一下一下往前移動的,這個又是如何實現(xiàn)的呢?

      這里我使用了clock()函數(shù),下面是相關(guān)知識:

      clock()是C/C++中的計時函數(shù),而與其相關(guān)的數(shù)據(jù)類型是clock_t。在MSDN中,查得對clock函數(shù)定義如下:

      clock_t clock(void) ;

      簡單而言,就是該程序從啟動到函數(shù)調(diào)用占用CPU的時間。這個函數(shù)返回從“開啟這個程序進程”到“程序中調(diào)用clock()函數(shù)”時之間的CPU時鐘計時單元(clock tick)數(shù),在MSDN中稱之為掛鐘時間(wal-clock);若掛鐘時間不可取,則返回-1。其中clock_t是用來保存時間的數(shù)據(jù)類型。

      因此,通過定義

      int start = clock();while(clock()-start<=gamespeed);

      這樣一個方式來達到了延時的目的,延時的時間則根據(jù)gamespeed的值來確定,當(dāng)gamespeed值越小時,延時時間越短。經(jīng)過延時后,再執(zhí)行下一步代碼,從而實現(xiàn)了貪吃蛇自動前進的功能和控制其前進的速度啦。

      然而,僅僅有這些還是不行的,還需要解決輸出問題。

      通過查閱資料得知,system(“cls”);具有清屏的功能,清除當(dāng)前屏幕上的內(nèi)容,進行下一步的輸出,因此我便使用了每動一下都要進行清屏,然后將貪吃蛇棋盤整個畫面進行輸出。

      四、

      為了增加游戲的娛樂性,我又從中加入了等級選擇功能,通過輸入數(shù)字來選擇等級,等級越高,貪吃蛇移動速度越快,而且得分越高。得分規(guī)則:score += grade*20;

      考慮到游戲的功能性,在游戲結(jié)束后輸出得分情況,并提示是否繼續(xù)游戲,而不是直接退出游戲,這樣用戶就不必每次游戲失敗后重新打開程序進行游戲,而是通過選擇的方式?jīng)Q定繼續(xù)游戲或者退出游戲。

      而且加入暫停功能,當(dāng)玩家玩累了,需要暫停的時候,按下空格(space)鍵實現(xiàn)暫停,

      但由于我的原因,無法解決需要按兩下空格才能繼續(xù)游戲的bug,就暫定為按兩下空格鍵繼續(xù)游戲吧。

      #include 
      #include 
      #include 
      #include 
      #include 
      #include 
      #include 
      #define  N 22
      using namespace std;
       
          int gameover;
       
          int x1, y1; // 隨機出米
       
          int x,y;
       
          long start;
       
      //=======================================
      //類的實現(xiàn)與應(yīng)用initialize
      //=======================================
       
      //下面定義貪吃蛇的坐標(biāo)類
      class snake_position
      {
      public:
       
          int x,y;      //x表示行,y表示列
       
          snake_position(){};
       
          void initialize(int &);//坐標(biāo)初始化
       
       
      };
       
      snake_position position[(N-2)*(N-2)+1]; //定義貪吃蛇坐標(biāo)類數(shù)組,有(N-2)*(N-2)個坐標(biāo)
       
      void snake_position::initialize(int &j)
      {
              x = 1;
       
              y = j;
      }
       
       
      //下面定義貪吃蛇的棋盤圖
       
      class snake_map
      {
       
      private:
       
          char s[N][N];//定義貪吃蛇棋盤,包括墻壁。
       
          int grade, length;
       
          int gamespeed; //前進時間間隔
       
          char direction; // 初始情況下,向右運動
       
          int head,tail;
       
          int score;
       
          bool gameauto;
       
      public:
       
          snake_map(int h=4,int t=1,int l=4,char d=77,int s=0):length(l),direction(d),head(h),tail(t),score(s){}
       
          void initialize();   //初始化函數(shù)
       
          void show_game();
       
          int updata_game();
       
          void setpoint();
       
          void getgrade();
       
          void display();
       
       
      };
       
      //定義初始化函數(shù),將貪吃蛇的棋盤圖進行初始化
       
      void snake_map::initialize()
      {
          int i,j;
       
          for(i=1;i<=3;i++)
       
              s[1][i] = '*';
       
          s[1][4] = '#';
       
          for(i=1;i<=N-2;i++)
       
              for(j=1;j<=N-2;j++)
       
                  s[i][j]=' '; // 初始化貪吃蛇棋盤中間空白部分
       
          for(i=0;i<=N-1;i++)
       
              s[0][i] = s[N-1][i] = '-'; //初始化貪吃蛇棋盤上下墻壁
       
          for(i=1;i<=N-2;i++)
       
              s[i][0] = s[i][N-1] = '|'; //初始化貪吃蛇棋盤左右墻壁
      }
       
       
      //============================================
      //輸出貪吃蛇棋盤信息
       
      void snake_map::show_game()
       
      {
       
          system("cls"); // 清屏
       
          int i,j;
       
          cout << endl;
       
          for(i=0;i>grade;
       
          while( grade>7 || grade<1 )
          {
              cout << "請輸入數(shù)字1-7選擇等級,輸入其他數(shù)字無效" << endl;
       
              cin >> grade;
          }
          switch(grade)
          {
              case 1: gamespeed = 1000;gameauto = 0;break;
       
              case 2: gamespeed = 800;gameauto = 0;break;
       
              case 3: gamespeed = 600;gameauto = 0;break;
       
              case 4: gamespeed = 400;gameauto = 0;break;
       
              case 5: gamespeed = 200;gameauto = 0;break;
       
              case 6: gamespeed = 100;gameauto = 0;break;
       
              case 7: grade = 1;gamespeed = 1000;gameauto = 1;break;
       
          }
       
      }
       
      //輸出等級,得分情況以及稱號
       
      void snake_map::display()
      {
       
          cout << "\n\t\t\t\t等級:" << grade;
       
          cout << "\n\n\n\t\t\t\t速度:" << gamespeed;
       
          cout << "\n\n\n\t\t\t\t得分:" << score << "分" ;
       
      }
       
      //隨機產(chǎn)生米
      void snake_map::setpoint()
      {
          srand(time(0));
       
          do
          {
       
              x1 = rand() % (N-2) + 1;
       
              y1 = rand() % (N-2) + 1;
       
          }while(s[x1][y1]!=' ');
       
          s[x1][y1]='*';
      }
       
      char key;
       
      int snake_map::updata_game()
      {
          gameover = 1;
       
          key = direction;
       
          start = clock();
       
          while((gameover=(clock()-start<=gamespeed))&&!kbhit());
       
          //如果有鍵按下或時間超過自動前進時間間隔則終止循環(huán)
       
       
       
              if(gameover)
              {
       
                  getch();
       
                  key = getch();
              }
       
              if(key == ' ')
       
              {
                  while(getch()!=' '){};//這里實現(xiàn)的是按空格鍵暫停,按空格鍵繼續(xù)的功能,但不知為何原因,需要按兩下空格才能繼續(xù)。這是個bug。
              }
       
              else
       
                  direction = key;
       
              switch(direction)
              {
                  case 72: x= position[head].x-1; y= position[head].y;break; // 向上
       
                  case 80: x= position[head].x+1; y= position[head].y;break; // 向下
       
                  case 75: x= position[head].x; y= position[head].y-1;break; // 向左
       
                  case 77: x= position[head].x; y= position[head].y+1; // 向右
       
              }
       
              if(!(direction==72||direction==80||direction==75 ||direction==77))   // 按鍵非方向鍵
       
                  gameover = 0;
       
              else if(x==0 || x==N-1 ||y==0 || y==N-1)   // 碰到墻壁
       
                  gameover = 0;
       
              else if(s[x][y]!=' '&&!(x==x1&&y==y1))    // 蛇頭碰到蛇身
       
                  gameover = 0;
       
              else if(x==x1 && y==y1)
       
              { // 吃米,長度加1
       
                  length ++;
       
                  if(length>=8 && gameauto)
       
                  {
       
                      length -= 8;
       
                      grade ++;
       
                      if(gamespeed>=200)
       
                          gamespeed -= 200; // 改變貪吃蛇前進速度
       
                      else
       
                          gamespeed = 100;
       
                  }
       
                  s[x][y]= '#';  //更新蛇頭
       
                  s[position[head].x][position[head].y] = '*'; //吃米后將原先蛇頭變?yōu)樯呱? 
                  head = (head+1) % ( (N-2)*(N-2) );   //取蛇頭坐標(biāo)
       
                  position[head].x = x;
       
                  position[head].y = y;
       
                  show_game();
       
                  gameover = 1;
       
                  score += grade*20;  //加分
       
                  setpoint();   //產(chǎn)生米
       
              }
       
              else
              { // 不吃米
       
                  s[position[tail].x][position[tail].y]=' ';//將蛇尾置空
       
                  tail= (tail+1) % ( (N-2) * (N-2) );//更新蛇尾坐標(biāo)
       
                  s[position[head].x][position[head].y]='*';  //將蛇頭更為蛇身
       
                  head= (head+1) % ( (N-2) * (N-2) );
       
                  position[head].x = x;
       
                  position[head].y = y;
       
                  s[position[head].x][position[head].y]='#'; //更新蛇頭
       
                  gameover = 1;
       
              }
          return gameover;
       
      }
      //====================================
      //主函數(shù)部分
      //====================================
      int main()
      {
          char ctn = 'y';
       
          int nodead;
       
          cout<<"\n\n\n\n\n\t\t\t 歡迎進入貪吃蛇游戲!"<> ctn;
       
          }
       
          return 0;
      }

      感謝各位的閱讀!看完上述內(nèi)容,你們對c++制作貪吃蛇的案例代碼大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。


      網(wǎng)站標(biāo)題:c++制作貪吃蛇的案例代碼-創(chuàng)新互聯(lián)
      本文網(wǎng)址:http://www.ef60e0e.cn/article/dpijgg.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        兴山县| 渝中区| 余干县| 宜兰市| 嘉黎县| 郑州市| 丰都县| 文登市| 夏河县| 洛浦县| 洛扎县| 育儿| 柳林县| 古蔺县| 卢氏县| 永清县| 黎平县| 梅州市| 商都县| 大渡口区| 军事| 饶平县| 大埔区| 改则县| 台州市| 元江| 通渭县| 枝江市| 额济纳旗| 冷水江市| 交城县| 肥城市| 宁陵县| 民乐县| 姜堰市| 彭水| 长寿区| 天柱县| 宣汉县| 南陵县| 铜山县|