欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實現(xiàn)簡單貪吃蛇小游戲

 更新時間:2021年05月25日 10:17:36   作者:純粹.  
這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C++實現(xiàn)簡單貪吃蛇小游戲的具體代碼,供大家參考,具體內(nèi)容如下

1 貪吃蛇游戲原理

1.1 構造蛇身:定義一個坐標數(shù)組,存放的是蛇的每一節(jié)蛇身所在的坐標位置。

1.2 移動效果:每次移動時,將每一節(jié)蛇身(蛇頭除外)依次往前移動一節(jié),去掉蛇的最后一節(jié),確定蛇的方向

1.3 移動判斷:每次移動時,判斷蛇頭是否觸碰食物,如果碰到了食物,只進行前移蛇身和增加蛇頭的操作,不進行擦除蛇尾的操作

2游戲設計

2.1 游戲首頁

2.2 開始游戲

2.3 退出游戲

3.游戲實現(xiàn)

3.1 游戲首頁

void fist_show()
{
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
 cout << "        貪吃蛇游戲       " << endl;
 cout << "                          " << endl;
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
 cout << "*————————————*" << endl;
 cout << "*                        *" << endl;
 cout << "*                        *" << endl;
 cout << "*       1,游戲說明      *" << endl;
 cout << "*       2,開始游戲      *" << endl;
 cout << "*       3,結束游戲      *" << endl;
 cout << "*                        *" << endl;
 cout << "*                        *" << endl;
 cout << "*————————————*" << endl;
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
 system("pause");
 system("cls");
}

游戲說明介紹

void game_instruction()
{
 color(5);
 cout << "*********游戲說明如下:***********" << endl;
 color(3);
 cout << "*                                *" << endl;
 cout << "*  使用↑.↓.←.→控制蛇的移動   *" << endl;
 cout << "*  不能咬到自己                  *" << endl;
 cout << "*  不能撞到墻                    *" << endl;
 cout << "*  按到空格鍵暫停游戲            *" << endl;
 color(5);
 cout << "**********************************" << endl;
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
 system("pause");
 system("cls");
}

3.2 游戲開始

// 食物的坐標
struct food{
 int x;
 int y;
}food1;

//蛇的相關屬性
struct snake {
 int speed;//蛇移動的速度
 int len;//蛇的當前長度
 int x[snake_length];//組成蛇身的每一個*中x的坐標
 int y[snake_length];//組成蛇身的每一個*中y的坐標

}snake1;

將光標移動到控制臺的(x,y)坐標點處

//將光標移動到控制臺的(x,y)坐標點處
void gotoxy(int x, int y)
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

繪制地圖

void creat_map()
{
 //打印上下邊框
  for (int i = 0; i <= wide; i += 1)
  {
   //將光標移動依次到(i,0)處打印上邊框
   gotoxy(i, 0);
   cout<<"*";
   gotoxy(i, hight);
   cout << "*";
  }

  //打印左右邊框
  for (int i = 1; i < hight; i++)
  {
   //將光標移動依次到(0,i)處打印左邊框
   gotoxy(0, i);
   cout << "*";
   gotoxy(wide, i);
   cout << "*";
  }
}

初始化蛇身和食物

void init()
{
//隨機生成初始食物
  
  food1.x = rand() % (wide - 2) + 2;
  food1.y = rand() % (hight - 2) + 1;
  gotoxy(food1.x, food1.y);
  cout<<"★";
  //初始化蛇的屬性
  snake1.len = 4;
  snake1.speed = 200;

  //在屏幕中間生成蛇頭
  snake1.x[0] = wide / 2 + 2;//x坐標為偶數(shù)
  snake1.y[0] = hight / 2;
  //打印蛇頭
  gotoxy(snake1.x[0], snake1.y[0]);
  cout<<"■";

  //生成初試的蛇身
  for (int i = 1; i < snake1.len; i++)
  {
   //蛇身的打印,縱坐標不變,橫坐標為上一節(jié)蛇身的坐標值+2
   snake1.x[i] = snake1.x[i - 1] + 2;
   snake1.y[i] = snake1.y[i - 1];
   gotoxy(snake1.x[i], snake1.y[i]);
   printf("■");
  }
 
}

讓蛇移動

void snake_move() 
{
 int pre_key = key;
 key = _getch();

 
 
 *changeFlag為0表明此時沒有吃到食物,因此每走一步就要擦除掉蛇尾,以此營造一個移動的效果
 *為1表明吃到了食物,就不需要擦除蛇尾,以此營造一個蛇身增長的效果
 */
 if (changeFlag == 0)
 {
  gotoxy(snake1.x[snake1.len - 1], snake1.y[snake1.len - 1]);
  cout<<"  ";//在蛇尾處輸出空格即擦去蛇尾
 }

 //將蛇的每一節(jié)依次向前移動一節(jié)(蛇頭除外)
 for (int i = snake1.len - 1; i > 0; i--)
 {
  snake1.x[i] = snake1.x[i - 1];
  snake1.y[i] = snake1.y[i - 1];
 }

 //蛇當前移動的方向不能和前一次的方向相反,比如蛇往左走的時候不能直接按右鍵往右走
 //如果當前移動方向和前一次方向相反的話,把當前移動的方向改為前一次的方向
 if (pre_key == 4 && key == 5)
 {
  key = 4;
 }
  
 if (pre_key == 5 && key == 4)
 {
  key = 5;
 }
  
 if (pre_key == 6 && key == 7)
 {
  key = 6;
 }
  
 if (pre_key == 7 && key == 6)
 {
  key = 7;
 }
  

 
 //判斷蛇頭應該往哪個方向移動
 switch (key)
 {
 case 4:
  snake1.x[0] -= 2;//往左
  break;
 case 5:
  snake1.x[0] += 2;//往右
  break;
 case 6:
  snake1.y[0]--;//往上
  break;
 case 7:
  snake1.y[0]++;//往下
  break;
 }
 //打印出蛇頭
 gotoxy(snake1.x[0], snake1.y[0]);
 printf("■");
 gotoxy(wide - 2, 0);
 //由于目前沒有吃到食物,changFlag值為0
 changeFlag = 0;
 return;
}

