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

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

 更新時(shí)間:2021年05月28日 11:56:40   作者:兩片空白  
這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

實(shí)現(xiàn)功能

蛇最開始三節(jié),向右移動(dòng)。用戶可以通過按上下左右來控制蛇的移動(dòng),食物隨機(jī)產(chǎn)生,蛇吃到食物后蛇的身體會(huì)變長(zhǎng)。蛇撞墻或者撞到自己身體后,游戲結(jié)束。

怎么實(shí)現(xiàn)

要實(shí)現(xiàn)一個(gè)貪吃蛇小游戲,首先要想清楚游戲里有什么,怎樣實(shí)現(xiàn)功能。

很明顯游戲中只有兩樣?xùn)|西,蛇和食物。
所以要建立蛇和食物信息,然后將蛇和食物進(jìn)行初始化,在將蛇和食物畫出來。

實(shí)現(xiàn)的功能有:

 1. 蛇的移動(dòng)
 2. 按鍵控制蛇的移動(dòng)
 3. 食物的產(chǎn)生
 4. 蛇吃食物后蛇身體變長(zhǎng)
 5. 游戲的結(jié)束

用結(jié)構(gòu)體建立蛇和食物的信息

struct COOR{//位置,x,y坐標(biāo)
 int x;
 int y;
};

struct SNAKE{//蛇的基礎(chǔ)信息
 int size;//節(jié)數(shù)
 int speed;//運(yùn)動(dòng)速度
 char dir;//運(yùn)動(dòng)方向
 struct COOR xy[MAX];//位置
}snakes;

struct FOOD{//食物信息
 struct COOR fooddir;//食物位置
 int flag;//判斷食物是否被吃掉,1未被吃掉,0被吃掉
}food;

實(shí)現(xiàn)功能的函數(shù):

蛇:

