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

C語言實現(xiàn)貪吃蛇游戲演示

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

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

IDE用的是 VS2019

先看效果

 

代碼全覽

game.h

#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

#define PLATFORM 1 //運行的系統(tǒng) 1為win 0為linux
 
#define MAPWIDTH 15 //地圖寬度,包括墻
#define MAPHEIGHT 15  //地圖高度,包括墻
#define SNAKELENGTH (MAPHEIGHT - 2) * (MAPWIDTH - 2)
 
//結(jié)構(gòu)體聲明
struct Body
{
 int isExist;
 int x;
 int y;
};
 
 
struct Food {
 int x;
 int y;
};
 
 
void game();
 
void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight);
void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food);
void clearScreen();
void inputProcess(char* pinput);
void initSnake(struct Body snake[SNAKELENGTH], int length);
void generateFood(struct Food* food, struct Body snake[]);
int isWall(int x, int y);
int isSnake(int x, int y, struct Body snake[], int lengh);
void control(char input, struct Body snake[]);
void generateFood(struct Food* food, struct Body snake[]);
int isFood(int x, int y, struct Food* food);
int isEat(struct Body snake[], struct Food* pfood);
void bodyMove(struct Body snake[], int* bodyLength);
int isInBody(struct Body snake[], int lengh);

GameStart.c

#include "game.h"
 
void displayMenu() {
 
 printf("########################\n");
 printf("###### 貪吃蛇游戲 #######\n");
 printf("########################\n");
 printf("------------------------\n");
 printf("       1.開始游戲        \n");
 printf("       0.退出游戲        \n");
 printf("------------------------\n");
 printf("請輸入選項:>");
 
 char ch;
 scanf("%c", &ch);
 getchar();
 switch (ch)
 {
 case '1': {
  game();
  break;
 }
 case '0': {
  exit(0);
  break;
 }
 default:
  printf("輸入錯誤,請重新輸入:>");
  break;
 }
  
 
}
 
int main(void) {
 while (1) {
  clearScreen();
  displayMenu();
 
  clearScreen();
  
 }
 
 return 0;
}

game.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

//游戲邏輯
void game() {
 
 //分數(shù)
 int score = 0;
 
 //游戲狀態(tài) 0為勝利 1為咬到蛇身 2為撞到墻上 
 int gameState = 0;
 
 //輸入狀態(tài)
 char input = 0;
 //墻
 char wall[MAPHEIGHT][MAPWIDTH];
 //創(chuàng)建蛇結(jié)構(gòu)體數(shù)組
 struct Body snake[SNAKELENGTH];
 
 //創(chuàng)建食物結(jié)構(gòu)體
 struct Food food = { 5,5 };
 
 
 //初始化蛇
 initSnake(snake, SNAKELENGTH);
 
 //初始化墻
 initWall(wall, MAPWIDTH, MAPHEIGHT);
 
 //生成食物
 generateFood(&food, snake);
 

 while (1)
 {
 
  //清屏
  clearScreen();
 
 
  control(input, snake);
  //顯示地圖
  displayMap(MAPWIDTH, MAPHEIGHT, snake, SNAKELENGTH, food);
  printf("得分:%d\n", score);
  //printf("food:%d %d\n", food.x, food.y);
  //printf("snake:%d %d", snake[0].x, snake[0].y);
  //處理輸入
  inputProcess(&input);

 
  //撞到蛇身,游戲失敗
  if (isInBody(snake, SNAKELENGTH)) {
   gameState = 1;
   break;
  }
  //撞到墻上,游戲失敗
  if (isWall(snake[0].x, snake[0].y)) {
   gameState = 2;
   break;
  }
 
  //吃到食物加分,蛇身加一
  if (isEat(snake, &food)) {
   score++;
   snake[score].isExist = 1;
   snake[score].x = snake[score - 1].x;
   snake[score].y = snake[score - 1].y;
 
   if (score == SNAKELENGTH - 1) {
    //游戲勝利
    gameState = 0;
    break;
   }
 
   generateFood(&food, snake);
  }
 
  //蛇身移動
  bodyMove(snake, &score);
 
 }
 
 //勝負顯示
 switch (gameState)
 {
 
 case 1: {
  printf("咬到蛇身,游戲結(jié)束!\n");
 
  break;
 }
 case 2: {
  printf("撞到墻上,游戲結(jié)束!\n");
  break;
 }
 case 0: {
  printf("游戲勝利!\n");
  break;
 }
 default:
 
  break;
 }
 printf("按回車鍵退出");
 getchar();
 
}
 