創(chuàng)造食物

void createFood()
{
 if (snake1.x[0] == food1.x && snake1.y[0] == food1.y)//蛇頭碰到食物
 {
  //蛇頭碰到食物即為要吃掉這個食物了,因此需要再次生成一個食物
  while (1)
  {
   int flag = 1;
   food1.x = rand() % (wide - 4) + 2;
   food1.y = rand() % (hight - 2) + 1;

   //隨機生成的食物不能在蛇的身體上
   for (int i = 0; i < snake1.len; i++)
   {
    if (snake1.x[i] == food1.x && snake1.y[i] == food1.y)
    {
     flag = 0;
     break;
    }
   }
  }

  //繪制食物
  gotoxy(food1.x, food1.y);
  printf("★");

  snake1.len++;//吃到食物,蛇身長度加1
  sorce += 10;//每個食物得10分
  snake1.speed -= 5;//隨著吃的食物越來越多,速度會越來越快
  changeFlag = 1;//很重要,因為吃到了食物,就不用再擦除蛇尾的那一節(jié),以此來造成蛇身體增長的效果
 }
 return;
}

判斷蛇的規(guī)則

//判斷蛇運動是否符合規(guī)則
bool snakeStatus()
{
 //蛇頭碰到上下邊界,游戲結束
 if (snake1.y[0] == 0 || snake1.y[0] == hight)
  return false;
 //蛇頭碰到左右邊界,游戲結束
 if (snake1.x[0] == 0 || snake1.x[0] == wide)
  return false;
 //蛇頭碰到蛇身,游戲結束
 for (int i = 1; i < snake1.len; i++)
 {
  if (snake1.x[i] == snake1.x[0] && snake1.y[i] == snake1.y[0])
   return false;
 }
 return true;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 給ActiveX簽名的實現(xiàn)方法詳解

    給ActiveX簽名的實現(xiàn)方法詳解

    本篇文章是對給ActiveX簽名的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言廣播的使用詳解

    C語言廣播的使用詳解

    顧名思義可以把自己的數(shù)據(jù)發(fā)送給在特定范圍內(nèi)的所有人;我們網(wǎng)絡編程中的廣播一般是通過特定的廣播地址把自己的數(shù)據(jù)發(fā)送給局域網(wǎng)內(nèi)當前在線的客戶端
    2022-05-05
  • C語言動態(tài)內(nèi)存分配函數(shù)的實現(xiàn)

    C語言動態(tài)內(nèi)存分配函數(shù)的實現(xiàn)

    這篇文章主要介紹了C語言動態(tài)內(nèi)存分配函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • C語言計算分段函數(shù)問題

    C語言計算分段函數(shù)問題

    這篇文章主要介紹了C語言計算分段函數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言中進行大小寫字母轉化的示例代碼

    C語言中進行大小寫字母轉化的示例代碼

    C語言標準庫中提供了用于大小寫轉換的函數(shù),使得這一操作變得簡單而高效,本文將詳細介紹如何在C語言中進行大小寫字母的轉換,包括相關的函數(shù)和示例代碼,需要的朋友可以參考下
    2024-03-03
  • C++傳值、傳址、傳引用的區(qū)別和選擇小結

    C++傳值、傳址、傳引用的區(qū)別和選擇小結

    參數(shù)傳遞有傳值、傳址和傳引用這三種,本文主要介紹了C++傳值、傳址、傳引用的區(qū)別和選擇小結,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 利用C語言編寫一個無限循環(huán)語句

    利用C語言編寫一個無限循環(huán)語句

    這篇文章主要介紹了利用C語言編寫一個無限循環(huán)語句問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 15種?C++?常見報錯原因分析

    15種?C++?常見報錯原因分析

    這篇文章主要介紹了15種?C++?常見報錯,本文通過實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • C語言進階教程之預處理

    C語言進階教程之預處理

    C語言提供了多種預處理功能,如宏定義、文件包含、條件編譯等,下面這篇文章主要給大家介紹了關于C語言進階教程之預處理的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 歸并排序的遞歸實現(xiàn)與非遞歸實現(xiàn)代碼

    歸并排序的遞歸實現(xiàn)與非遞歸實現(xiàn)代碼

    以下是對歸并排序的遞歸實現(xiàn)與非遞歸實現(xiàn)代碼進行了詳細的介紹,需要的朋友可以過來參考下
    2013-08-08

最新評論