精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

通過(guò)C語(yǔ)言設(shè)計(jì)的貪吃蛇游戲(控制臺(tái)終端)

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-06-30 09:53 ? 次閱讀

一、項(xiàng)目介紹

當(dāng)前通過(guò)控制臺(tái)終端實(shí)現(xiàn)一個(gè)貪吃蛇小游戲,實(shí)現(xiàn)游戲的繪制、更新、控制等功能。

二、實(shí)現(xiàn)效果

image-20230618211315514

image-20230618211408842

三、完整代碼

下面貼出的代碼在Windows系統(tǒng)上編譯運(yùn)行,需要使用conio.h頭文件中的getch()函數(shù)來(lái)獲取鍵盤(pán)輸入,用于控制蛇的移動(dòng)。可以通過(guò)按下'w'、's'、'a'、'd'四個(gè)鍵來(lái)分別控制蛇的向上、向下、向左、向右移動(dòng)。同時(shí)還有一個(gè)暫停函數(shù)Pause(),用于控制蛇的移動(dòng)速度,可以根據(jù)需要調(diào)整暫停時(shí)間。

設(shè)計(jì)思路:

程序定義了一些常量,包括游戲界面的寬度和高度、不同狀態(tài)下的符號(hào)表示等,并在全局變量中定義了蛇頭、蛇身、食物等的位置、得分、長(zhǎng)度、行進(jìn)方向等參數(shù)。同時(shí)還定義了一個(gè)二維字符數(shù)組board,用于表示整個(gè)游戲界面。

在InitGame()函數(shù)中進(jìn)行游戲初始化,設(shè)置游戲界面的邊框、蛇頭、蛇身、隨機(jī)生成食物等操作。

DrawGame()函數(shù)用于繪制游戲畫(huà)面,將board數(shù)組中的字符逐行輸出,并在末尾輸出得分。UpdateGame()函數(shù)用于更新游戲狀態(tài),包括蛇的移動(dòng)、游戲結(jié)束判斷等。CheckGameOver()函數(shù)用于檢查游戲是否結(jié)束,包括墻壁碰撞、蛇身碰撞、得分達(dá)到上限等情況。GenerateFood()函數(shù)用于隨機(jī)生成食物位置,調(diào)用rand()函數(shù)獲取隨機(jī)數(shù)并進(jìn)行判斷。Move()函數(shù)用于蛇的移動(dòng),根據(jù)當(dāng)前行進(jìn)方向進(jìn)行移動(dòng)。Control()函數(shù)用于用戶(hù)操作,讀取鍵盤(pán)輸入并更新蛇的行進(jìn)方向。Pause()函數(shù)用于控制游戲速度,通過(guò)調(diào)用Sleep()函數(shù)控制暫停時(shí)間。GameOver()函數(shù)用于輸出最終得分和游戲結(jié)束信息,并直接退出程序。

image-20230618211229060

