21xrx.com
2024-11-05 19:39:11 Tuesday
登录
文章检索 我的文章 写文章
C++代码:用于实现贪吃蛇游戏
2023-07-05 03:41:48 深夜i     --     --
C++ 贪吃蛇游戏 代码实现

贪吃蛇游戏是一款经典的游戏,通过控制蛇的方向,让蛇不断地吃食物,从而增加自己的长度。下面将介绍一份使用C++语言实现贪吃蛇游戏的代码。

首先,我们需要定义一些全局变量和常量,以及一些结构体。其中,snake代表蛇的结构体,food代表食物的结构体。以下是相关的定义:

const int MAX_X = 20; // 游戏界面的宽度

const int MAX_Y = 20; // 游戏界面的高度

const int MAX_LEN = MAX_X * MAX_Y; // 蛇的最大长度

const int UP = 1, DOWN = 2, LEFT = 3, RIGHT = 4; // 蛇的四个方向

struct snake{

  int x; // 蛇头的横坐标

  int y; // 蛇头的纵坐标

  int len; // 蛇的长度

  int dir; // 蛇的移动方向

  int bodyX[MAX_LEN], bodyY[MAX_LEN]; // 蛇身的坐标

}snk;

struct food

  int x; // 食物的横坐标

  int y; // 食物的纵坐标

fd;

接下来,我们需要实现两个函数,一个是initGame(),另一个是drawGame()。initGame()用于初始化游戏,包括生成初始蛇和第一个食物。drawGame()用于绘制游戏,包括绘制游戏界面、蛇和食物。

void initGame(){

  snk.x = 0; // 蛇头初始位置为左上角

  snk.y = 0;

  snk.len = 1; // 蛇刚开始只有一个身体

  snk.dir = RIGHT; // 蛇的初始方向为向右

  snk.bodyX[0] = snk.x; // 蛇身初始位置

  snk.bodyY[0] = snk.y;

  // 生成第一个食物

  fd.x = rand() % MAX_X;

  fd.y = rand() % MAX_Y;

}

void drawGame(){

  // 绘制游戏边框

  for(int i = 0; i < MAX_X + 2; i++)

    cout << "#";

  cout << endl;

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

    cout << "#";

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

      if(fd.x == j && fd.y == i) // 绘制食物

        cout << "O";

      else if(snk.x == j && snk.y == i) // 绘制蛇头

        cout << "@";

      else{ // 绘制空格

        bool isBody = false;

        for(int k = 0; k < snk.len; k++){ // 判断是否绘制蛇身

          if(snk.bodyX[k] == j && snk.bodyY[k] == i){

            cout << "*";

            isBody = true;

            break;

          }

        }

        if(!isBody)

          cout << " ";

      }

    }

    cout << "#" << endl;

  }

  for(int i = 0; i < MAX_X + 2; i++)

    cout << "#";

  cout << endl;

}

接着,我们需要实现一个move()函数,用于让蛇移动。在移动过程中,需要判断是否碰到边界、食物以及自身。

void move(){

  switch(snk.dir){

    case UP:

      snk.y--;

      break;

    case DOWN:

      snk.y++;

      break;

    case LEFT:

      snk.x--;

      break;

    case RIGHT:

      snk.x++;

      break;

  }

  // 判断是否撞墙

  if(snk.x < 0 || snk.x >= MAX_X || snk.y < 0 || snk.y >= MAX_Y){

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

    exit(0);

  }

  // 判断是否吃到食物

  if(snk.x == fd.x && snk.y == fd.y){

    snk.len++;

    fd.x = rand() % MAX_X;

    fd.y = rand() % MAX_Y;

  }

  // 判断是否碰到自身

  for(int i = 1; i < snk.len; i++){

    if(snk.bodyX[i] == snk.x && snk.bodyY[i] == snk.y){

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

      exit(0);

    }

  }

  // 移动蛇身

  for(int i = snk.len - 1; i > 0; i--){

    snk.bodyX[i] = snk.bodyX[i - 1];

    snk.bodyY[i] = snk.bodyY[i - 1];

  }

  snk.bodyX[0] = snk.x;

  snk.bodyY[0] = snk.y;

}

