最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言開發(fā)實現(xiàn)貪吃蛇小游戲

 更新時間:2020年10月11日 15:40:18   作者:WolfOnTheWay  
這篇文章主要為大家詳細介紹了C語言開發(fā)實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

小時候相信大家都玩過貪吃蛇,但是自從學了編程以后我都想自己實現(xiàn)一下,苦于沒有契機。

首先看一下游戲效果把:

接下來我們先分析一下貪吃蛇的需求有哪些:

  • 用合適的數(shù)據(jù)結構表示蛇、食物
  • 地圖的初始化
  • 蛇的移動、食物的隨機生成
  • 蛇的顯示、食物的顯示
  • 貪吃蛇的規(guī)則確定(碰到食物邊長、碰到邊界和自己死亡等……)

主要功能需求就是上面這些,接下來我直接上C語言代碼,這個游戲相信沒做過的人看完之后會覺得非常簡單,因為其中沒什么技術點可言,最重要的就是下面這幾句代碼,用于控制光標的位置。

#include<Windows.h>
COORD cor;
cor.X = 0;
cor.Y =2;
//光標位置更新到(0,2)
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);

源碼:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
#include<conio.h>
#define WIDE 60
# define HIGH 20
//1設置地圖邊界
//2初始化蛇的初始坐標、以及事務
//3、將蛇和食物顯示
//4 蛇的移動(WASD)
/*
 規(guī)則:
 蛇碰到強死掉
 蛇碰到自己死掉
 蛇碰到食物,身體增長,增加分數(shù)
*/
//5.蛇死掉顯示分數(shù)
//存儲蛇的每一節(jié)的坐標
typedef struct _body
{
 int x;
 int y;
}BODY;
typedef struct _snake
{
 //存儲蛇的身體
 BODY list[WIDE * HIGH];//身體的每一節(jié)坐標
 int size;//記錄身體長度
 BODY food;//食物的位置
 int dx;//x移動方向
 int dy;//y移動方向
 //記錄設尾位置
 int lastx;
 int lasty;
}SNAKE;
 
//初始化食物坐標
void initFood(SNAKE* s)
{
 srand(time(NULL));
 s->food.x = rand() % WIDE;
 s->food.y = rand() % HIGH;
 
}
 
//初始化蛇
void initSnake(SNAKE* s)
{
 //頭部
 s->list[0].x = WIDE / 2;
 s->list[0].y = HIGH / 2;
 //第一節(jié)
 s->list[1].x = WIDE / 2-1;
 s->list[1].y = HIGH / 2;
 //記錄身體大小
 s->size = 2;
 //初始化食物的坐標
 initFood(s);
 //默認向右移動
 s->dx = 1;
 s->dy = 0;
}
//顯示蛇
void showUi(SNAKE* s)
{
 /*
 每次顯示都要設置光標的位置
 
 */
 //顯示蛇
 COORD cor;
 for (int i = 0; i < s->size; ++i)
 {
 //設置光標的位置
 
 cor.X = s->list[i].x;
 cor.Y = s->list[i].y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor);
 
 //蛇頭
 if (i == 0)
 {
  printf("@");
  continue;
 }
 printf("*");
 }
 //顯示食物
 cor.X = s->food.x;
 cor.Y = s->food.y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor);
 printf("#");
 //清除掉蛇尾
 cor.X = s->lastx;
 cor.Y = s->lasty;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
 printf(" ");
 
}
//更新的蛇的坐標
void moveSnake(SNAKE* s)
{
    //記錄下蛇尾的位置
 s->lastx = s->list[s->size - 1].x;
 s->lasty = s->list[s->size - 1].y;
 for (int i = s->size-1; i >0; --i)
 {
 s->list[i].x = s->list[i - 1].x;
 s->list[i].y = s->list[i - 1].y;
 }
 s->list[0].x += s->dx;
 s->list[0].y += s->dy;
 
}
 
void controlSnake(SNAKE* s)
{
 char key=0;
 //判斷按鍵
 while (_kbhit())
 {
 key = _getch();
 }
 switch (key)
 {
 case 'a':
 s->dx = -1;
 s->dy = 0;
 break;
 case 's':
 s->dx = 0;
 s->dy = 1;
 break;
 case 'd':
 s->dx = 1;
 s->dy = 0;
 break;
 case 'w':
 s->dx = 0;
 s->dy = -1;
 break;
 default:
 break;
 }
}
 
//游戲結束
void gameEnd(SNAKE* s)
{
 COORD cor;
 cor.X = 0;
 cor.Y = HIGH + 1;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
 printf("游戲結束,最終得分為%d\n", (s->size - 2) * 10);
 //直接退出程序
 exit(0);
}
//蛇吃到自己
void snakeEatSelf(SNAKE* s)
{
 for (int i = 1; i < s->size; ++i)
 {
 if (s->list[0].x == s->list[i].x && s->list[0].y == s->list[i].y)
 {
  gameEnd(s);
 }
 }
}
//吃到食物
void snakeEatFood(SNAKE* s)
{
 if (s->list[0].x == s->food.x && s->list[0].y == s->food.y)
 {
 //食物重置
 initFood(s);
 //蛇加長
 s->size++;//增加后的坐標在移動的時候會自己進行加長
 }
}
 