void snakeInit(){//初始化蛇的信息
void drawSnake(){//畫蛇
void moveSnake(){//蛇的移動(dòng)
void coorSnake(){//按鍵控制蛇的運(yùn)動(dòng)方向

食物:

void initFood(){//初始化食物的信息
void drawFood(){//畫食物

其它:

int gameOver(){//游戲結(jié)束情況
void gameInit(){//初始化窗口范圍

代碼

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<graphics.h>
#include<conio.h>
#include<Windows.h>

#define MAX 200
HWND hwnd = NULL;

enum DIR{//枚舉移動(dòng)方向
 UP,
 DOWN,
 LEFT,
 RIGHT,
};

struct COOR{//位置,x,y坐標(biāo)
 int x;
 int y;
};

struct SNAKE{//蛇的基礎(chǔ)信息
 int size;//節(jié)數(shù)
 int speed;//運(yùn)動(dòng)速度
 char dir;//運(yùn)動(dòng)方向
 struct COOR xy[MAX];//位置
}snakes;

struct FOOD{//食物信息
 struct COOR fooddir;//食物位置
 int flag;//判斷食物是否被吃掉,1未被吃掉,0被吃掉
}food;

void snakeInit(){//初始化蛇的信息
 snakes.size = 3;//開始節(jié)數(shù)
 snakes.dir = RIGHT;//開始運(yùn)動(dòng)方向
 snakes.speed = 10;
 int i = 0;
 for (; i < snakes.size; i++){//每一節(jié)書的位置,注意將第一節(jié)作為頭
  snakes.xy[i].x = 40 - 10 * i;
  snakes.xy[i].y = 10;
 }

}

void drawSnake(){//畫蛇
 int i = 0;
 for (; i < snakes.size; i++){
 setlinecolor(BLACK);//畫線的顏色
 setfillcolor(RED);//填充色
 //fillrectangle(snakes.xy[i].x, snakes.xy[i].y, snakes.xy[i].x + 10, snakes.xy[i].y+10);//矩形
 fillcircle(snakes.xy[i].x, snakes.xy[i].y, 5);//圓形
 }


}

void moveSnake(){//蛇的移動(dòng)
 //snakes.xy[0].x++;

 int i = 0;
 for (i = snakes.size-1; i >0; i--){//蛇身跟著舌頭運(yùn)動(dòng)
  snakes.xy[i].x = snakes.xy[i-1].x;
  snakes.xy[i].y = snakes.xy[i-1].y;
 }
 switch (snakes.dir){
 case UP:
  snakes.xy[0].y-=snakes.speed;
  break;
 case DOWN:
   snakes.xy[0].y+=snakes.speed;
  break;
 case LEFT:
   snakes.xy[0].x-=snakes.speed;
  break;
 case RIGHT:
   snakes.xy[0].x+=snakes.speed;
  break;
 default:
  break;
 }


}

void coorSnake(){//按鍵控制蛇的運(yùn)動(dòng)方向
 if (_kbhit()){ //等待獲取按鍵
  char c = _getch();//獲得按鍵
  switch (c){
  case 72:
  case'w':
   if (snakes.dir != DOWN){
    snakes.dir = UP;
   }
   break;
  case 80:
  case's':
   if (snakes.dir != UP){
    snakes.dir = DOWN;
   }
   break;
  case 75:
  case'a':
   if (snakes.dir != RIGHT){
    snakes.dir = LEFT;
   }
   break;
  case 77:
  case'd':
   if (snakes.dir != LEFT){
    snakes.dir = RIGHT;
   }
   break;
  default:
   break;
  }
 }
}
void initFood(){//初始化食物的信息
 food.flag = 1;
 while (1){
START:
  food.fooddir.x = rand() % 63 * 10;//食物位置隨機(jī)
  food.fooddir.y = rand() % 47 * 10;
  for (int i = 0; i < snakes.size; i++){//防止食物生成在蛇身上。
   if (food.fooddir.x == snakes.xy[i].x&&food.fooddir.y == snakes.xy[i].y){
    goto START;
   }
   else{
    break;
   }
  }
  break;
 }
}

void drawFood(){//畫食物
 //food.fooddir.x = 100;
 //food.fooddir.y = 200;
 setlinecolor(BLACK);
 setfillcolor(RED);
 fillcircle(food.fooddir.x, food.fooddir.y, 5);

}
void eatFood(){//蛇吃食物
 if (snakes.xy[0].x - food.fooddir.x <= 5 && snakes.xy[0].y - food.fooddir.y <= 5 \
  && food.fooddir.x - snakes.xy[0].x <= 5 && food.fooddir.y - snakes.xy[0].y <= 5 && food.flag == 1){
  food.flag = 0;
  snakes.size++;
 }

}

int gameOver(){//游戲結(jié)束情況
 if (snakes.xy[0].x < 5 || snakes.xy[0].y <= 0 || snakes.xy[0].x > 635 || snakes.xy[0].y > 478){
  MessageBox(hwnd, "GAME OVER!","你撞墻了!", MB_OK);
  return 1;
 }
 for (int i = 1; i < snakes.size; i++){
  if (snakes.xy[0].x == snakes.xy[i].x&&snakes.xy[0].y == snakes.xy[i].y){
   MessageBox(hwnd, "GAME OVER!", "你撞了自己",MB_OK);
   return 1;
  }
 }
 return 0;
}


void gameInit(){
 hwnd=initgraph(640, 480);//設(shè)置窗口大小
 setbkcolor(GREEN);//設(shè)置窗口顏色
}


int main(){
 srand((unsigned long)time(NULL));//生成隨機(jī)數(shù)
 gameInit();
 cleardevice();//刷新窗口
 snakeInit();
 initFood();
 while (1){
  cleardevice();
  if (food.flag == 0){
   initFood();
  }
  drawFood();
  drawSnake();
  coorSnake();
  eatFood();
  moveSnake();
  //eatFood();
  if (gameOver()){
   break;
  }
  //stopGame();
  Sleep(100);
 }
 getchar();//防止閃屏
 closegraph();
 system("pause");
 return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)打印到紙張

    Qt數(shù)據(jù)庫應(yīng)用之實(shí)現(xiàn)數(shù)據(jù)打印到紙張

    關(guān)于Qt打印內(nèi)容到紙張,網(wǎng)上的辦法非常多,比如有些直接用painter繪制,逐步控制分頁打印。本文介紹的方法則是將內(nèi)容作為html設(shè)置到文檔對(duì)象,再調(diào)用文檔對(duì)象的print方法傳入QPrinter對(duì)象打印,感興趣的同學(xué)可以了解一下
    2022-01-01
  • C++選擇文件夾代碼的封裝

    C++選擇文件夾代碼的封裝

    這篇文章主要介紹了C++選擇文件夾代碼的封裝,實(shí)例展示了將選擇文件夾功能代碼封裝為一個(gè)類并對(duì)其進(jìn)行實(shí)例化調(diào)用的過程,對(duì)于學(xué)習(xí)C++程序設(shè)計(jì)有不錯(cuò)的參考價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C++中的extern聲明變量詳解

    C++中的extern聲明變量詳解

    這篇文章主要介紹了C++中的extern聲明變量詳解,本文講解了聲明和定義、extern聲明全局變量、extern聲明函數(shù)等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • 基于C++寫一個(gè)推箱子小游戲

    基于C++寫一個(gè)推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了基于C++寫一個(gè)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2023-09-09
  • OpenCV利用霍夫變換進(jìn)行直線檢測(cè)

    OpenCV利用霍夫變換進(jìn)行直線檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了OpenCV利用霍夫變換進(jìn)行直線檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 淺析C++內(nèi)存布局

    淺析C++內(nèi)存布局

    本文給大家介紹了C++內(nèi)存布局的相關(guān)知識(shí),通過進(jìn)程間通信比線程間通信難也是因?yàn)檫M(jìn)程間的用戶空間是相互隔離的,無法相互訪問,需要通過進(jìn)程間通信方式通信,通過內(nèi)核地址空間
    2021-10-10
  • C++詳解多線程中的線程同步與互斥量

    C++詳解多線程中的線程同步與互斥量

    線程間如何通信同步?一些伙伴好奇線程間的通信及同步方法,沒關(guān)系,下面小編就繼續(xù)給大家科普下線程間通信及同步的方法以及互斥量
    2022-05-05
  • c語言將字符串中的小寫字母轉(zhuǎn)換成大寫字母

    c語言將字符串中的小寫字母轉(zhuǎn)換成大寫字母

    本文主要介紹了c語言將字符串中的小寫字母轉(zhuǎn)換成大寫字母的方法實(shí)例。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • C語言實(shí)現(xiàn)折半查找法(二分法)

    C語言實(shí)現(xiàn)折半查找法(二分法)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)折半查找法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++11中delete和default的用法詳解

    C++11中delete和default的用法詳解

    這篇文章主要為大家詳細(xì)介紹了C++11中delete和default的具體用法,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-08-08

最新評(píng)論

武陟县| 宁安市| 忻州市| 扶沟县| 舒城县| 土默特左旗| 兴山县| 长海县| 天长市| 贵德县| 嘉善县| 万州区| 额敏县| 泾阳县| 嘉义县| 四平市| 宽城| 福鼎市| 遂川县| 监利县| 沂水县| 牡丹江市| 文成县| 吴旗县| 元江| 商南县| 韶关市| 襄城县| 内丘县| 师宗县| 乐平市| 丰都县| 正安县| 原阳县| 思南县| 原平市| 乳山市| 白水县| 牟定县| 萍乡市| 临沭县|