最后,我们还需要实现一个控制函数,用于监听用户的方向键输入,并根据输入改变蛇的方向。

void control(){

  char ch;

  if(kbhit()){

    ch = getch();

    switch(ch){

      case 'w':

        if(snk.dir != DOWN)

          snk.dir = UP;

        break;

      case 's':

        if(snk.dir != UP)

          snk.dir = DOWN;

        break;

      case 'a':

        if(snk.dir != RIGHT)

          snk.dir = LEFT;

        break;

      case 'd':

        if(snk.dir != LEFT)

          snk.dir = RIGHT;

        break;

    }

  }

}

下面是完整的代码:

#include

#include

#include

using namespace std;

const int MAX_X = 20;

const int MAX_Y = 20;

const int MAX_LEN = MAX_X * MAX_Y;

const int UP = 1, DOWN = 2, LEFT = 3, RIGHT = 4;

struct snake{

  int x;

  int y;

  int len;

  int dir;

  int bodyX[MAX_LEN], bodyY[MAX_LEN];

}snk;

struct food

  int x;

  int y;

fd;

void initGame(){

  snk.x = 0;

  snk.y = 0;

  snk.len = 1;

  snk.dir = RIGHT;

  snk.bodyX[0] = snk.x;

  snk.bodyY[0] = snk.y;

  fd.x = rand() % MAX_X;

  fd.y = rand() % MAX_Y;

}

void drawGame(){

  for(int i = 0; i < MAX_X + 2; i++)

    cout << "#";

  cout << endl;

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

    cout << "#";

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

      if(fd.x == j && fd.y == i)

        cout << "O";

      else if(snk.x == j && snk.y == i)

        cout << "@";

      else{

        bool isBody = false;

        for(int k = 0; k < snk.len; k++){

          if(snk.bodyX[k] == j && snk.bodyY[k] == i){

            cout << "*";

            isBody = true;

            break;

          }

        }

        if(!isBody)

          cout << " ";

      }

    }

    cout << "#" << endl;

  }

  for(int i = 0; i < MAX_X + 2; i++)

    cout << "#";

  cout << endl;

}

void move(){

  switch(snk.dir){

    case UP:

      snk.y--;

      break;

    case DOWN:

      snk.y++;

      break;

    case LEFT:

      snk.x--;

      break;

    case RIGHT:

      snk.x++;

      break;

  }

  if(snk.x < 0 || snk.x >= MAX_X || snk.y < 0 || snk.y >= MAX_Y){

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

    exit(0);

  }

  if(snk.x == fd.x && snk.y == fd.y){

    snk.len++;

    fd.x = rand() % MAX_X;

    fd.y = rand() % MAX_Y;

  }

  for(int i = 1; i < snk.len; i++){

    if(snk.bodyX[i] == snk.x && snk.bodyY[i] == snk.y){

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

      exit(0);

    }

  }

  for(int i = snk.len - 1; i > 0; i--){

    snk.bodyX[i] = snk.bodyX[i - 1];

    snk.bodyY[i] = snk.bodyY[i - 1];

  }

  snk.bodyX[0] = snk.x;

  snk.bodyY[0] = snk.y;

}

void control(){

  char ch;

  if(kbhit()){

    ch = getch();

    switch(ch){

      case 'w':

        if(snk.dir != DOWN)

          snk.dir = UP;

        break;

      case 's':

        if(snk.dir != UP)

          snk.dir = DOWN;

        break;

      case 'a':

        if(snk.dir != RIGHT)

          snk.dir = LEFT;

        break;

      case 'd':

        if(snk.dir != LEFT)

          snk.dir = RIGHT;

        break;

    }

  }

}

int main(){

  initGame();

  while(1){

    drawGame();

    control();

    move();

    system("cls");

  }

  return 0;

}

  
  

评论区

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