//開始游戲
void startGame(SNAKE* s)
{
 //每次對蛇頭是否碰墻進行判斷
 while (s->list[0].x<WIDE&&s->list[0].x>=0&&s->list[0].y<HIGH&&s->list[0].y>0)
 {
 //控制方向
  controlSnake(s);
 //更新蛇的坐標
 moveSnake(s);
 //system("cls");//清屏
 //蛇移動
 showUi(s);
 //判斷蛇是否碰到自己
 snakeEatSelf(s);
 //吃到食物
 snakeEatFood(s);
 //蛇的速度可以通過睡眠時間進行調(diào)整
 Sleep(200);
 
 }
 gameEnd(s);
}
//初始化邊界
void initWall()
{
 COORD cor;
 for (int i = 0; i <= WIDE; ++i)
 {
 for (int j = 0; j <= HIGH; ++j)
 {
  if (i == 0 || i == WIDE||j==0||j==HIGH)
  {
 
  COORD cor;
  cor.X = i;
  cor.Y = j;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
  printf("+");
  }
 }
 }
}
//隱藏光標
void hideCursor()
{
 CONSOLE_CURSOR_INFO cursor;
 cursor.bVisible = FALSE;
 cursor.dwSize = sizeof(cursor);
 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleCursorInfo(handle, &cursor);
}
int main()
{
 //隱藏光標
 hideCursor();
 //初始化地圖
 initWall();
 //蛇類型定義
 SNAKE* snake = (SNAKE*)malloc(sizeof(SNAKE));
 
 //初始化蛇和食物
 initSnake(snake);
 //顯示蛇
 showUi(snake);
 //開始游戲
 startGame(snake);
 
 
 free(snake);
 //程序在HIGH+1行后面輸出
 COORD cor;
 cor.X = 0;
 cor.Y =HIGH+2;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cor);
 return 0;
}

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

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

相關文章

  • C語言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出

    C語言非遞歸算法解決快速排序與歸并排序產(chǎn)生的棧溢出

    上期我們講完了排序算法下,不知道小伙伴們有沒有發(fā)現(xiàn)一個問題,快速排序和歸并排序我們都是用遞歸來實現(xiàn)的,可能有小伙伴會問,如果說數(shù)據(jù)量很多話,棧區(qū)空間會不會不夠用呢?這期我們就來解決使用遞歸實現(xiàn)的排序?qū)е聴R绯鋈绾谓鉀Q
    2022-04-04
  • C語言驅(qū)動開發(fā)之內(nèi)核使用IO/DPC定時器詳解

    C語言驅(qū)動開發(fā)之內(nèi)核使用IO/DPC定時器詳解

    本章將繼續(xù)探索驅(qū)動開發(fā)中的基礎部分,定時器在內(nèi)核中同樣很常用,在內(nèi)核中定時器可以使用兩種,即IO定時器,以及DPC定時器,感興趣的可以了解一下
    2023-04-04
  • C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法

    C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法

    用來映射Unicode字符串的WideCharToMultiByte函數(shù)經(jīng)常被用來進行UTF-8編碼的轉換,以下我們將看到C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法,首先先來對WideCharToMultiByte作一個詳細的了解:
    2016-06-06
  • C++快速排序超詳細講解

    C++快速排序超詳細講解

    快速排序是一種高效的排序算法,通過分治法將數(shù)組劃分為兩部分,遞歸排序,直到整個數(shù)組有序,通過代碼解析和示例,詳細解釋了快速排序的工作原理和實現(xiàn)過程,需要的朋友可以參考下
    2025-03-03
  • C++中的函數(shù)修飾符深入講解

    C++中的函數(shù)修飾符深入講解

    這篇文章主要給大家介紹了關于C++中函數(shù)修飾符的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • C語言的程序環(huán)境與預處理你真的了解嗎

    C語言的程序環(huán)境與預處理你真的了解嗎

    這篇文章主要為大家詳細介紹了C語言的程序環(huán)境與預處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 如何在程序中判斷VS的版本(實現(xiàn)方法詳解)

    如何在程序中判斷VS的版本(實現(xiàn)方法詳解)

    下面小編就為大家?guī)硪黄绾卧诔绦蛑信袛郪S的版本(實現(xiàn)方法詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • OpenCV實現(xiàn)直線擬合

    OpenCV實現(xiàn)直線擬合

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)直線擬合,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++多線程之互斥鎖與死鎖

    C++多線程之互斥鎖與死鎖

    互斥鎖和死鎖是C++多線程中常見的情況,這篇文章就帶大家進一步了解多線程中的互斥鎖與死鎖這兩個概念,文中的示例代碼介紹得很詳細,快來跟隨小編一起學習吧
    2021-12-12
  • 你知道如何自定義sort函數(shù)中的比較函數(shù)

    你知道如何自定義sort函數(shù)中的比較函數(shù)

    這篇文章主要介紹了如何自定義sort函數(shù)中的比較函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論

长兴县| 通江县| 微山县| 泸水县| 阳城县| 盐城市| 米易县| 筠连县| 莆田市| 西贡区| 大连市| 阿合奇县| 汪清县| 武冈市| 广宁县| 聊城市| 上栗县| 灌云县| 阿勒泰市| 龙山县| 泰和县| 石狮市| 奉贤区| 株洲县| 罗源县| 西吉县| 永善县| 宜黄县| 阳泉市| 安仁县| 南汇区| 龙门县| 乌恰县| 武城县| 鄯善县| 阿巴嘎旗| 仁化县| 文山县| 馆陶县| 大余县| 荥经县|