基于控制台的小车导航游戏开发详解(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 游戏规则 玩家可创建多辆具有不同初始位置和移动速度的小车 每辆…...
详讲Linux下进程等待
3.进程等待 引言:什么是进程等待 想象有两个小伙伴,一个是 “大强”(父进程 ),一个是 “小强”(子进程 )。大强给小强安排了任务,比如去收集一些石头。 …...
数字孪生火星探测车,星际探索可视化
运用图扑构建数字孪生火星探测车,高精度还原外观与内部构造。实时映射探测车在火星表面的移动、探测作业及设备状态,助力科研人员远程监测、分析数据,为火星探索任务提供可视化决策支持。...
《JVM考古现场(二十三):归零者·重启奇点的终极奥义》
目录 楔子:归零者文明觉醒 上卷十维弦理论破译 第一章:JVM弦论代码考古 第二章:超膜引用解析算法 第三章:量子真空涨落监控 中卷归零者心法实战 第四章:宇宙重启倒计时引擎 第五章:内存奇点锻造术 第…...
设计测试用例模板
面试时问你一个场景,要你设计测试用例,你会怎么回答? 面试官让你设计一个功能的测试用例,比如“上传文件功能”,其实就是想考你: 思维是否全面能不能抓住重点会不会分类和使用测试方法有没有考虑异常情况…...
java怎么找bug?Arthas原理与实战指南
Arthas原理与实战指南 1. Arthas简介 Arthas是阿里巴巴开源的Java诊断工具,其名字取自《魔兽世界》的人物阿尔萨斯。它面向线上问题定位,被广泛应用于性能分析、定位问题、安全审计等场景。Arthas的核心价值在于它能够在不修改应用代码、不重启Java进程…...
2024年国考
数学 一,逻辑符号表示(3 分) 1,只有获得奥运会资格的运动员才可以参加奥运会,参加奥运会的云动员不一定获奖。 设: ( Q(x) ):运动员 ( x ) 获得奥运会资格( P(x) ):运动员 ( x )…...
fastlio用mid360录制的bag包离线建图,提示消息类型错误
我用mid360录制的bag包,激光雷达的数据类型是sensor_msgs::PointCloud2,但是运行fast_lio中的mid360 launch文件,会报错(没截图),显示无法从livox_ros_driver2::CustomMsg转换到sensor_msgs::PointCloud2。…...
015-C语言字符函数和字符串函数
C语言字符函数和字符串函数 文章目录 C语言字符函数和字符串函数1. 字符分类函数2. 字符转换函数3. strlen4. strcpy5. strcat6. strcmp7. strncpy8. strncat9. strncmp10. strstr11. strtok12. strerror 1. 字符分类函数 C语言中有一系列函数是专门做字符分类的,也…...
docker 搭建nacos 2.2.1版本单机版
通过docker-compose搭建 services:nacos:image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v2.2.1container_name: nacosenvironment:- PREFER_HOST_MODEhostname- MODEstandalone- NACOS_AUTH_ENABLEtrue- NACOS_AUTH_IDENTITY_KEYxiaogang- N…...
stack,queue和priority_queue
1. stack 1.1 stack 的介绍 栈是一种容器适配器,专门设计用于LIFO环境(后进先出),其中元素仅从容器的一端插入和提取。 容器适配器,也就是使用特定容器类的封装对象作为其底层容器,提供一组特定的成员函…...
服务治理-搭建Nacos注册中心
运行nacos.sql文件。 将准备好的nacos目录和nacos.tar包上传。 192.168.59.101是我的虚拟机ip,8848是我们设置的访问端口号。...
《Operating System Concepts》阅读笔记:p738-p747
《Operating System Concepts》学习第 63 天,p738-p747 总结,总计 10 页。 一、技术总结 1.network structure local-area networks (LAN)、wide-area networks (WAN). 2.communication structure naming and name resolution、communication proto…...
【Datawhale AI春训营】Java选手初探数据竞赛
自然语言处理基础: 自然语言处理(Natural Language Processing,NLP) 是计算机科学与人工智能领域中的一个极具挑战性和应用前景的研究方向。 它旨在使计算机能够理解、生成和处理人类的自然语言,从而实现人机高效交互。 NLP技术在搜索引擎、…...
React-useRef
如果我们想在hooks里面获同步取最新的值,那么则可以使用useRef, 关键源码如下: function mountRef<T>(initialValue: T): {|current: T|} {const hook mountWorkInProgressHook();const ref {current: initialValue};hook.memoizedState ref;re…...
得物官网sign签名逆向分析
打开得物官网,点击鞋类,可以看到请求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…...
网络爬虫和前端相关知识
一 爬虫发展历史,概念与反爬机制 (一)爬虫发展历史 早期爬虫(1990s)起源 :早期的爬虫主要是为了构建搜索引擎。典型案例: Yahoo!人工目录 → 谷歌PageRank算法驱动的自动化爬虫。功能特点 :这些爬虫的功能比较单一,主要以抓取网页的文本内容为主,采用简单的广度优先…...
山东科技大学人工智能原理考试回忆复习资料
全部资料:https://mbd.pub/o/around_01 考试回忆版 简答题 人工智能定义 图灵测试基本思想 人工智能主要研究领域写八个以上 专家系统是什么及其特点 遗传算法流程图 综合题 语义网络表示 书上习题 证明S不满足性 用归结原理求问题 谁说真话假话的 书上例题…...
单元测试的一般步骤
Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架,用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试;现问如何使用Qt进行单元测试&…...
c++题目_P1443 马的遍历
P1443 马的遍历 # P1443 马的遍历 ## 题目描述 有一个 $n \times m$ 的棋盘,在某个点 $(x, y)$ 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。 ## 输入格式 输入只有一行四个整数,分别为 $n, m, x, y$。 ## 输出格式 …...
并发网路通信-套接字通信
套接字通信就是网络通信 在网络通信时,客户端和服务器的比例是N:1 服务器如何处理多个客户端的请求 并发处理方式 1.多线程并发处理->线程池并发处理,线程池可以对多个线程进行管理 2.多进程->进程池 3.io多路转接,使用select或者epoch进行处理,使用io转接函数…...
STM32N6如何调试下载代码
关键词:STM32N6、调试代码、开发者模式、外部Flash模式 文章目录 前言一、开发者模式调试1.1 CubeIDE调试1.2 IAR调试 二、如何下载代码(外部FLASH模式)2.1 准备工作2.2 编译下载2.2.1 Appli编译头文件下载2.2.2 FSBL编译头文件下载 2.3 运行…...
【2025】Datawhale AI春训营-蛋白质预测(AI+生命科学)-Task2笔记
【2025】Datawhale AI春训营-蛋白质预测(AI生命科学)-Task2笔记 本文对Task2使用的代码进行理解。 任务描述 Task2的任务仍然是通过对反应中包含的蛋白质残基信息,运用深度学习模型构建蛋白质3D结构的隐式模型,从而达成准确预测…...
Python基于知识图谱的医疗问答系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
Unreal 从入门到进阶 之 如何实现Pixel Streaming
文章目录 前言核心概念工作原理主要应用场景Pixel Streaming和Pixel Streaming2部署准备编辑器推流打包推流最后前言 Unreal Engine 5 (UE5) 的 Pixel Streaming 是一项基于云端的实时流媒体技术,允许将 UE5 应用的高质量图形渲染结果通过 WebRTC 协议传输到用户的浏览器或轻…...
作业2 CNN实现手写数字识别
# 导入必要库 import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 用于高级可视化 from tensorflow import keras from tensorflow.keras import layers from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay import time # 用于…...
Linux驱动开发--阻塞、非阻塞I/O
2. 阻塞、非阻塞I/O IO 指的是 Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将应用程序对应的线程挂起,直到…...
运筹学之模拟退火
目录 一、历史二、精髓思想三、案例与代码实现 一、历史 问:谁在什么时候提出模拟退火?答:模拟退火算法(Simulated Annealing,SA)是由斯图尔特柯尔斯基(Scott Kirkpatrick) 等人在 …...
JavaScript 的演变:2023-2025 年的新特性解析
随着Web技术的飞速发展,ECMAScript(简称ES)作为JavaScript的语言标准,也在不断进化。 本文将带你学习 ECMAScript 2023-2025 的新特性。 一、ECMAScript 2023 新特性 1.1 数组的扩展 Array.prototype.findLast()/Array.protot…...
CSS继承
CSS继承 CSS继承是一种机制,允许子元素自动继承父元素的某些样式属性,从而减少重复代码。 以下是一些常见的具有继承性的CSS属性: color : 文字颜色 font-family : 字体族名称 font-size : 字体大小 font-weight &am…...
游戏引擎学习第236天:GPU 概念概述
回顾并展望通过视频采集卡进行流媒体传输的未来 昨天,我们迈出了大胆的一步,决定初始化硬件的 3D 加速,因为我有点厌倦了我们的游戏没有垂直同步(vsync)。如今,在 Windows 上,我找不到一种可靠…...
HFSS3(limy)——建模学习记录
前言——笔者使用的是21版HFSS 1.基本模型 为什么没有环形的天线 2.创建基本模型方法 常用:先粗略建好模型再编辑输入准确坐标和大小尺寸(这里长方体起始点是左上角下方的点,也就是说要输入模型起点相对于坐标原点的位置尺寸就可以确定具体…...
php实现zip压缩
可以使用ZipArchive类来创建ZIP压缩文件。ZipArchive是PHP内置的一个类,提供了创建、打开、读取、写入和关闭ZIP文件的功能。 示例:压缩单个文件 <?php$fileToZip path/to/your/file.txt; $zipFileName compressed.zip;$zip new ZipArchive(); …...
【STM32单片机】#10 USART串口通信
主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 实验&…...
goc命令大全
颜色0黑1红2蓝3浅绿4浅蓝5淡黄6棕7深蓝8灰9粉10深绿11紫12蓝绿13黄14橙15白 绘图命令功能pen笔.fd()前进.rt()右转.c()颜色.up()抬笔.o(,)圆.e(,)椭圆.r(,,)长方形.picL(,)调图片.text(,,)文字.hide()隐藏.moveTo(,)移动wait();等待.soundL()调声音pause();暂停 绘图命令功能…...
Linux | 软件仓库管理
一. 软件包 1.1 软件包的分类 DEB:主要用于基于 Debian 的系统,如 Ubuntu。这种软件包格式具有良好的依赖管理机制,方便用户安装、升级和卸载软件。RPM:广泛应用于 Red Hat、CentOS、Fedora 等系统。RPM 包将软件打包成一个文件…...
Python实现对目标Word文档进行自动化排版【4万字精讲】(14)
前言 本文是该专栏的第14篇,后面会持续分享Python办公自动化干货知识,记得关注。 注意:本文涵盖4万字以及实战操作代码的精讲攻略,带你轻松掌握一键式“文档自动化排版”程序功能。 如果说当你在工作项目中,遇到这样的需求,需要如何处理——假设,现在有大批量的docx格…...
LeetCode每日一题4.19
2563. 统计公平数对的数目 题目 问题分析 输入:一个整数数组 nums 和两个整数 lower 和 upper。 输出:返回满足条件的公平数对的数目,即对于所有 0 < i < j < n,lower < nums[i] nums[j] < upper 的数对 (i, j)…...
Spring AI 开发 - 快速入门
先看效果 项目搭建 Spring AI 是 Spring 推出的一个项目,目标是提供统一的API抽象层,屏蔽不同AI模型和服务的底层差异,实现跨平台兼容性。 演示使用的模型是阿里的 qwq-32b。 环境要求: JDK :17以上(包括…...
leetcode哈希表(六)-三数相加
题目 15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复…...
Photoshop安装与配置--简单攻略版
下载地址:Photoshop软件工具下载 安装完成后,即可运行Photoshop.exe;打开工具页面后,按照下面简单配置即可 1.编辑-》首选项-》常规 或者直接快捷键CtrlK 暂存盘:一定要设置为非C盘 2.性能 3.文件处理 以上配置比较基础…...
一个 CTO 的深度思考
今天和一些同事聊了一会,以下是我的观点 我的观点,成年人只能筛选,不能培养在组织中,应该永远向有结果的人看齐。不能当他站出来讲话的时候,大家还要讨论讨论,他虽然拿到结果了,但是他就是有一…...
Java:使用Maven构建项目无src解决方案
创建箭头所指的包和类以及yml文件: 类中: package com.itheima;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class BigEventApplication …...
Git 命令速查手册
听说用美图可以钓读者? 一、基础操作核心命令 1. 仓库初始化与克隆 命令作用示例git init创建新仓库git init my-projectgit clone克隆远程仓库git clone [https://github.com/user/repo.git](https://github.com/user/repo.git)git remote add关联远程仓库git re…...
office软件中word里面的编号库和列表库功能
在Microsoft Word中,编号库和列表库是两大核心排版工具,分别服务于不同层级的文档结构化需求。以下从功能定义、核心差异、应用场景及操作技巧等维度进行详细解析: 一、编号库(Numbering Library) 1. 定义与功能 编号库是Word中预设或用户自定义的有序列表格式集合,用于…...
C++入门七式——模板初阶
目录 函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 模板参数的匹配原则 类模板 类模板的定义格式 类模板的显式实例化 当面对下面的代码时,大家会不会有一种无力的感觉?明明这些代码差不多,只是因为类型不…...
Python+Selenium+Pytest+POM自动化测试框架封装(完整版)
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、测试框架简介 1)测试框架的优点 代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一…...
matlab 处理海洋数据并画图的工具包--ocean_data_tools
matlab 处理海洋数据并画图的工具包–ocean_data_tools matlab 处理海洋数据并画图的工具包–ocean_data_tools ocean_data_tools 简化了提取、格式化和可视化免费可用的海洋学数据的过程。虽然可以在线访问大量海洋学数据,但由于获取这些数据并将其格式化为可用数据…...
软件开发指南——GUI 开发方案推荐
1. LVGL (Light and Versatile Graphics Library) 适用场景:嵌入式设备、资源受限环境 优势: 专为嵌入式设计的开源 GUI 库,内存占用极小(最低仅需 64KB RAM)支持触摸屏、硬件加速(如 STM32 的 LTDC&…...
JDK8 HashMap的实现原理
一 HashMap底层存储结构 HashMap底层结构采用(数组)(链表 or 红黑树)的形式来存储节点。 首先HashMap是一个数组,而且数组里面每个位置可以放入多个元素,形象一点,咱们把数组的这些个位置称为桶…...