基于控制台的小车导航游戏开发详解(C++实现)
本文将详细讲解一个基于C++控制台的小车导航游戏项目。通过该项目可以学习二维数组操作、队列数据结构应用以及游戏循环控制等核心编程概念,特别适合刚接触游戏开发的初学者学习。
一、项目概述
1.1 游戏规则
-
玩家可创建多辆具有不同初始位置和移动速度的小车
-
每辆小车需要在二维地图中从起点(S)移动至终点(E)
-
使用wasd键控制移动方向:
-
w:向上移动
-
a:向左移动
-
s:向下移动
-
d:向右移动
-
-
实时显示地图和小车位置,统计最终成功数量及最短耗时
1.2 核心功能
-
多车队列管理
-
动态地图渲染
-
碰撞边界检测
-
移动耗时统计
-
游戏状态判断
二、核心代码解析
2.1 坐标系统与移动处理
cpp
if (sign == 'w') {new_x -= speed; // 向上移动
}
else if (sign == 'a') {new_y -= speed; // 向左移动
}
else if (sign == 's') {new_x += speed; // 向下移动
}
else if (sign == 'd') {new_y += speed; // 向右移动
}
坐标系统说明:
-
使用二维数组的行列索引坐标系
-
x轴:垂直方向(行索引)
-
增大表示向下移动
-
减小表示向上移动
-
-
y轴:水平方向(列索引)
-
增大表示向右移动
-
减小表示向左移动
-
移动示例分析:
当输入's'(向下移动)时:
-
实际是沿着垂直方向增加行索引
-
speed表示单次移动的格子数
-
例如原位置(2,3),speed=2,向下移动后坐标变为(4,3)
三、完整源代码(带注释版)
cpp
#include <iostream>
#include <vector>
#include <queue>
#include <climits> // 用于INT_MAX
using namespace std;// 小车结构体定义
struct car {int x, y; // 当前位置坐标int speed; // 移动速度(格子/秒)int time; // 已用时间car(int _x, int _y, int _speed, int _time) : x(_x), y(_y), speed(_speed), time(_time) {}
};// 生成初始地图
vector<vector<char>> get_map(int m, int n) {return vector<vector<char>>(m, vector<char>(n, '#')); // '#'表示普通道路
}// 输入校验函数
bool check(char sign) {return sign == 'w' || sign == 'a' || sign == 's' || sign == 'd';
}// 打印当前地图状态
void print(vector<vector<char>> maze) {for (int i = 0; i < maze.size(); i++) {for (int j = 0; j < maze[0].size(); j++) {cout << maze[i][j] << " ";}cout << endl;}cout << endl;
}int main() {queue<car> q; // 小车队列int num;cout << "请输入想要的车的数量: ";cin >> num;// 初始化小车信息for (int i = 0; i < num; i++) {cout << "请输入车的初始位置 (x, y) 和速度 (格/秒): " << endl;int cur_x, cur_y, cur_speed;cin >> cur_x >> cur_y >> cur_speed;q.push(car(cur_x, cur_y, cur_speed, 0));}// 创建地图cout << "请输入地图大小 (m * n): " << endl;int dx, dy;cin >> dx >> dy;vector<vector<char>> maze = get_map(dx, dy);maze[0][0] = 'S'; // 设置起点maze[dx-1][dy-1] = 'E'; // 设置终点int win_count = 0;int whole_time_min = INT_MAX; // 记录最短时间// 处理每辆小车while (!q.empty()) {car cur_car = q.front();q.pop();// 初始化小车位置maze[cur_car.x][cur_car.y] = '*'; print(maze);char sign;while (true) {cout << "请移动小车 (w:上, a:左, s:下, d:右): ";cin >> sign;// 输入验证if (!check(sign)) {cout << "无效输入,请输入 w/a/s/d!" << endl;continue;}// 计算新坐标int new_x = cur_car.x;int new_y = cur_car.y;switch(sign) {case 'w': new_x -= cur_car.speed; break;case 'a': new_y -= cur_car.speed; break;case 's': new_x += cur_car.speed; break;case 'd': new_y += cur_car.speed; break;}// 边界检查if (new_x < 0 || new_x >= dx || new_y < 0 || new_y >= dy) {cout << "移动超出地图范围!" << endl;break;}// 更新地图maze[cur_car.x][cur_car.y] = '#'; // 清除旧位置cur_car.x = new_x;cur_car.y = new_y;maze[new_x][new_y] = '*'; // 标记新位置cur_car.time++; // 更新时间print(maze); // 输出当前地图// 到达终点判断if (cur_car.x == dx-1 && cur_car.y == dy-1) {whole_time_min = min(whole_time_min, cur_car.time);win_count++;cout << "成功抵达终点!用时:" << cur_car.time << "秒" << endl;break;}}}// 输出最终统计cout << "\n===== 游戏结束 =====" << endl;cout << "总共 " << num << " 辆车,成功 " << win_count << " 辆,失败 " << num - win_count << " 辆" << endl;cout << "最短用时记录:" << whole_time_min + 1 << "秒" << endl;cout << "感谢您的游玩!" << endl;return 0;
}
四、运行示例
请输入想要的车的数量: 1 请输入车的初始位置 (x, y) 和速度 (格/秒): 0 0 2 请输入地图大小 (m * n): 5 5S # # # # # # # # # # # # # # # # # # # # # # # E请移动小车 (w/a/s/d): d ...(移动过程省略)...成功抵达终点!用时:4秒===== 游戏结束 ===== 总共 1 辆车,成功 1 辆,失败 0 辆 最短用时记录:4秒
五、扩展方向
-
添加障碍物系统
-
实现多车同时移动
-
增加移动动画效果
-
开发自动寻路算法
-
添加图形界面(SDL/OpenGL)
本项目通过简洁的代码实现了游戏核心机制,可作为学习二维游戏开发的基础模板。读者可以在此代码基础上进行扩展,开发出更复杂的游戏功能。
欢迎指出不足之处!!!
相关文章:
基于控制台的小车导航游戏开发详解(C++实现)
本文将详细讲解一个基于C控制台的小车导航游戏项目。通过该项目可以学习二维数组操作、队列数据结构应用以及游戏循环控制等核心编程概念,特别适合刚接触游戏开发的初学者学习。 一、项目概述 1.1 游戏规则 玩家可创建多辆具有不同初始位置和移动速度的小车 每辆…...
色谱图QCPColorMap
一、QCPColorMap 概述 QCPColorMap 是 QCustomPlot 中用于绘制二维颜色图的类,可以将矩阵数据可视化为颜色图(热力图),支持自定义色标和插值方式。 二、主要属性 属性类型描述dataQCPColorMapData存储颜色图数据的对象interpol…...
大文件分片上传进阶版(新增md5校验、上传进度展示、并行控制,智能分片、加密上传、断点续传、自动重试),实现四位一体的网络感知型大文件传输系统
上篇文章我们总结了大文件分片上传的主要核心,但是我对md5校验和上传进度展示这块也比较感兴趣,所以在deepseek的帮助下,扩展了一下我们的代码,如果有任何问题和想法,非常欢迎大家在评论区与我交流,我需要学…...
oracle不同数据库版本的自增序列
-- 查看数据库版本 SELECT * FROM v$version WHERE banner LIKE Oracle%; 1. Oracle 12c及以上版本支持 id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY, -- 语法 id NUMBER GENER…...
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试 1. 概述2. 压测环境部署3. 生成测试数据4. 写入性能测试5. 查询性能测试7. 总结 1. 概述 KaiwuDB分布式多模数据库从物联网场景真实需求出发,针对性设计多模架构。物联网…...
极狐GitLab 自定义实例级项目模板功能介绍
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 自定义实例级项目模板 (PREMIUM SELF) 极狐GitLab 管理员可以将群组设置为在实例上创建新项目时可选择的项目模板的来源。然…...
最新扣子(Coze)案例教程:飞书多维表格按条件筛选记录 + 读取分页Coze工作流,无限循环使用方法,手把手教学,完全免费教程
大家好,我是斜杠君。 👨💻 星球群里有同学想学习一下飞书多维表格的使用方法,关于如何通过按条件筛选飞书多维表格中的记录,以及如何使用分页解决最多一次只能读取500条的限制问题。 斜杠君今天就带大家一起搭建一…...
第八天 AI开发:NavMesh导航系统 对话系统:使用ScriptableObject存储对话数据 存档系统:JSON序列化保存数据
一、智能导航系统:NavMesh实战指南 1.1 导航网格基础配置 在Unity编辑器中: 选择场景中的静态物体勾选Navigation Static属性打开Window > AI > Navigation窗口 烘焙参数设置: NavMeshBuildSettings settings NavMesh.GetSettingsBy…...
Spring AI Alibaba-02-多轮对话记忆、持久化消息记录
Spring AI Alibaba-02-多轮对话记忆、持久化消息记录 Lison <dreamlison163.com>, v1.0.0, 2025.04.19 文章目录 Spring AI Alibaba-02-多轮对话记忆、持久化消息记录多轮对话对话持久-Redis 本次主要聚焦于多轮对话功能的实现,后续会逐步增加更多实用内容&…...
联邦元学习实现个性化物联网的框架
随着数据安全和隐私保护相关法律法规的出台,需要直接在中央服务器上收集和处理数据的集中式解决方案,对于个性化物联网而言,训练各种特定领域场景的人工智能模型已变得不切实际。基于此,中山大学,南洋理工大学…...
做虚拟化应该怎么选择美国服务器?
选择适合做虚拟化的美国服务器,需要综合考虑硬件性能、网络质量、稳定性、价格和服务支持等多个方面。以下是详细的选购指南,适合准备搭建VPS、虚拟主机、分销业务、开发测试环境、容器集群等用途的用户参考。 一、为什么美国服务器适合虚拟化? 美国机房…...
实验1 温度转换与输入输出强化
知识点:input()/print()、分支语句、字符串处理(教材2.1-2.2) 实验任务: 1. 实现摄氏温度与华氏温度互转(保留两位小数) 2. 扩展功能:输入错误处理(如非数字输入提示重新输入&#x…...
MongoDB 集合名称映射问题
项目场景 在使用 Spring Data MongoDB 进行开发时,定义了一个名为 CompetitionSignUpLog 的实体类,并创建了对应的 Repository 接口。需要明确该实体类在 MongoDB 中实际对应的集合名称是 CompetitionSignUpLog 还是 competitionSignUpLog。 问题描述 …...
【AI】SpringAI 第五弹:接入千帆大模型
1. 添加依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-qianfan</artifactId> </dependency> 2. 编写 yml 配置文件 spring:ai:qianfan:api-key: 你的api-keysecret-key: 你的secr…...
【编码规范】原生开发 与 Vue+组件库开发
原生开发 vs Vue组件库开发对比 一、原生开发常用方法 DOM操作: document.getElementById()document.querySelector()element.addEventListener()classList API操作类名 事件处理: 直接事件绑定事件委托 document.body.addEventListener(click, functi…...
[Godot] C#2D平台游戏基础移动和进阶跳跃代码
本文章给大家分享一下如何实现基本的移动和进阶的跳跃(跳跃缓冲、可变跳跃、土狼时间)以及相对应的重力代码,大家可以根据自己的需要自行修改 实现效果 场景搭建 因为Godot不像Unity,一个节点只能绑定一个脚本,所以我…...
【Unity笔记】Unity + OpenXR项目无法启动SteamVR的排查与解决全指南
图片为AI生成 一、前言 随着Unity在XR领域全面转向OpenXR标准,越来越多的开发者选择使用OpenXR来构建跨平台的VR应用。但在项目实际部署中发现:打包成的EXE程序无法正常启动SteamVR,或者SteamVR未能识别到该应用。本文将以“Unity OpenXR …...
使用 rebase 轻松管理主干分支
前言 最近遇到一个技术团队的 dev 环境分支错乱,因为是多人合作大家各自提交信息,导致出现很多交叉合并记录,让对应 log 看起来非常混乱,难以阅读。 举例说明 假设我们有一个项目,最初develop分支有 3 个提交记录&a…...
【愚公系列】《Python网络爬虫从入门到精通》063-项目实战电商数据侦探(主窗体的数据展示)
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
HttpSessionListener 的用法笔记250417
HttpSessionListener 的用法笔记250417 以下是关于 HttpSessionListener 的用法详解,涵盖核心方法、实现步骤、典型应用场景及注意事项,帮助您全面掌握会话(Session)生命周期的监听与管理: 1. 核心功能 HttpSessionLi…...
火山RTC 5 转推CDN 布局合成规则
实时音视频房间,转推CDN,文档: 转推直播--实时音视频-火山引擎 一、转推CDN 0、前提 * 在调用该接口前,你需要在[控制台](https://console.volcengine.com/rtc/workplaceRTC)开启转推直播功能。<br> * 调…...
Spark两种运行模式与部署
1. Spark 的运行模式 部署Spark集群就两种方式,单机模式与集群模式 单机模式就是为了方便开发者调试框架的运行环境。但是生产环境中,一般都是集群部署。 现在Spark目前支持的部署模式: (1)Local模式:在本地…...
react 父子组件通信 子 直接到父, 父 forwardref子
React核心概念:单向数据流(Unidirectional Data Flow) React 中数据的流动像瀑布一样,只能从上层组件(父组件)流向下层组件(子组件)。 子组件无法直接反向修改父组件的数据&#x…...
qt画一朵花
希望大家的生活都更加美好,画一朵花送给大家 效果图 void FloatingArrowPubshButton::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing);QPen pen;pen.setColor("green");pen.setWidth(5);QBrush…...
服务器上安装maven
1.安装 下载安装包 https://maven.apache.org/download.cgi 解压安装包 cd /opt/software tar -xzvf apache-maven-3.9.9-bin.tar.gz 安装目录(/opt/maven/) mv /opt/software/apache-maven-3.9.9 /opt/ 3.权限设置 把/opt/software/apache-maven-3.9.9 文件夹重命名为ma…...
UOS+N 卡 + CUDA 环境下 X86 架构 DeepSeek 基于 vLLM 部署与 Dify 平台搭建指南
一、文档说明 本文档是一份关于 DeepSeek 在X86架构下通vLLM工具部署的操作指南,主要面向需要在UOSN卡CUDA环境中部署DeepSeek的技术人员,旨在指导文档使用者完成从 Python 环境升级、vLLM 库安装、模型部署到 Dify 平台搭建的全流程操作。 二、安装Pyt…...
MySQL终章(8)JDBC
目录 1.前言 2.正文 2.1JDBC概念 2.2三种编码方式 2.2.1第一种 2.2.2第二种(优化版) 2.2.3第三种(更优化版) 3.小结 1.前言 哈喽大家好吖,今天来给大家带来Java中的JDBC的讲解,之前学习的都是操作…...
点云数据处理开源C++方案
一、主流开源库对比 库名称特点适用场景开源协议活跃度PCL功能最全,算法丰富科研、工业级应用BSD★★★★★Open3D现代API,支持Python绑定快速开发、深度学习MIT★★★★☆CGAL计算几何算法强大网格处理、高级几何运算GPL/LGPL★★★☆☆PDAL专注于点云…...
Python 爬虫如何伪装 Referer?从随机生成到动态匹配
一、Referer 的作用与重要性 Referer 是 HTTP 请求头中的一个字段,用于标识请求的来源页面。它在网站的正常运行中扮演着重要角色,例如用于统计流量来源、防止恶意链接等。然而,对于爬虫来说,Referer 也可能成为被识别为爬虫的关…...
【MySQL】表的约束(主键、唯一键、外键等约束类型详解)、表的设计
目录 1.数据库约束 1.1 约束类型 1.2 null约束 — not null 1.3 unique — 唯一约束 1.4 default — 设置默认值 1.5 primary key — 主键约束 自增主键 自增主键的局限性:经典面试问题(进阶问题) 1.6 foreign key — 外键约束 1.7…...
