21xrx.com
2025-06-24 21:53:23 Tuesday
文章检索 我的文章 写文章
贪吃蛇C++代码
2023-07-04 20:54:53 深夜i     26     0
贪吃蛇 C++编程 游戏开发 数据结构 控制台应用

贪吃蛇是一款经典的游戏,也是许多程序员学习编程的练手项目。本文将介绍一份基于C++语言编写的简单贪吃蛇代码。

首先,需要包含以下头文件:

#include<iostream>
#include<conio.h>
#include<Windows.h>
using namespace std;

其中, ` `是输入输出的头文件,` `包含了getch函数,可以从键盘读取字符,` `则是操作系统相关的头文件,用于控制命令行窗口。

接下来,定义一些常量和变量:

const int ROW = 20; //行数
const int COL = 40; //列数
const int FOOD_NUM = 3; //食物数量
const int SNAKE_LEN = 5; //蛇的长度
char map[ROW][COL]; //游戏地图
int head_x, head_y; //蛇头坐标
int tail_x, tail_y; //蛇尾坐标
int food[FOOD_NUM][2]; //食物坐标
int score; //得分
bool gameover = false; //游戏是否结束

这里将游戏区域定为20行40列,设置3个食物和蛇的初长度为5。map、head_x、head_y、tail_x、tail_y、food、score和gameover分别表示游戏区域、蛇头坐标、蛇尾坐标、食物坐标、得分、游戏是否结束等信息。

接着,初始化游戏区域和蛇的初始状态:

void init() {
  for (int i = 0; i < ROW; i++) {
    for (int j = 0; j < COL; j++) {
      if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1) {
        map[i][j] = '#';
      }
      else {
        map[i][j] = ' ';
      }
    }
  }
  head_x = ROW / 2;
  head_y = COL / 2;
  for (int i = 0; i < SNAKE_LEN; i++) {
    map[head_x][head_y - i] = '*';
  }
  tail_x = head_x;
  tail_y = head_y - SNAKE_LEN + 1;
  for (int i = 0; i < FOOD_NUM; i++) {
    int x = rand() % (ROW - 2) + 1;
    int y = rand() % (COL - 2) + 1;
    food[i][0] = x;
    food[i][1] = y;
    map[x][y] = '@';
  }
  score = 0;
  gameover = false;
}

在init函数中,首先将游戏区域清空并设置边界为#。然后将蛇头定位在中心,初始化蛇的长度为5,用 * 表示蛇的身体状态。接着生成3个食物,用 @ 表示。score为0,gameover为假。

接下来,定义一个函数updateGame显示游戏画面:

void updateGame() {
  system("cls");
  for (int i = 0; i < ROW; i++) {
    for (int j = 0; j < COL; j++) {
      cout << map[i][j];
    }
    cout << endl;
  }
  cout << "score:" << score << endl;
  if (gameover)
    cout << "Game Over!" << endl;
  
}

该函数清空命令行窗口,遍历map数组,输出游戏区域。输出得分和游戏结束状态。

接下来,定义一个函数updateSnake,更新蛇的状态:

void updateSnake(char key) {
  int dx = 0, dy = 0;
  switch (key)
  case 'w': dx = -1; break;
  case 's': dx = 1; break;
  case 'a': dy = -1; break;
  case 'd': dy = 1; break;
  
  int new_head_x = head_x + dx;
  int new_head_y = head_y + dy;
  if (map[new_head_x][new_head_y] == '#' || map[new_head_x][new_head_y] == '*')
    gameover = true;
    return;
  
  if (map[new_head_x][new_head_y] == '@') {
    score++;
    for (int i = 0; i < FOOD_NUM; i++) {
      if (new_head_x == food[i][0] && new_head_y == food[i][1]) {
        map[new_head_x][new_head_y] = '*';
        food[i][0] = rand() % (ROW - 2) + 1;
        food[i][1] = rand() % (COL - 2) + 1;
        map[food[i][0]][food[i][1]] = '@';
        break;
      }
    }
  }
  else {
    map[tail_x][tail_y] = ' ';
  }
  map[new_head_x][new_head_y] = '*';
  head_x = new_head_x;
  head_y = new_head_y;
  tail_x = (tail_x + dx + ROW) % ROW;
  tail_y = (tail_y + dy + COL) % COL;
}

在updateSnake函数中,首先根据用户操作计算出新的蛇头位置。如果新位置是边界或已经是蛇的身体,则游戏结束。如果新位置是食物,则加分、移除原食物、产生新食物,并将新位置改为蛇的身体状态。否则,将蛇尾位置改为空白,并将新位置改为蛇的身体状态。

最后,编写主函数main和游戏循环:

int main() {
  srand(GetTickCount());
  char key;
  init();
  updateGame();
  while (!gameover) {
    if (_kbhit()) {
      key = _getch();
      if (key == 'w' || key == 's' || key == 'a' || key == 'd') {
        updateSnake(key);
        updateGame();
      }
    }
    Sleep(100);
  }
  return 0;
}

在主函数中,首先用当前系统时间初始化随机数生成器,接着执行初始化函数和更新游戏界面函数。接着开始游戏循环,不停按键、更新蛇的状态、更新游戏界面,循环中暂停100ms。当游戏结束时跳出循环。

代码到这里就告一段落了,是不是很简单呢?将以上代码拷贝到一个C++文件中,就可以运行这个简单的贪吃蛇游戏了。如果您想练习C++编程,这是一个不错的练手项目,也可以通过优化代码,制作出更加完善的贪吃蛇游戏。

  
  

评论区