惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
博客园 - 【当耐特】
博客园 - 叶小钗
量子位
博客园 - 聂微东
S
SegmentFault 最新的问题
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
宝玉的分享
宝玉的分享
小众软件
小众软件
罗磊的独立博客
有赞技术团队
有赞技术团队
Stack Overflow Blog
Stack Overflow Blog

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
简易贪吃蛇
myLv · 2026-05-03 · via 博客园_首页

Snake Game

一个使用C++实现的控制台简易贪吃蛇小游戏,刚开始做项目训练。

使用方式

使用W,S,A,D来实现上下左右移动,Q退出,P暂停。

注意事项

  • 要C++ 11或以上的版本
  • 作者是在读大学生,如果你对我的代码有任何问题或优化方法,请务必告知❤️❤️

代码

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

const int WIDTH  = 22;
const int LENGTH = 32;

// 蛇头的朝向
enum Direction {
	UP,
	DOWN,
	LEFT,
	RIGHT
};

class GameMap {
public:
	char gameMap[WIDTH][LENGTH];	// 游戏地图
	int food_x, food_y;	// 食物的坐标
	int Score;	// 得分
	int Round;	// 轮次
	int AllTimeHigh_score;	// 历史最高得分

public:
	GameMap()
	{
		for (int j = 0; j < LENGTH; j++) gameMap[0][j] = gameMap[WIDTH - 1][j] = '-';	// 上下边界
		for (int i = 1; i < WIDTH-1; i++) gameMap[i][0] = gameMap[i][LENGTH - 1] = '|';	// 左右边界
		for (int i = 1; i < WIDTH - 1; i++) for (int j = 1; j < LENGTH - 1; j++) gameMap[i][j] = ' ';	// 中间清空

		Score = Round = AllTimeHigh_score = 0;	// 初始化,Round用0是因为程序员的第一是0

		generate_food();
	}

	void generate_food()
	{
		random_device rd;
		mt19937 gen(rd());

		uniform_int_distribution<> dist_x(1, WIDTH - 2);	food_x = dist_x(gen);
		uniform_int_distribution<> dist_y(1, LENGTH - 2);	food_y = dist_y(gen);

		gameMap[food_x][food_y] = '$';
	}

	void show()
	{
		system("cls");  // 清屏刷新
		cout << "All-time high score: " << loadHighScore() << ", Round: " << Round << ", Score: " << Score << endl;
		for (int i = 0; i < WIDTH; i++)
		{
			for (int j = 0; j < LENGTH; j++) cout << gameMap[i][j];
			cout << endl;
		}
	}

	int loadHighScore()
	{
		ifstream ifs("AllTimeHighScore.txt", ios::in);
		int hs = 0;
		if (ifs >> hs) return hs;
		return 0;
	}

	void saveHighScore(int hs)
	{
		ofstream ofs("AllTimeHighScore.txt", ios::out);
		ofs << hs;
	}
};

class Snake : public GameMap {
private:
	vector<pair<int, int>> mySnake;	// 蛇的坐标
	int head_x, head_y;	// 蛇头
	Direction Dir;		// 蛇头朝向

public:
	Snake()
	{
		head_x = 10, head_y = 15;
		mySnake.push_back(make_pair(head_x, head_y));
		mySnake.push_back(make_pair(head_x, head_y-1));	// 初始时设置蛇的长度为2

		gameMap[head_x][head_y] = '0';
		gameMap[head_x][head_y] = 'o';

		Dir = RIGHT;
	}

	bool control_direction()
	{
		if (_kbhit())
		{
			char key = _getch();
			switch (key)
			{
				case 'w': if(Dir != DOWN)	Dir = UP;		break;
				case 's': if(Dir != UP)		Dir = DOWN;		break;
				case 'a': if(Dir != RIGHT)	Dir = LEFT;		break;
				case 'd': if(Dir != LEFT)	Dir = RIGHT;	break;
				case 'p': system("pause");	break;
				case 'q': return false;
			}
		}
		return true;
	}

	bool move()
	{
		// 更新头部
		switch (Dir)
		{
			case UP:    head_x--; break;
			case DOWN:  head_x++; break;
			case LEFT:  head_y--; break;
			case RIGHT: head_y++; break;
		}
		mySnake.insert(mySnake.begin(), make_pair(head_x, head_y));

		// 撞墙检测
		if (head_x <= 0 || head_x >= WIDTH-1 || head_y <= 0 || head_y >= LENGTH-1)
		{
			cout << "You hit the wall!" << endl;
			return false;
		}

		// 撞到自己检测
		for (int i = 1; i < (int)mySnake.size(); i++)
			if (mySnake[i].first == head_x && mySnake[i].second == head_y)
			{
				cout << "You are eating yourself!" << endl;
				return false;
			}

		// 吃到食物了
		if (head_x == food_x && head_y == food_y)
		{
			if (Round < 3) Score += 5;
			else if (Round < 7) Score += 10;
			else if (Round < 10) Score += 15;
			else if (Round < 30) Score += 20;
			else if (Round < 50) Score += 25;
			else if (Round < 100) Score += 30;
			else Score += 50;
			
			generate_food();
			Round++;
		}
		// 没吃到,要删除蛇尾
		else
		{
			gameMap[mySnake.back().first][mySnake.back().second] = ' ';
			mySnake.pop_back();
		}

		gameMap[head_x][head_y] = '0';
		gameMap[mySnake[1].first][mySnake[1].second] = 'o';

		return true;
	}

	void run()
	{
		while (true)
		{
			bool q = control_direction();
			if (!move() || !q)
			{
				cout << "Game over!" << endl;
				if (Score > AllTimeHigh_score) saveHighScore(Score);
				return;
			}
			show();
			if (Round < 3) Sleep(1000);
			else if (Round < 7) Sleep(700);
			else if (Round < 10) Sleep(500);
			else if (Round < 30) Sleep(400);
			else if (Round < 50) Sleep(300);
			else if (Round < 100) Sleep(200);
			else Sleep(100);
		}
	}
};

int main()
{
	Snake snake;
	snake.run();
	return 0;
}

如果你喜欢的话,能不能给我的github处也点各⭐:https://github.com/Shu-Jvan/Snake-Game