//清除屏幕
void clearScreen() {
 if (PLATFORM) {
  system("cls");
 }
 else {
  system("clear");
 }
 
 
 printf("\033c");
}
 
//輸入處理
void inputProcess(char* pinput) {
 int t = (int)time(NULL);
 while (1) {
  if (_kbhit()) {
   switch (getch())
   {
   case 'w': {
    if (*pinput != 's') {
     *pinput = 'w';
    }
 
    break;
   }
   case 's':
   {
    if (*pinput != 'w') {
     *pinput = 's';
 
    }
 
    break;
   }
   case 'a': {
    if (*pinput != 'd') {
     *pinput = 'a';
    }
 
    break;
   }
   case 'd': {
    if (*pinput != 'a') {
     *pinput = 'd';
    }
    break;
   }
     /* case ' ': {
       *pinput = ' ';
       break;
      }*/
   default:
    break;
   }
  }
 
  if ((int)time(NULL) - t == 1) {
   //printf("%c\n", *pinput);
   //一秒一幀
 
   break;
  }
  /*if (*pinput == ' ') {
   continue;
  }*/
 
 }
 
}
 
//初始化墻
//'#'墻
//' '空
void initWall(char wall[MAPHEIGHT][MAPWIDTH], int mapWidth, int mapHeight) {
 
 
 for (int i = 0; i < mapHeight; i++) {
 
  for (int j = 0; j < mapWidth; j++) {
   if (i == 0 || i == mapHeight - 1) {
    wall[i][j] = '#';
   }
   else if (j == 0 || j == MAPWIDTH - 1) {
    wall[i][j] = '#';
   }
   else {
    wall[i][j] = ' ';
   }
 
  }
 }
}
 
 
//初始化蛇狀態(tài),位置
void initSnake(struct Body snake[SNAKELENGTH], int length) {
 
 for (int i = 0; i < length; i++) {
 
  if (i == 0)
  {
 
   snake[i].x = MAPWIDTH / 2;
   snake[i].y = MAPHEIGHT / 2;//蛇出生位置,即蛇頭初始位置
   snake[i].isExist = 1;
 
  }
  else {
   snake[i].isExist = 0;
   snake[i].x = 0;
   snake[i].y = 0;
  }
 
 
 }
 
 
}
 
//生成食物
void generateFood(struct Food* food, struct Body snake[]) {
 int x;
 int y;
 srand((unsigned int)time(NULL));
 do {
 
  x = (rand() % MAPHEIGHT) + 1;
  y = (rand() % MAPWIDTH) + 1;
 } while (isSnake(x, y, snake, SNAKELENGTH) || isWall(x, y));
 
 (*food).y = y;
 (*food).x = x;
}
 
//判斷是否是墻
int isWall(int x, int y) {
 if (y <= 1 || y >= MAPHEIGHT || x <= 1 || x >= MAPWIDTH) {
  return 1;
 }
 return 0;
}
 
 
//判斷是否是蛇
int isSnake(int x, int y, struct Body snake[], int lengh) {
 for (int i = 0; i < lengh; i++) {
  if (snake[i].isExist == 1 && snake[i].x == x && snake[i].y == y) {
   return 1;
  }
 
 }
 return 0;
}
 
//判斷是否撞到蛇身
int isInBody(struct Body snake[], int lengh) {
 for (int i = 1; i < lengh; i++) {
  if (snake[i].isExist == 1 && snake[i].x == snake[0].x && snake[i].y == snake[0].y) {
   return 1;
  }
 }
 return 0;
}
 
//判斷是否是食物
int isFood(int x, int y, struct Food* food) {
 if ((*food).x == x && (*food).y == y) {
  return 1;
 }
 return 0;
}
 
//顯示游戲地圖
void displayMap(int mapWidth, int mapHeight, struct Body snake[], int snakelength, struct Food food) {
 int x;
 int y;
 
 
 for (int i = 0; i < mapHeight; i++) {
  y = i + 1;
  for (int j = 0; j < mapWidth; j++) {
   x = j + 1;
   if (isWall(x, y)) {
    printf("# ");
   }
   else if (isSnake(x, y, snake, snakelength)) {
    if (snake[0].x == x && snake[0].y == y) {
     printf("@ ");//蛇頭
    }
    else {
     printf("* ");//蛇身
    }
 
   }
   else if (isFood(x, y, &food)) {
    printf("+ ");
   }
   else {
    printf("  ");
   }
 
 
  }
  printf("\n");
 }
 
 
}
 
