ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

C++期末大作业轻松做:深海炸弹小游戏源码与调试全攻略

C++期末大作业轻松做:深海炸弹小游戏源码与调试全攻略 简介一款面向C初学者的深海炸弹小游戏期末大作业既能作为课程设计参考也能用于自学游戏开发基础。压缩包共79个文件主要类型包括cpp源文件、h头文件、exe可执行程序、docx实验报告及png运行截图整体约41.92MB目录结构清晰游戏代码、作业报告与应用程序分区存放便于按模块查阅。项目围绕一艘潜艇在深海环境中发射炸弹并击毁预设目标展开涵盖类的定义、对象交互、碰撞检测、爆炸效果与实时计分并涉及图形界面相关设计可帮助初学者打通面向对象编程和基础游戏逻辑积累项目调试经验。报告书完整呈现设计思路、技术实现与问题解决方案既能辅助理解代码也能作为实验报告写作范例。目前已有1168人学习下载适合准备期末作业或希望积累完整C项目经验的初学者。1. 期末要交C大作业深海炸弹小游戏为什么是初学者最稳的选题期末前两周讨论群里最常见的问题就是“c期末大作业有没有现成的源代码”。很多人下过俄罗斯方块、贪吃蛇、五子棋的源码包打开一看两三千行注释少、耦合高想删个功能都能删出一堆编译错误。深海炸弹小游戏是另一类东西它只用数组、结构体、循环、随机数、函数这些C基础语法就能写完代码体量基本稳定在三百到五百行能编译出独立的exe文件自带完整的项目报告书结构。你要交的是一份能跑、能讲、能现场演示的程序而不是一段让老师觉得是网上扒来的黑匣子。这篇就把这个方案从拆解到落地完整走一遍新手能照着复现熟手能看到哪些参数值得改。2. 把一个控制台小游戏拆成四个模块状态机、对象池、主循环、随机数网上能找到的c小游戏代码大多数是“一段代码从头写到尾”的写法变量散落在全局逻辑全堆在main里看起来短改起来全是暗坑。期末大作业和平时写着玩不一样你要在答辩现场解释清楚每一块干什么。所以第一个建议是把深海炸弹拆成四个独立模块每个模块对应一个明确的C语法点也对应报告书里的一节。2.1 游戏状态机没有状态机的控制台游戏改需求就是大翻车深海炸弹游戏至少要有四种状态主菜单、游戏中、暂停、游戏结束。用枚举把这些状态定下来再用一个变量记录当前状态主循环里按状态分发逻辑。enum GameState { MAIN_MENU, // 主菜单显示“按 Enter 开始游戏” PLAYING, // 游戏中接受方向键和空格 PAUSED, // 暂停按 P 继续 GAME_OVER // 游戏结束显示最终得分 }; GameState state MAIN_MENU; // 主循环骨架先读输入再按当前状态分发 bool running true; while (running) { char key readKey(); // 非阻塞读键盘 switch (state) { case MAIN_MENU: if (key \r) state PLAYING; // Enter 开始 break; case PLAYING: if (key p) state PAUSED; // 暂停 updateGame(); // 更新鱼、炸弹位置 renderGame(); // 重绘画面 break; case PAUSED: if (key p) state PLAYING; // 继续 break; case GAME_OVER: if (key \r) resetGame(); // 重开一局 break; } Sleep(50); // 控制循环节奏约 20 帧/秒 }这段代码的逻辑很直白整个程序只有一个循环所有分支都挂在状态变量上。好处你在答辩时能直接说出来——新增一个“暂停”只需要加一个枚举值和一个case分支不需要动任何游戏逻辑。很多初学者把暂停写成一个单独的死循环暂停期间后台的鱼还在游等你按P回来鱼已经撞到潜艇了这种翻车现场我见过太多次。参数说明Sleep(50)这里是节奏控制的核心。50毫秒对应约20次循环每秒对控制台游戏来说足够平滑。小于30毫秒的话控制台重绘跟不上画面会闪烁大于100毫秒按键响应明显变肉。2.2 游戏对象模型炸弹、鱼、潜艇全用结构体不要散装全局变量很多源码包里的鱼是fish_x、fish_y、fish_speed三个全局变量炸弹再来三个水雷再来三个游戏里的对象一多名字就变成了fish2_x、fish2_y这种灾难。深海炸弹这种规模不复杂用结构体加固定大小数组就够了。struct GameObject { int x, y; // 控制台坐标 int type; // 0炸弹 1鱼 2水雷 3潜艇 int speed; // 移动速度每帧移动几格 bool active; // 是否在场 }; // 对象池游戏内同时存在的对象不会超过这么多 GameObject objs[64]; void initLevel() { for (int i 0; i 64; i) { objs[i].active false; // 全部清场 } // 在 (40, 25) 生成潜艇屏幕中央偏下 objs[0] {40, 25, 3, 0, true}; // 生成第一波鱼类型1从左边往右游 objs[1] {2, 10, 1, 1, true}; objs[2] {60, 15, 1, 1, true}; }这里的逻辑要点是“对象池”思想固定64个槽位生成对象时在数组里找一个active false的空位填进去死亡时把active置为false而不是真的删除。对初学者来说这样做的好处是循环处理每个对象时不用管new和delete也就不会踩内存泄漏和悬垂指针的坑。C的面向对象在这个阶段不需要硬上结构体数组就是最简单的事务管理器。参数说明objs[64]这个上限是我试过的安全值。一局游戏里鱼的数量一般不超过8条炸弹不超过5颗水雷同时在场也就4个64的余量足够。上限越大每次遍历越慢控制台游戏虽然感觉不出来但答辩老师一句“为什么用64”你也要能答出“根据关卡峰值算的余量”。2.3 主循环三件事输入、更新、绘制顺序别反游戏主循环是这个程序的心脏。顺序必须是输入在前更新在中绘制在后。如果先更新再读输入你按的那一下键总会被延迟到下一帧手感就像角色“慢半拍”我管这个叫肉手感。void updateGame() { // 第一步读输入并作用到玩家身上 if (_kbhit()) { char key _getch(); if (key a || key 4) objs[0].x - 1; // 潜艇左移 if (key d || key 6) objs[0].x 1; // 潜艇右移 if (key ) spawnBomb(objs[0].x, objs[0].y - 1); // 空格投弹 } // 第二步让所有NPC自己动 for (int i 1; i 64; i) { if (objs[i].active objs[i].type 1) { // 鱼向左游 objs[i].x - objs[i].speed; } } // 第三步判断生死和得分 checkCollisionAndScore(); }这段的逻辑顺序值得细看玩家输入永远先于NPC移动生效投出的炸弹会从潜艇上方一格的位置出现然后在下一次循环里由碰撞检测接管。鱼统一向左游速度由obj.speed字段控制这条速度线会串到后面难度曲线那一节。参数说明_getch()是Windows下控制台读单字符的函数不带回显。方向键会被编码为两个字节的扫描码所以这里用了key 4和key 6代表左右方向键的第二字节判断这是从老的VC6时代一路传下来血泪经验记不住的话退而求其次用WASD或IJKL最省事。2.4 c随机数生成鱼的位置用mt19937别用rand()碰运气鱼要从屏幕左右两侧随机出现但出现位置不能太靠边否则玩家刚看到鱼就已经撞上了。控制台游戏的随机数看着简单实际是翻车重灾区。rand() % 70 5这种写法能用但rand()的低位随机性差同一盘里鱼经常扎堆从同一个位置钻出来观感极差。我用的是random标准库。#include random std::random_device rd; // 真随机种子 std::mt19937 gen(rd()); // 梅森旋转算法引擎 std::uniform_int_distributionint distX(5, 75); // 鱼在横坐标5到75间出现 std::uniform_int_distributionint distY(2, 18); // 鱼在屏幕上半部出现 int newFishX distX(gen); // 不占位的写法 int newFishY distY(gen);逻辑说明random_device取真实硬件熵作为种子mt19937把这个种子扩展成高质量伪随机序列uniform_int_distribution保证坐标落在你指定的区间是均匀的。三个对象各司其职这段代码要背下来C八股里关于随机数的问答基本都围绕“种子、引擎、分布”这三个概念。参数说明横坐标限制在5到75纵坐标限制在2到18。鱼只出现在屏幕上半部是因为下半部是潜艇的活动区如果鱼一出生就砸在潜艇头上玩家没有任何反应时间这就不是游戏而是运气测试了。这两个边界值你调到(10, 70)和(3, 15)也可以原则是给玩家留出至少2格的预测反应距离。3. 把源码跑成exe文件从MinGW到控制台窗口的完整落地路径代码写得再漂亮交作业时拿不出一个双击就能跑的exe文件也白搭。这一章讲从源码到exe的完整落地路径覆盖环境选择、编译参数、控制台刷新方式和分发现exe时最容易载的跟头。3.1 编译环境Dev-C官网的MinGW版就够VSCode也能跑网上搜“vscode配置c/c环境”会看到一长串配置c_cpp_properties.json和tasks.json的教程很多人还没开始写代码就倒在环境配置上了。我的建议很直接如果你只要交作业从dev c官网下载带MinGW的版本装完打开就能编译如果你以后还想做开发装VSCode和MinGW但日常编译直接用命令行不依赖插件。MinGW是Windows下的GCC移植版它提供的g命令和Linux上的GCC行为完全一致。装完之后把bin目录加到PATH环境变量里命令行验证一下g --version # 输出类似g (MinGW.org GCC Build-20200217) 6.3.0 # 能打印版本号就说明编译器可用参数说明这个步骤常见的问题是PATH没生效新开一个终端窗口再试。输出g: command not found说明路径没配对去检查MinGW的bin文件夹下到底有没有g.exe有些发行版的编译器单独装在mingw64/bin子目录里。3.2 一条命令出exeg编译参数逐个说明不要只点IDE的“运行”按钮那是编译链接一条龙但你看不到过滤了什么东西。用命令行编译你会得到这个项目最重要的一件东西一个自定义名字的exe文件。g main.cpp -o deep_sea_bomb.exe -stdc17 -static -static-libgcc -static-libstdc参数的含义从左到右拆解main.cpp是源代码文件如果你的代码拆成main.cpp和game.cpp两个文件就在这里都写上中间用空格隔开-o deep_sea_bomb.exe指定输出文件名不写-o默认生成a.exe-stdc17指定C标准版本mt19937这些特性C11以后就有用17是为了让if constexpr这类语法不报错最后三个-static参数是关键它们让编译器把运行库静态链接进exe这样目标机器上不需要装MinGW运行库也能跑。链接完成后dir看一眼文件列表你会看到一个几兆大小的deep_sea_bomb.exe这就是要交的成果物之一。如果没加-static这个exe在别的电脑上十有八九会报“缺少libgcc_s_seh-1.dll”之类的错。3.3 控制台刷新别用system(cls)当后悔药光标复位才是正解最初级的深海炸弹源码绘制部分几乎都是sytem(cls)加一堆printf。但system(cls)在循环里每帧调用控制台会严重闪烁原因是cls清除整个缓冲区再重建开销大而且刷屏逐行可见。更好的做法是只把光标移回左上角然后重绘整帧。#include windows.h void gotoxy(int x, int y) { COORD coord { (SHORT)x, (SHORT)y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } void renderGame() { gotoxy(0, 0); // 光标回到左上角整帧覆盖式重绘 for (int y 0; y 26; y) { for (int x 0; x 80; x) { // 按坐标决定画什么鱼画F炸弹画O潜艇画S空白画空格 char ch ; if (isFish(x, y)) ch F; if (isBomb(x, y)) ch O; if (isSub(x, y)) ch S; std::cout ch; } std::cout \n; } }逻辑说明gotoxy(0,0)把光标移动到控制台左上角然后用两层循环从(0,0)到(79,25)完整重画一帧。因为每帧都覆盖了整个80x26的字符区域旧画面残留问题就不存在了。注意isFish、isBomb这些函数内部遍历对象池比对坐标这种每帧全量查询在26行x80列的前提下完全扛得住。参数说明坐标范围80x26是和代码配套的窗口尺寸。如果控制台窗口默认大小不是这个程序启动第一件事应该是调用system(mode con cols80 lines26)把这个窗口锁死否则重绘区域和窗口尺寸不一致屏幕右边会留残影。3.4 exe文件的分发与运行缺DLL和乱码是两个经典坑源码在自己机器上编译出了exe文件但拷到室友电脑上双击提示“缺少libstdc-6.dll”或者跑起来中文全变乱码这两个问题几乎每个学期都能遇到。第一个问题的根源是编译器默认动态链接了MinGW的运行库而目标电脑上没有。解决办法就是上一节那条编译命令里加的-static -static-libgcc -static-libstdc三个静态链接参数加上这个exe就不再依赖任何MinGW的dll。如果已经编译完才发现没加重新编译一次就好代码一行都不用改。第二个问题的根源是控制台代码页。MinGW编译出的程序默认输出UTF-8字符但老版本Windows控制台默认用GBK代码页显示中文字符就变成了乱码。两条路解决在main开头调用SetConsoleOutputCP(CP_UTF8)或者干脆游戏内全部用英文界面——深海炸弹本来就只有PLAY/SCORE/QUIT这几个词我用英文界面彻底避开编码问题。4. 炸弹命中鱼的判定逻辑碰撞检测、难度曲线和三个必调参数深海炸弹这个游戏玩起来有没有意思百分之八十取决于碰撞判定准不准和难度曲线顺不顺。判定太宽松玩家乱按就能高分游戏没挑战判定太严格鱼和炸弹擦肩而过不爆挫败感极强。这里有一套从简到繁的判定方案按初学者能掌控的复杂度来。4.1 碰撞检测的三层简化包围盒判定到像素级修正控制台游戏里没有像素这个概念一个“对象”就占一个字符位置。所以碰撞判定的第一层是两个对象占据的字符位置重叠就算命中。最简单的是中心点距离判定。bool isHit(const GameObject a, const GameObject b) { // 曼哈顿距离不超过1就算碰撞允许上下左右和对角的紧贴 int dx abs(a.x - b.x); int dy abs(a.y - b.y); return dx 1 dy 1; } void checkCollisionAndScore() { for (int i 0; i 64; i) { if (!objs[i].active || objs[i].type ! 0) continue; // 只找炸弹 for (int j 0; j 64; j) { if (!objs[j].active || objs[j].type ! 1) continue; // 只找鱼 if (isHit(objs[i], objs[j])) { objs[i].active false; // 炸弹消失 objs[j].active false; // 鱼被打中消失 score 10; } } } }逻辑说明这段用两层循环遍历对象池外层找炸弹内层找鱼一旦命中双方都从场上清掉加十分。曼哈顿距离判定的意思是炸弹在(40, 10)鱼在(41, 10)横坐标差1纵坐标差0判定命中鱼在(41, 11)差值为(1,1)也命中这相当于允许8方向触碰判定比严格同格更宽容手感更“爽”。参数说明dx 1 dy 1这个阈值是可以调的。改dx 2 dy 1炸弹就能隔一格空炸适合给新手降低难度改成dx 0 dy 0必须严丝合缝这游戏会难到没法玩。我习惯用1和1这个组合既不需要玩家精准瞄准到同一格又不至于隔空取物。4.2 投弹的“提前量”朝鱼的前进方向偏一格命中率飙升鱼是向左游的你在鱼当前位置砸一颗炸弹等炸弹落下来鱼已经溜了。所以靠谱的投弹要带提前量顺着鱼的运动方向在鱼前方两格的位置计算下落。void spawnBomb(int fromX, int fromY) { // 在当前帧所有鱼的前方两格处标记预判点 int targetX fromX; bool hasTarget false; for (int i 0; i 64; i) { if (!objs[i].active || objs[i].type ! 1) continue; // 鱼向左游预判点在鱼的当前位置左边两格 int futureX objs[i].x - 2 * objs[i].speed; if (abs(futureX - fromX) 10) { // 鱼在潜艇附近10格以内 targetX futureX; hasTarget true; } } // 在预判点正上方生成炸弹让它直线下坠 if (hasTarget) { objs[nextFreeSlot()] {targetX, fromY - 1, 0, 1, true}; } }逻辑说明核心理念是“锁鱼”而不是“锁坐标”——炸弹的目标不是某个固定点而是鱼两帧之后会到达的位置。futureX这里用了当前位置 - 2 * 速度减号是因为鱼向左游如果你们改过鱼的移动方向这个符号要跟着反向。和距离潜艇10格以内的鱼才锁距离太远的鱼等炸弹落下去早跑出屏幕了锁了也是白锁。参数说明2 * objs[i].speed中的系数2是炸弹的下落帧数补偿。炸弹从屏幕上方落到潜艇高度大约需要2到3帧所以提前两帧的位移就是最小有效预判量。速度越快的鱼这个预判量线性放大游戏难度就体现在这个系数是否足够敏感。4.3 难度曲线三参数鱼的生成间隔、游速、炸弹数量深海炸弹能不能留住人玩取决于三条曲线鱼的生成密度是否随时间增加、鱼的游速是否分级提速、玩家是否有足够的炸弹补给。参数初始值每关增量调整效果生成间隔毫秒1200-100最短500间隔越小屏幕同时出现的鱼越多压力越大鱼游速格/帧11最快4速度越快投弹提前量越难算炸弹数量颗102每关补给数量越少玩家越不敢乱投策略性增强这三个参数我建议放进全局配置结构体里不要散写在各处。struct GameConfig { int spawnInterval 1200; // 鱼生成间隔毫秒 int fishSpeed 1; // 鱼移动速度格/帧 int maxBombs 10; // 本关最大炸弹数 int scorePerFish 10; // 每条鱼的基础分 }; GameConfig cfg;参数说明spawnInterval每次循环累加计时超过设定值就生成一条鱼并重置计时。调这组参数时记住一个原则——难度只能通过“减少反应时间”实现不能通过“增加运气成分”实现。如果不加鱼的速度只把生成间隔调到离谱的短满屏都是鱼玩家必死而把鱼的速度从1逐级提到2和3玩家可以通过预判保持胜率这是“难但能玩”和“难到不想玩”的分界线。4.4 得分与生命连击奖励是提升游戏性的零成本改动基础版计分只有一种打中鱼加10分潜艇被鱼撞到游戏结束。这个设计太单薄。我加了一个令所有初级玩家上头的机制连续命中不加10加“20、40、80”等比翻倍。int comboCount 0; // 连续命中次数 // 在命中判定成功时执行 comboCount; int gain 10 * comboCount; if (comboCount 3) gain 80; // 上限保护防止分数溢出 score gain;逻辑说明comboCount每次命中递增分数等于基础分乘以连击数。连续命中第三次时单次得分已经到80玩家会明显感觉到“手感来了”这个正反馈是游戏让人上头的关键。如果长时间没命中comboCount要重置为0我用的是一个简单策略每过5秒无命中就清零这个计时器也挂在update循环里。参数说明上限80是经过设计的取舍。如果不设上限连击100次后一条鱼加1000分游戏变成纯粹的数字膨胀表演答辩时容易被问“数值体系是怎么设计的”然后答不上来。设了上限你能解释这是为了避免单纯刷连击破坏平衡性。5. 交作业前必查的五个坑翻车现场逐条复盘这里整理的是我每年帮人调试这类c小游戏代码时遇到的高频翻车点每一条都是真实的运行现象、根因和解决方式。交作业前一天对着这份清单过一遍比自己乱试快得多。5.1 一按方向键画面就卡顿或者“跳两格”现象按一下方向键潜艇要么没反应要么一次移动两格还伴随画面明显延迟。原因_getch()读的是键盘缓冲如果上一帧按键没被及时清空下一帧循环会一次性把缓冲里的多个键读出来表现为“跳格”。另一个常见原因是Sleep被放在了_getch()之前导致按键输入排队积压。我见过最离谱的版本是在主循环里用了system(pause)按一次键弹一次“请按任意键继续”完全是黑匣子行为。解决输入读取要放在Sleep之前且每帧只用一个if(_kbhit())消费一次输入。如果你还想要“按住方向键持续移动”的效果用GetAsyncKeyState替代_getch()它对“按住”状态的判断是实时的不依赖键盘队列。5.2 鱼在屏幕里扎堆生成某一列鱼特别多现象多玩几局会发现鱼经常从同一个横坐标附近连续冒出来某一段区域的鱼密度明显高于其他区域。原因如果用rand() % 70 5生成位置且一直没有重新播种rand()的随机序列在短周期内会有明显的局部聚类现象。另外有些人的代码在每次生成前都调用srand(time(0))而time(0)的精度是秒级同一秒内多次生成会得到同一个“随机数”鱼自然扎堆。解决把播种放到程序最前面且只播种一次使用uniform_int_distribution来保证区间内均匀分布。如果测试时发现鱼的位置还是偏检查是不是用了固定的std::mt19937 gen(42)在调试——42是固定种子每次运行结果完全一致这只是调试手段交付前一定要换成random_device播种的版本。5.3 玩到一半程序闪退或者鱼“穿墙”后消失现象游戏进行到约三十秒时程序突然退出鱼到了屏幕边界后不消失而是继续跑坐标变成负值或者超过80。原因数组下标越界访问。最常见的位置是鱼游到x 0时判定是否出界的代码写成了if (objs[i].x 0)而不是if (objs[i].x 0)。鱼速度大于1时可能直接从x 1跳到x -1跳过你设的边界条件继续访问对象池里其他位置最后读到野内存。解决所有边界判定一律用和不给跳帧留空隙。另外在对象池遍历时循环上限用64而不是“当前对象数”如果一个对象的active为false还继续移动坐标就会失控。处理办法是在update函数开头加一行防御性代码if (!objs[i].active) continue;。5.4 exe文件拷到别的电脑上说“缺少DLL”或者被杀毒软件隔离现象自己机器上双击运行一切正常用U盘拷到教室演示电脑上弹出“缺少libgcc_s_seh-1.dll”或“缺少libstdc-6.dll”的报错有些时候Windows Defender直接弹窗拦截把exe文件当木马隔离了。原因动态链接了MinGW运行库而目标机器没有安装这些dll。杀毒软件误报则是因为MinGW的编译特征和某些已知恶意程序相似或者程序本身没经过签名。这个项目里没有任何网络行为和敏感调用误报比较常见于依赖全静态链接的exe文件因为压缩后入口行为简单容易触发启发式扫描。解决编译命令加上-static -static-libgcc -static-libstdc规避dll问题如果是静态链接后杀毒仍误报把exe文件加压缩包压缩能改变文件指纹大多数误报会消失。不要在杀毒软件添加排除目录实验室电脑一般没有修改杀毒设置的权限压缩包方案最稳。5.5 游戏里中文全部是乱码标题和按钮无法辨认现象源代码里明明写的是“深海炸弹”运行出来后成了“娴烽偢寮广”。原因源代码文件保存的是GBK编码MinGW编译时把它当成UTF-8处理或者反过来。VSCode默认UTF-8保存老版Dev-C默认ANSI中文编码跨编辑器打开就会错乱。控制台本身也在GBK和UTF-8两种代码页之间反复横跳。解决最不折腾的办法是全英文界面深海炸弹涉及的文字本来只有“PLAY”“SCORE”“QUIT”几个词。如果一定要中文显示统一方案是源代码文件保存为UTF-8代码开头SetConsoleOutputCP(CP_UTF8)并且给编译器传-finput-charsetUTF-8 -fexec-charsetUTF-8。注意这三处必须一致只改其中一处就会出现编译警告或乱码残留。6. 三个小改动让答辩成绩上一个台阶存档、音效、代码拆分游侠到能交能跑的程度只是及格。这一章讲三个改动每个改动不超过十行代码但能让答辩老师一眼看出你和“只会抄代码的人”的区别。另外给一套两分钟的演示话术照着练就能讲清楚。第一个改动是最高分存档。用ofstream把最高分写进文件下次游戏启动时读回来。这个改动直观地展示了你对文件流的掌握也让他人复现时能看到程序的“记忆”。注意存档文件路径用相对路径别写到绝对路径否则换个环境就找不到文件了。#include fstream int loadHighScore() { std::ifstream in(highscore.dat); int hs 0; if (in) in hs; return hs; } void saveHighScore(int score) { std::ofstream out(highscore.dat); out score; }第二个改动是加音效。Windows的Beep函数一行代码就能鸣响投弹时高频短音炸中鱼时中频长音非常简单也讨喜。注意要加windows.h头文件且Beep是阻塞的调用时音量不要设太高否则连续命中时声音会卡。第三个改动是把源码拆成三个文件。main.cpp只负责主循环和状态流转game.cpp写逻辑函数game.h做函数声明和结构体定义。拆完文件的工程一眼看上去就不是“期末速成”的体量报告书也能顺理成章地分成“模块设计”和“接口说明”两章来写。演示话术建议这样说先开游戏玩三十秒让老师看到鱼和炸弹的交互然后切到代码先讲GameState枚举和主循环再讲isHit碰撞判定最后讲难度参数表收尾时强调一句“我把这些参数调成配置项就是为了演示各种难度”。别去背c八股直接指着你改的那三个参数说清楚改前改后的手感差异这就是最好的答辩。以上这些技巧我没有一次就全做对的。第一次写完深海炸弹交上去最高分存不进文件查半天发现存档路径写的是绝对路径换个目录就崩。从那时起我养成了习惯哪怕是个期末小游戏配置项都收进结构体、路径都用相对路径、边界判定都用大等于和小等于。这套习惯用到工作以后还在帮我省时间。希望这些踩坑记录和参数调整思路能帮到正在为c期末大作业发愁的你。本文还有配套的精品资源点击获取
返回列表