21xrx.com
2024-11-05 16:22:50 Tuesday
登录
文章检索 我的文章 写文章
C++贪吃蛇代码照抄实例
2023-07-14 19:53:25 深夜i     --     --
C++ 贪吃蛇 代码 实例 照抄

贪吃蛇游戏是非常经典的一款游戏,它的代码在各种编程语言中都有相应的实现。而在C++语言中,也有一份经典的贪吃蛇代码例子,下面我们来看一下。

这份C++贪吃蛇代码实例的核心思路是借助二维数组来模拟一个由格子组成的游戏场地。通过给方格编号的方法,可以方便地记录蛇头、蛇身和食物的位置,从而来控制游戏的进行。

代码写得十分巧妙,可以实现基本的贪吃蛇玩法,包括蛇的移动、食物的生成、得分的计算等。此外,作者也提供了一些可以进行修改和增强的接口,供玩家根据自己的需求进行修改。

如果你想体验这份C++贪吃蛇代码的话,可以先试着复制下面的代码,然后在代码编辑器中进行编译,最后运行。你会发现它是一份非常有趣的游戏代码。


#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <conio.h>

#include <windows.h>

using namespace std;

/*----------------------------------------*/

/* 宏定义部分 */

#define MAP_WIDTH 30    //游戏区域宽度

#define MAP_HEIGHT 20    //游戏区域高度

#define SLEEP_TIME 300   //蛇移动速度

#define KEY_UP 72      //上

#define KEY_DOWN 80     //下

#define KEY_LEFT 75     //左

#define KEY_RIGHT 77    //右

#define BORDER_CHAR "#"   //墙的边界字符

#define SNAKE_CHAR "@"   //蛇的字符

#define FOOD_CHAR "o"    //食物的字符

/*----------------------------------------*/

/* 定义部分 */

//游戏运行状态

enum GAME_STATE

  GAME_OVER;

//游戏角色

enum GAME_CHAR

  BORDER;

//游戏区域坐标

struct COORD y;

;

//蛇身信息

struct SNAKEINFO {

  int length;     //蛇长

  COORD s[MAP_WIDTH*MAP_HEIGHT];  //蛇身

};

/*----------------------------------------*/

/* 函数声明部分 */

void gotoxy(int x, int y);

void printMap(int mapData[][MAP_HEIGHT]);

void initMap(int mapData[][MAP_HEIGHT]);

bool moveSnake(int mapData[][MAP_HEIGHT], SNAKEINFO &snakeInfo, int keyCode);

bool isCollision(int mapData[][MAP_HEIGHT], COORD pos);

bool createFood(int mapData[][MAP_HEIGHT], COORD &foodPos);

int random(int start, int end);

/*----------------------------------------*/

//主函数

int main() {

  int mapData[MAP_WIDTH][MAP_HEIGHT];   //游戏区域数组

  GAME_STATE gameState = GAME_RUNNING;  //游戏状态初始化

  //初始化游戏

  initMap(mapData);

  //定义并初始化蛇身

  SNAKEINFO snakeInfo = {

    3,     //长度选为3

    {

       5,

      5,

      5

    }

  };

  //定义并初始化食物

  COORD foodPos = 0;

  createFood(mapData, foodPos);

  //清屏

  system("cls");

  //游戏主循环

  while (gameState != GAME_OVER) {

    //绘制游戏界面

    printMap(mapData);

    //移动蛇

    if (!moveSnake(mapData, snakeInfo, _getch()))

      gameState = GAME_OVER;

    

    //重新生成食物

    if (snakeInfo.s[0].x == foodPos.x && snakeInfo.s[0].y == foodPos.y) {

      snakeInfo.length++;

      createFood(mapData, foodPos);

    }

    //延时

    Sleep(SLEEP_TIME);

  }

  //游戏结束

  cout << "Game Over!!!" << endl;

  cout << "Your score is: " << snakeInfo.length - 3 << endl;

  system("pause");

  return 0;

}

/*----------------------------------------*/

/* 函数实现部分 */

//定位光标到(x, y)

void gotoxy(int x, int y) {

  COORD pos = x;

  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

}

//绘制游戏区域

void printMap(int mapData[][MAP_HEIGHT]) {

  system("cls");   //清空屏幕

  for (int i = 0; i < MAP_WIDTH; i++) {

    for (int j = 0; j < MAP_HEIGHT; j++) {

      switch (mapData[i][j])

      case BORDER:

        cout << BORDER_CHAR;

        break;

      case SNAKE:

        cout << SNAKE_CHAR;

        break;

      case FOOD:

        cout << FOOD_CHAR;

        break;

      

    }

    cout << endl;  //换行

  }

}

//初始化游戏区域

void initMap(int mapData[][MAP_HEIGHT]) {

  //清空游戏区域

  memset(mapData, 0, sizeof(int) * MAP_WIDTH * MAP_HEIGHT);

  //绘制游戏区域边框(墙)

  for (int i = 0; i < MAP_HEIGHT; i++) {

    mapData[0][i] = BORDER;       //左

    mapData[MAP_WIDTH-1][i] = BORDER;  //右

  }

  for (int i = 0; i < MAP_WIDTH; i++) {

    mapData[i][0] = BORDER;       //上

    mapData[i][MAP_HEIGHT-1] = BORDER; //下

  }

}

//移动蛇

bool moveSnake(int mapData[][MAP_HEIGHT], SNAKEINFO &snakeInfo, int keyCode) {

  COORD newPos = snakeInfo.s[0];     //新的蛇头坐标

  //处理按键

  switch (keyCode) {

  case KEY_UP:

    newPos.y--;

    break;

  case KEY_DOWN:

    newPos.y++;

    break;

  case KEY_LEFT:

    newPos.x--;

    break;

  case KEY_RIGHT:

    newPos.x++;

    break;

  }

  //判断是否撞墙或撞到身体

  if (isCollision(mapData, newPos)) {

    return false;

  }

  //移动身体

  for (int i = snakeInfo.length - 1; i > 0; i--) {

    snakeInfo.s[i] = snakeInfo.s[i - 1];

  }

  //移动头部

  snakeInfo.s[0] = newPos;

  //重置游戏区域

  initMap(mapData);

  //绘制蛇身

  for (int i = 0; i < snakeInfo.length; i++) {

    mapData[snakeInfo.s[i].x][snakeInfo.s[i].y] = SNAKE;

  }

  return true;

}

//判断是否发生碰撞

bool isCollision(int mapData[][MAP_HEIGHT], COORD pos) {

  return mapData[pos.x][pos.y] == BORDER || mapData[pos.x][pos.y] == SNAKE;

}

//生成食物

bool createFood(int mapData[][MAP_HEIGHT], COORD &foodPos) {

  //遍历游戏区域随机生成食物

  for (int i = 0; i < MAP_WIDTH; i++) {

    for (int j = 0; j < MAP_HEIGHT; j++) {

      if (mapData[i][j] == 0) {

        if (random(0, 100) <= 5) {

          mapData[i][j] = FOOD;

          foodPos.x = i;

          foodPos.y = j;

          return true;

        }

      }

    }

  }

  return false;

}

//生成指定范围内的随机整数

int random(int start, int end) {

  return rand() % (end - start + 1) + start;

}

以上就是这份C++贪吃蛇代码照抄实例的全部内容,希望能给学习C++程序设计的新手朋友们带来一些参考和帮助。当然,如果你想通过此例子衍生出更加复杂的贪吃蛇游戏,那么也可以根据自己的需求来进行修改、拓展和优化。总之,编程是一个不断挑战自己的过程,抓住机会勇敢尝试吧!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复