//方向控制
void control(char input, struct Body snake[]) {
 switch (input) {
 case 'w': {
  snake[0].y -= 1;
  break;
 }
 case 'a': {
  snake[0].x -= 1;
  break;
 }
 case 's': {
  snake[0].y += 1;
  break;
 }
 case 'd': {
  snake[0].x += 1;
  break;
 }
 }
}
 
//判斷是否吃到食物
int isEat(struct Body snake[], struct Food* pfood) {
 if (isFood(snake[0].x, snake[0].y, pfood)) {
  return 1;
 }
 return 0;
}
 
//移動蛇身
void bodyMove(struct Body snake[], int* bodyLength) {
 if (*bodyLength) {
 
  for (int i = *bodyLength; i >= 1; i--) {
 
   snake[i].x = snake[i - 1].x;
   snake[i].y = snake[i - 1].y;
  }
 }
 
 
}

相關(guān)思路有空再寫。

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

相關(guān)文章

  • C++移除序列中連續(xù)重復(fù)的特定值示例代碼

    C++移除序列中連續(xù)重復(fù)的特定值示例代碼

    這篇文章主要給大家介紹了關(guān)于在C++中如何移除序列中連續(xù)重復(fù)的特定值,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Clion-MinGW編譯后的exe文件添加ico圖標的操作方法

    Clion-MinGW編譯后的exe文件添加ico圖標的操作方法

    這篇文章主要介紹了Clion-MinGW編譯后的exe文件添加ico圖標的操作方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 深入C語言內(nèi)存區(qū)域分配(進程的各個段)詳解

    深入C語言內(nèi)存區(qū)域分配(進程的各個段)詳解

    一般情況下,一個可執(zhí)行二進制程序(更確切的說,在Linux操作系統(tǒng)下為一個進程單元,在UC/OSII中被稱為任務(wù))在存儲(沒有調(diào)入到內(nèi)存運行)時擁有3個部分,分別是代碼段(text)、數(shù)據(jù)段(data)和BSS段。這3個部分一起組成了該可執(zhí)行程序的文件
    2013-07-07
  • C++中不得不說的map容器

    C++中不得不說的map容器

    大家好,本篇文章主要講的是C++中不得不說的map容器,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 字符串拷貝函數(shù)memcpy和strncpy以及snprintf 的性能比較

    字符串拷貝函數(shù)memcpy和strncpy以及snprintf 的性能比較

    以下是對字符串拷貝函數(shù)memcpy和strncpy以及snprintf它們之間的性能進行了比較,需要的朋友可以過來參考下
    2013-07-07
  • C++全面精通類與對象

    C++全面精通類與對象

    類和對象是兩種以計算機為載體的計算機語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲在內(nèi)存中—個可以擁有在某個范圍內(nèi)的可變存儲區(qū)域
    2022-05-05
  • C語言實現(xiàn)簡易通訊錄完整流程

    C語言實現(xiàn)簡易通訊錄完整流程

    這篇文章主要為大家介紹了C語言實現(xiàn)簡易通訊錄的完整流程,每個環(huán)節(jié)都有完整代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • c語言?數(shù)據(jù)存儲與原碼?反碼?補碼詳細解析

    c語言?數(shù)據(jù)存儲與原碼?反碼?補碼詳細解析

    不知道你是否和我一樣好奇,學(xué)習(xí)編程語言的同時想,各個數(shù)據(jù)類型是怎樣在我們的內(nèi)存中儲存的呢,如果你仔細深入了解的話,你會了解其中的樂趣,了解科學(xué)家們的偉大,了解c語言
    2022-02-02
  • 解決VC++編譯報錯error C2248的方案

    解決VC++編譯報錯error C2248的方案

    這篇文章主要介紹了解決VC++編譯報錯error C2248的方案的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • C++ opencv圖像處理實現(xiàn)圖片幾何變換示例

    C++ opencv圖像處理實現(xiàn)圖片幾何變換示例

    這篇文章主要為大家介紹了C++ opencv圖像處理實現(xiàn)圖片幾何變換示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論