21xrx.com
2024-12-22 18:20:59 Sunday
登录
文章检索 我的文章 写文章
C++代码实现贪吃蛇游戏
2023-07-05 00:51:10 深夜i     --     --
C++ 贪吃蛇 游戏 代码 实现

贪吃蛇游戏是一款经典的游戏,在本文中,我们将会使用C++代码实现一个经典的贪吃蛇游戏,并让读者们了解一些基本的编程技巧。

首先,我们需要定义蛇的结构体。蛇包含了若干个节点,每个节点都有一个坐标和方向。在C++中,我们可以通过定义一个结构体来实现这个要求。例如,我们可以定义如下的结构体:


struct Node

  int x; // 节点的x坐标

  int y; // 节点的y坐标

  int dir; // 节点的方向(上、下、左、右)

;

接下来,我们需要实现蛇的初始化、移动、吃食物等功能。初始化时,我们需要创建一个初始长度的蛇,我们可以使用一个动态数组来存储这些节点。在移动时,我们需要不断改变每个节点的坐标,让蛇沿着指定的方向移动。在蛇吃到食物后,我们还需要增加一个新的节点到蛇的尾部。

下面是一个完整的贪吃蛇游戏的C++代码实现:


#include <iostream>

#include <ctime>

#include <conio.h>

using namespace std;

const int WIDTH = 20;

const int HEIGHT = 10;

struct Node

  int x; // 节点的x坐标

  int y; // 节点的y坐标

  int dir; // 节点的方向(上、下、左、右)

;

int main()

{

  srand(time(NULL));

  // 初始化蛇

  int len = 3;

  Node* snake = new Node[len];

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

    snake[i].x = WIDTH/2 - i;

    snake[i].y = HEIGHT/2;

    snake[i].dir = 1; // 初始化为向右

  }

  

  // 初始化食物

  int foodX = rand() % WIDTH;

  int foodY = rand() % HEIGHT;

  while(true){

    // 清除屏幕

    system("cls");

    // 绘制游戏界面

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

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

        bool isSnake = false;

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

          if(snake[k].x == j && snake[k].y == i){

            if(k==0) cout << "O";

            else cout << "o";

            isSnake = true;

            break;

          }

        }

        if(!isSnake){

          if(j==foodX && i==foodY) cout << "*";

          else cout << " ";

        }

      }

      cout << endl;

    }

    // 判断是否吃到食物

    if(snake[0].x == foodX && snake[0].y == foodY){

      // 增加一个新节点到蛇的尾部

      len++;

      Node* tmp = new Node[len];

      for(int i=0; i<len-1; i++){

        tmp[i] = snake[i];

      }

      switch(snake[len-2].dir){

        case 1:

          tmp[len-1].x = snake[len-2].x + 1;

          tmp[len-1].y = snake[len-2].y;

          break;

        case 2:

          tmp[len-1].x = snake[len-2].x - 1;

          tmp[len-1].y = snake[len-2].y;

          break;

        case 3:

          tmp[len-1].x = snake[len-2].x;

          tmp[len-1].y = snake[len-2].y + 1;

          break;

        case 4:

          tmp[len-1].x = snake[len-2].x;

          tmp[len-1].y = snake[len-2].y - 1;

          break;

      }

      snake = tmp;

      // 食物位置改变

      foodX = rand() % WIDTH;

      foodY = rand() % HEIGHT;

    }

    // 蛇移动

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

      if(i==0){

        switch(snake[0].dir){

          case 1:

            snake[i].x = snake[i].x + 1;

            break;

          case 2:

            snake[i].x = snake[i].x - 1;

            break;

          case 3:

            snake[i].y = snake[i].y + 1;

            break;

          case 4:

            snake[i].y = snake[i].y - 1;

            break;

        }

      }

      else{

        snake[i].x = snake[i-1].x;

        snake[i].y = snake[i-1].y;

        snake[i].dir = snake[i-1].dir;

      }

    }

    // 按键控制蛇的移动

    if(kbhit()){

      char c = getch();

      switch(c){

        case 'w':

          snake[0].dir = 4;

          break;

        case 's':

          snake[0].dir = 3;

          break;

        case 'a':

          snake[0].dir = 2;

          break;

        case 'd':

          snake[0].dir = 1;

          break;

      }

    }

    // 判断游戏是否结束

    if(snake[0].x < 0 || snake[0].x >= WIDTH || snake[0].y < 0 || snake[0].y >= HEIGHT){

      cout << "Game over!" << endl;

      break;

    }

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

      if(snake[i].x == snake[0].x && snake[i].y == snake[0].y){

        cout << "Game over!" << endl;

        break;

      }

    }

    // 延时

    Sleep(200);

  }

  return 0;

}

在以上实现中,我们使用了循环结构,分支结构和动态内存等基本编程知识。读者们可以通过这份代码来加深对C++编程的理解和认识。

  
  

评论区

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