21xrx.com
2025-03-27 17:20:12 Thursday
文章检索 我的文章 写文章
50行最简单代码实现C++贪吃蛇游戏
2023-07-05 00:51:29 深夜i     --     --
C++ 贪吃蛇 游戏 简单 代码

贪吃蛇游戏是经典的游戏,也是很多程序员写程序的练手项目。下面,我将给大家介绍如何使用最简单的50行代码实现C++贪吃蛇游戏。

首先,我们需要使用C++语言编写我们的代码。在这个项目中,我们会使用到几个关键的库函数和数据结构,包括:

1. Windows.h库:用于控制命令行窗口;

2. conio.h库:用于控制键盘输入;

3. vector容器:用于存储蛇的身体部分。

接下来,我们可以开始编写代码了。代码的基本框架如下:

#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <vector>
using namespace std;
int main()
  // 初始化命令行窗口大小和标题
  // 初始化蛇和食物的位置和状态
  // 游戏循环

然后,我们可以将代码细化为若干个函数:

1. 初始化窗口函数:

void InitWindow(int width, int height, LPCWSTR lpszTitle)
{
  // 设置窗口大小
  HWND hwnd = GetForegroundWindow();
  RECT rcClient, rcWindow;
  POINT ptDiff;
  GetClientRect(hwnd, &rcClient);
  GetWindowRect(hwnd, &rcWindow);
  ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
  ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
  MoveWindow(hwnd, rcWindow.left, rcWindow.top, width + ptDiff.x, height + ptDiff.y, TRUE);
  // 设置窗口标题
  SetConsoleTitle(lpszTitle);
}

2. 显示蛇和食物函数:

void Draw(vector<COORD>& snake, COORD& food)
{
  // 隐藏光标
  HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  CONSOLE_CURSOR_INFO cci;
  cci.bVisible = FALSE;
  cci.dwSize = 1;
  SetConsoleCursorInfo(hOut, &cci);
  // 清空窗口
  system("cls");
  for (int i = 0; i < 20; i++)
  {
    for (int j = 0; j < 20; j++)
    {
      if (i == 0 || i == 19 || j == 0 || j == 19)
      {
        COORD pos = i ;
        SetConsoleCursorPosition(hOut, pos);
        cout << '*';
      }
      else if (i == food.Y && j == food.X)
      {
        COORD pos = i ;
        SetConsoleCursorPosition(hOut, pos);
        cout << '@';
      }
      else
      {
        bool flag = false;
        for (int k = 0; k < snake.size(); k++)
        {
          if (i == snake[k].Y && j == snake[k].X)
          {
            COORD pos = i ;
            SetConsoleCursorPosition(hOut, pos);
            cout << 'O';
            flag = true;
            break;
          }
        }
        if (!flag)
        {
          COORD pos = i ;
          SetConsoleCursorPosition(hOut, pos);
          cout << ' ';
        }
      }
    }
  }
}

3. 移动蛇的身体函数:

void Move(vector<COORD>& snake, COORD& food, int& dir)
{
  // 获取键盘输入
  if (_kbhit())
  {
    int ch = _getch();
    if (ch == 72) dir = 1;
    else if (ch == 80) dir = 2;
    else if (ch == 75) dir = 3;
    else if (ch == 77) dir = 4;
  }
  // 移动蛇的身体
  COORD head = snake[0];
  switch (dir)
  {
  case 1:
    head.Y--;
    break;
  case 2:
    head.Y++;
    break;
  case 3:
    head.X--;
    break;
  case 4:
    head.X++;
    break;
  }
  for (int i = snake.size() - 1; i > 0; i--)
  {
    snake[i] = snake[i - 1];
  }
  snake[0] = head;
  // 撞墙或吃到食物
  if (head.X == 0 || head.X == 19 || head.Y == 0 || head.Y == 19)
  {
    exit(0);
  }
  else if (head.X == food.X && head.Y == food.Y)
  {
    food.X = rand() % 18 + 1;
    food.Y = rand() % 18 + 1;
    snake.push_back(snake[snake.size() - 1]);
  }
  // 撞自己
  for (int i = snake.size() - 1; i > 2; i--)
  {
    if (head.X == snake[i].X && head.Y == snake[i].Y)
    {
      exit(0);
    }
  }
  // 延迟
  Sleep(100);
}

4. 游戏循环函数:

void GameLoop()
{
  vector<COORD> snake;
  COORD head = 9;
  COORD food = 5;
  int dir = 4;
  snake.push_back(head);
  for (int i = 1; i < 5; i++)
  {
    COORD p = head.Y ;
    snake.push_back(p);
  }
  while (1)
  {
    // 显示蛇和食物
    Draw(snake, food);
    // 移动蛇的身体
    Move(snake, food, dir);
  }
}

最后,我们将上面定义的函数在main函数中调用即可:

int main()
{
  // 初始化窗口
  InitWindow(400, 400, L"Greedy Snake");
  // 进入游戏循环
  GameLoop();
  return 0;
}

至此,我们已经成功地编写了一个最简单的C++贪吃蛇游戏程序,只需50行代码就实现了。是不是很简单呢?

  
  

评论区