#include < stdio.h >
 #include < stdlib.h >
 #include < conio.h >  //需要使用getch()函數(shù)
 #include < time.h >   //需要使用time()函數(shù)
 #include < Windows.h >
 ?
 ?
 #define WIDTH 40    //游戲界面寬度
 #define HEIGHT 20   //游戲界面高度
 ?
 //定義符號(hào)常量,表示各種不同的狀態(tài)
 #define BLANK ' '   //空白
 #define WALL '*'    //墻壁
 #define SNAKEHEAD '@'  //蛇頭
 #define SNAKEBODY 'o'  //蛇身
 #define FOOD '$'    //食物
 ?
 //定義坐標(biāo)結(jié)構(gòu)體
 struct Position
 {
     int x;    //橫坐標(biāo)
     int y;    //縱坐標(biāo)
 };
 ?
 //定義枚舉類(lèi)型,表示游戲狀態(tài)
 enum GameState
 {
     Over = -1,   //游戲結(jié)束
     Running = 0, //游戲進(jìn)行中
     Win = 1      //游戲勝利
 };
 ?
 int score = 0;   //得分
 struct Position head;   //蛇頭位置
 struct Position body[WIDTH * HEIGHT];  //蛇身位置
 struct Position food;   //食物位置
 char board[WIDTH][HEIGHT];   //游戲界面
 int length = 3;     //蛇身長(zhǎng)度,初始為3
 int direction = 0;  //蛇的行進(jìn)方向,0表示向右,1表示向下,2表示向左,3表示向上
 ?
 //函數(shù)聲明
 void InitGame();    //初始化游戲界面和蛇的初始位置
 void DrawGame();    //繪制游戲畫(huà)面
 void UpdateGame();  //更新游戲狀態(tài)
 enum GameState CheckGameOver();  //檢查游戲是否結(jié)束
 void GenerateFood();   //生成隨機(jī)食物
 void Move();     //蛇的移動(dòng)
 void Control();  //用戶(hù)操作,控制蛇的移動(dòng)
 void Pause();    //游戲暫停
 void GameOver(); //游戲結(jié)束
 ?
 int main()
 {
     srand(time(NULL));   //用當(dāng)前時(shí)間作為隨機(jī)數(shù)種子,使每次運(yùn)行的隨機(jī)食物位置不同
     InitGame();   //初始化游戲
     DrawGame();   //繪制游戲畫(huà)面
     while (1)
     {
         UpdateGame();  //更新游戲
         DrawGame();    //繪制游戲畫(huà)面
         Control();     //用戶(hù)操作,控制蛇的移動(dòng)
         Pause();       //游戲暫停     
     }
     return 0;
 }
 ?
 //初始化游戲界面和蛇的初始位置
 void InitGame()
 {
     for (int i = 0; i < WIDTH; i++)
     {
         for (int j = 0; j < HEIGHT; j++)
         {
             if (i == 0 || j == 0 || i == WIDTH - 1 || j == HEIGHT - 1) //設(shè)置墻壁
                 board[i][j] = WALL;
             else
                 board[i][j] = BLANK;    //其他為空白
         }
     }
 ?
     //初始化蛇的位置,由一個(gè)蛇頭和兩節(jié)身體組成,初始位置在游戲界面的中心
     head.x = WIDTH / 2;
     head.y = HEIGHT / 2;
     board[head.x][head.y] = SNAKEHEAD;
 ?
     body[0].x = head.x - 1;
     body[0].y = head.y;
     board[body[0].x][body[0].y] = SNAKEBODY;
 ?
     body[1].x = head.x - 2;
     body[1].y = head.y;
     board[body[1].x][body[1].y] = SNAKEBODY;
 ?
     GenerateFood();   //生成隨機(jī)食物
 }
 ?
 //繪制游戲畫(huà)面
 void DrawGame()
 {
     system("cls");   //清屏,避免前一幀的內(nèi)容殘留
 ?
     for (int i = 0; i < HEIGHT; i++)
     {
         for (int j = 0; j < WIDTH; j++)
         {
             printf("%c", board[j][i]);  //輸出一個(gè)字符
         }
         printf("\\n");    //每行輸出完后,換行
     }
 ?
     printf("Score: %d\\n", score);   //輸出得分
 }
 ?
 //更新游戲狀態(tài)
 void UpdateGame()
 {
     Move();   //蛇的移動(dòng)
     enum GameState state = CheckGameOver();  //檢查游戲是否結(jié)束
     if (state != Running)  //如果游戲結(jié)束,則進(jìn)行相應(yīng)操作
     {
         GameOver();
     }
 }
 ?
 //檢查游戲是否結(jié)束
 enum GameState CheckGameOver()
 {
     //蛇頭碰到墻壁,游戲結(jié)束
     if (board[head.x][head.y] == WALL)
         return Over;
 ?
     //蛇頭碰到蛇身,游戲結(jié)束
     for (int i = 0; i < length; i++)
     {
         if (head.x == body[i].x && head.y == body[i].y)
             return Over;
     }
 ?
     //吃到食物后,更新分?jǐn)?shù)和蛇的長(zhǎng)度,并生成新的食物
     if (head.x == food.x && head.y == food.y)
     {
         score += 10;
         length++;
         GenerateFood();
     }
 ?
     //蛇的長(zhǎng)度達(dá)到游戲界面總格子數(shù)減去墻壁的個(gè)數(shù),也就是蛇填滿游戲界面,游戲勝利
     if (length == (WIDTH - 2) * (HEIGHT - 2) - 4)
         return Win;
 ?
     return Running;   //游戲繼續(xù)進(jìn)行
 }
 ?
 //生成隨機(jī)食物
 void GenerateFood()
 {
     int x, y;
     do
     {
         x = rand() % (WIDTH - 2) + 1;    //隨機(jī)x坐標(biāo),排除在邊框上的墻壁位置
         y = rand() % (HEIGHT - 2) + 1;   //隨機(jī)y坐標(biāo),排除在邊框上的墻壁位置
     } while (board[x][y] != BLANK);   //如果隨機(jī)到的位置不為空白,則重新隨機(jī)
     food.x = x;
     food.y = y;
     board[x][y] = FOOD;  //在隨機(jī)位置生成食物
 }
 ?
 //蛇的移動(dòng)
 void Move()
 {
     //更新蛇身的位置,從后往前移動(dòng)
     for (int i = length - 1; i > 0; i--)
     {
         body[i].x = body[i - 1].x;
         body[i].y = body[i - 1].y;
         board[body[i].x][body[i].y] = SNAKEBODY;
     }
 ?
     //更新蛇頭的位置
     switch (direction)   //根據(jù)蛇頭行進(jìn)方向進(jìn)行移動(dòng)
     {
     case 0:  //向右
         head.x++;
         break;
     case 1:  //向下
         head.y++;
         break;
     case 2:  //向左
         head.x--;
         break;
     case 3:  //向上
         head.y--;
         break;
     }
     board[head.x][head.y] = SNAKEHEAD;   //更新蛇頭位置
     board[body[length - 1].x][body[length - 1].y] = BLANK;  //清除蛇尾
 }
 ?
 //用戶(hù)操作,控制蛇的移動(dòng)
 void Control()
 {
     if (kbhit())   //如果有按鍵按下
     {
         char ch = getch();   //獲取按鍵字符
         switch (ch)
         {
         case 'w':
             if (direction != 1)  //避免蛇頭掉頭
                 direction = 3;
             break;
         case 's':
             if (direction != 3)
                 direction = 1;
             break;
         case 'a':
             if (direction != 0)
                 direction = 2;
             break;
         case 'd':
             if (direction != 2)
                 direction = 0;
             break;
         case 'q':
             GameOver();  //按下'q'鍵退出游戲
             break;
         }
     }
 }
 ?
 //游戲暫停
 void Pause()
 {
     Sleep(150);   //每次循環(huán)暫停一段時(shí)間,控制蛇的移動(dòng)速度
 }
 ?
 //游戲結(jié)束
 void GameOver()
 {
     system("cls");   //清屏,輸出最終得分和游戲結(jié)束信息
     printf("Game over!\\n");
     printf("Your score: %d\\n", score);
     exit(0);  //直接退出程序
 }

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7601

    瀏覽量

    136251
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4753

    瀏覽量

    68369
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲

    貪吃蛇(也叫做貪食游戲是一款休閑益智類(lèi)游戲,有PC和手機(jī)等多平臺(tái)版本。既簡(jiǎn)單又耐玩。該游戲通過(guò)
    發(fā)表于 11-23 16:56 ?917次閱讀

    貪吃蛇游戲

    編的簡(jiǎn)單的貪吃蛇游戲
    發(fā)表于 05-05 16:40

    如何c語(yǔ)言控制貪吃蛇走向(單片機(jī) 16*16點(diǎn)陣)

    我想做一個(gè)貪吃蛇的小游戲,用4個(gè)8*8的點(diǎn)陣拼成,如何用c語(yǔ)言寫(xiě)一個(gè)控制貪吃蛇的走向的程序,先寫(xiě)
    發(fā)表于 06-09 01:03

    貪吃蛇游戲

    貪吃蛇游戲的下載
    發(fā)表于 03-04 18:24

    基于51單片機(jī)c語(yǔ)言貪吃蛇游戲

    基于51單片機(jī)的C語(yǔ)言貪吃蛇游戲仿真
    發(fā)表于 11-25 21:05

    貪吃蛇游戲的電路實(shí)現(xiàn)

    最近論壇好冷清,在此發(fā)一貼暖暖身,回到正題,大家都玩過(guò)“貪吃蛇游戲,用代碼實(shí)現(xiàn)該游戲想必難不倒大神,在網(wǎng)上也有一大堆針對(duì)該游戲的代碼實(shí)現(xiàn),如果擺脫代碼,用硬件來(lái)實(shí)現(xiàn)“
    發(fā)表于 11-19 17:52

    貪吃蛇游戲

    Labview制作貪吃蛇游戲,值得學(xué)習(xí)研究
    發(fā)表于 09-07 21:39

    C語(yǔ)言寫(xiě)個(gè)貪吃蛇游戲

    C語(yǔ)言寫(xiě)個(gè)貪吃蛇游戲 貪吃蛇是個(gè)非常經(jīng)典的游戲,用C
    發(fā)表于 04-10 10:44

    基于51單片機(jī)的貪吃蛇游戲設(shè)計(jì) 精選資料分享

    的理解,編寫(xiě)程序?qū)崿F(xiàn)對(duì)貪吃蛇的有效控制;(2)通過(guò)對(duì)51單片機(jī)硬件的學(xué)習(xí),學(xué)會(huì)運(yùn)用面包板,獨(dú)立按鍵、點(diǎn)陣屏等,完成對(duì)完整電路的搭建過(guò)程;(3)通過(guò)對(duì)Proteus仿真軟件的學(xué)習(xí),實(shí)現(xiàn)基
    發(fā)表于 07-16 06:48

    【FPGA DEMO】Lab 9:貪吃蛇游戲

    基于Perf-V開(kāi)發(fā)板,實(shí)現(xiàn)貪吃蛇游戲的設(shè)計(jì)。實(shí)驗(yàn)中用開(kāi)發(fā)板上key1-key4按鍵來(lái)控制小蛇的移動(dòng),VGA設(shè)計(jì)該游戲的界面。基本步驟如上所示,可前往RVBoards文檔中心下載教程
    發(fā)表于 07-30 15:53

    利用LED矩陣、 鍵盤(pán)編寫(xiě)一個(gè)簡(jiǎn)單的貪吃蛇游戲

    ** 貪吃蛇**By草木灰### 一、實(shí)驗(yàn)內(nèi)容1、利用LED矩陣、 鍵盤(pán)編寫(xiě)一個(gè)簡(jiǎn)單的貪吃蛇游戲2、通過(guò)編寫(xiě)貪吃蛇
    發(fā)表于 12-15 09:20

    基于stm32的貪吃蛇游戲的設(shè)計(jì)資料分享

    目錄前言一、主要功能二、主要模塊1.貪吃蛇鏈表2.ADC3.定時(shí)器中斷三、實(shí)際顯示效果前言自學(xué)完電阻觸摸屏之后做的小項(xiàng)目。我采用了C語(yǔ)言鏈表的方式來(lái)形成貪吃蛇。利用相關(guān)封裝好的函數(shù),將
    發(fā)表于 02-21 07:27

    貪吃蛇游戲設(shè)計(jì)貪吃蛇收尾基本完成

    電子發(fā)燒友網(wǎng)站提供《貪吃蛇游戲設(shè)計(jì)貪吃蛇收尾基本完成.rar》資料免費(fèi)下載
    發(fā)表于 03-24 23:06 ?3次下載

    C語(yǔ)言教程之貪吃蛇游戲的問(wèn)題

    C語(yǔ)言教程之貪吃蛇游戲的問(wèn)題,很好的C語(yǔ)言資料,快來(lái)學(xué)習(xí)吧。
    發(fā)表于 04-25 17:07 ?0次下載

    基于LabVIEW的貪吃蛇游戲源代碼

    基于LabVIEW的貪吃蛇游戲源代碼
    發(fā)表于 04-22 09:27 ?74次下載