所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

C++俄罗斯方块控制台游戏代码|新手入门完整教程|附注释可运行源码

C++俄罗斯方块控制台游戏代码|新手入门完整教程|附注释可运行源码 一

文章目录CloseOpen

从零搭建开发环境:5分钟搞定准备工作

很多新手卡在第一步——环境配置。我见过有同学折腾编译器一下午,最后干脆放弃了项目。其实现在的工具已经很友好了,不管你用Windows、macOS还是Linux,5分钟就能搞定。

先说Windows系统,我最推荐用Dev-C++,官网(https://www.bloodshed.net/,已添加nofollow)就能下载,安装时记得勾选”MinGW编译器”,默认下一步就行。之前帮室友装的时候,他没选这个,结果写了代码编译不了,后来重新装才发现问题——你可别犯同样的错。装好后打开软件,新建”Console Application”,保存为”Tetris.cpp”,这就是你的游戏代码文件了。

如果用macOS或Linux,自带的GCC编译器就够用。打开终端,输入g++ version,如果显示版本号(比如”g++ (GCC) 11.2.0″)就说明已经有了;要是提示”command not found”,mac用户用brew install gcc,Linux用户用sudo apt install g++(Ubuntu/Debian)或sudo yum install gcc-c++(CentOS),我自己的Linux笔记本就是这么配的,全程不用点鼠标。

这里给你整理了不同系统的配置清单,照着做保准不出错:

系统 推荐编译器 安装命令/工具 验证方法
Windows MinGW (Dev-C++自带) 官网下载Dev-C++,勾选MinGW 编译时无”g++ not found”错误
macOS GCC 终端输入brew install gcc 终端输入g++ version显示版本
Linux GCC Ubuntu:sudo apt install g++ 终端输入g++ version显示版本

配置好后,先别急着写复杂代码,我 你写几行简单的测试代码:用cout输出”Hello Tetris!”,然后编译运行。如果能看到黑窗口里显示这句话,说明环境没问题——这步很重要,就像做饭前先确认燃气灶能点火,省得后面手忙脚乱。

手把手写核心代码:从方块”动”起来到完整游戏

环境搞定了,现在咱们来搭游戏的骨架。俄罗斯方块的核心就四个部分:显示游戏区域、控制方块移动旋转、检测碰撞和消除行、计分。我会按这个顺序带你写,每一步都告诉你”为什么这么做”,而不是只甩代码。

先画个游戏区域:用二维数组当”画布”

你肯定玩过俄罗斯方块,知道游戏区是个长方形,方块在里面落。在代码里,我们可以用一个二维数组来表示这个区域——比如int gameArea[20][10] = {0};,20行10列,刚好是经典俄罗斯方块的大小。数组里的0代表空格,1-7代表不同颜色的方块(后面可以用不同字符显示)。我之前试过用一维数组,发现处理行消除时要算下标,特别容易晕,后来改成二维数组,直接gameArea[row][col]操作,清爽多了。

显示区域的代码很简单,用两个嵌套循环遍历数组:遇到0就输出空格,遇到非0就输出”■”(或你喜欢的符号)。记得在最外层加个边框,比如上下用”±±”,左右用”|”,这样看起来更像游戏。你可以先写这段代码,编译运行后会看到一个黑色窗口里有个空的方框——这就是你的游戏舞台了。

让方块”活”起来:随机生成与移动控制

下一步是让方块动起来。首先得定义方块的形状,经典俄罗斯方块有7种基础形状(I、O、T、L、J、S、Z),每种形状可以用4×4的数组表示。比如I型方块可以写成{{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}},这样方便后续旋转。我 用枚举类型定义形状,比如enum Shape {I, O, T, L, J, S, Z};,这样代码可读性更高——别学我之前图省事用数字代替,后来改代码时根本记不清哪个数字对应哪个形状。

生成随机方块可以用rand()函数,但记得加#include srand(time(0))(放在main函数开头),不然每次运行方块顺序都一样。移动控制在控制台游戏里有点 tricky,Windows下可以用GetAsyncKeyState函数(需要#include ),它能检测键盘按键状态,比cin响应快得多。比如检测左键:if(GetAsyncKeyState(VK_LEFT) & 0x8000),这里的0x8000是判断按键是否按下,具体可以看微软官方文档(https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-getasynckeystate,已添加nofollow)。

移动时一定要做碰撞检测!比如方块往左移,要检查左边是不是已经到边界(列=0),或者左边格子已经有其他方块(gameArea[row][col-1] != 0)——我第一次没加检测,结果方块直接移出屏幕,当时还以为是数组越界了,查了半天才发现少了边界判断。这里教你个笨办法:移动前先假设能移,算出新位置,检查新位置是否合法,合法就更新坐标,不合法就不动。

消除行与计分:让游戏有”目标感”

方块落到底部后,就要检查有没有整行都填满的。遍历游戏区域的每一行,如果某一行所有列都不是0(gameArea[row][col] != 0对所有col成立),就把这一行消除——具体操作是把这行上面的所有行都往下移一行,最上面补一行0。我之前写这部分时,用了三重循环(行循环、列循环、下移循环),结果游戏有点卡,后来优化成先记录要消除的行数,再一次性下移,流畅多了。

计分规则可以简单点:消1行100分,2行300分,3行600分,4行1000分(经典规则)。用一个变量score记录,每次消除后更新,然后在游戏区域旁边显示。你还可以加个等级系统,比如每得2000分加快下落速度——用Sleep()函数控制下落间隔,等级越高Sleep时间越短,这样游戏难度会递增,玩起来更有挑战性。

最后把这些模块拼起来:在main函数里用一个大循环,每次循环先处理键盘输入(移动/旋转),再让方块自动下落,然后检测碰撞和消除,最后刷新显示。记得加个游戏结束条件——当新生成的方块一出现就和已有方块重叠(说明顶部被堆满了),就输出”Game Over! Score: XXX”。

代码写到这里,你已经有了一个能玩的俄罗斯方块了!编译运行后,用方向键控制,空格键加速下落,试试看能不能消个四行?我第一次成功消四行时,特意截了图发朋友圈,朋友都问我是不是偷偷学了游戏开发——其实就是把这些基础模块一点点拼起来的。

你可以试着给游戏加点小功能,比如按P键暂停,或者用不同颜色显示不同方块(控制台可以用SetConsoleTextAttribute函数改颜色)。如果遇到bug,别着急,把报错信息复制到搜索引擎里搜,大部分问题别人早就遇到过。要是改了半天还不行,也可以在评论区告诉我你卡在哪一步,我帮你看看。记得把代码保存好,以后面试时拿出这个小项目,比空谈”熟悉C++”有说服力多了——毕竟面试官更相信你亲手做过的东西,对吧?


你是不是也遇到过这种情况?写好了俄罗斯方块代码,一点编译就蹦出个“g++ not found”,黑窗口闪一下就没了,急得抓头发?我跟你说,十有八九是安装Dev-C++的时候漏了个关键步骤——没选那个叫“MinGW Compiler Suite”的编译器套件。之前我帮隔壁寝室的同学装软件,他就是一路“下一步”到底,结果编译的时候直接报错,后来我俩对着安装包重新来一遍,在组件选择那步停下来,盯着界面找了半天,才发现那个小方框根本没勾上。你要是也忘了勾,别慌,找到当初下载的Dev-C++安装包,双击重新运行,安装界面会弹出来,你仔细看,有个叫“MinGW Compiler Suite”的选项,前面的小方框一定要打上勾,然后继续下一步,装完重启Dev-C++,基本就能解决。

要是你确定当时勾选了编译器,还是提示找不到g++,那可能是软件没识别到编译器路径。这种情况也常见,特别是系统里装了多个版本的编译器时。你打开Dev-C++,顶部菜单栏有个“工具”,点进去找“编译选项”,再选“编译器设置”,里面有个“GCC程序”的路径设置,默认应该是“Dev-CppMinGW64bin”,你看看是不是这个路径,或者有没有被改成别的。我之前帮一个同学检查,他的路径不知怎么变成了“C:Program Files”,显然不对,改回默认路径后,编译一下就通了。实在记不住默认路径也没关系,你可以在电脑里搜“g++.exe”,找到它的位置,把路径复制进去也行,总之得让软件知道编译器在哪儿,它才能帮你把代码变成能玩的游戏呀。


在Windows系统中编译时提示“g++ not found”怎么办?

这通常是因为安装Dev-C++时没有勾选MinGW编译器。你可以重新运行安装程序,在组件选择界面确保“MinGW Compiler Suite”被勾选,安装完成后重启Dev-C++。如果已经安装,也可以在软件内通过“工具→编译选项→编译器设置”确认GCC路径是否正确,一般默认路径为“Dev-CppMinGW64bin”。

为什么按方向键控制方块时没有反应?

控制台游戏的键盘输入需要实时检测,文章中提到的GetAsyncKeyState函数是Windows系统下的解决方案,使用前需添加头文件#include 。如果没加这个头文件,按键检测会失效。 注意代码中是否在主循环里持续调用按键检测逻辑,单次检测可能导致响应不及时。macOS/Linux系统需要改用ncurses库(需额外安装),可以搜索“Linux C++ 控制台键盘输入”获取适配代码。

如何调整游戏的下落速度让难度更高或更低?

游戏的下落速度由方块自动下落的间隔控制,文章中提到用Sleep()函数实现(单位毫秒)。比如初始设置Sleep(500)表示每500毫秒下落一格,想加快速度可以改小这个值(如Sleep(300)),减慢则改大(如Sleep(800))。如果想实现随分数增加难度,可在计分逻辑后添加条件判断,例如“当分数超过2000分时,将Sleep值从500逐步减小到300”,具体数值可以根据自己的手感调整。

代码中的注释该怎么写才能方便后续修改功能?

按“模块功能+关键逻辑+参数说明”的结构写注释。比如定义游戏区域数组时,注释“// 游戏区域:20行10列,0=空格,1-7=不同方块”;移动方块的函数前注释“// 功能:尝试向左移动方块 参数:当前方块坐标 返回值:是否移动成功”。关键步骤(如下落检测、行消除)可以加“注意:”提示易错点,比如“// 注意:移动前需先检查新位置是否碰撞边界或已有方块”。我自己写代码时,会在每个大功能块(如显示、控制、计分)开头用“/ === 显示模块 === /”分隔,后续修改时能快速定位。

原文链接:https://www.mayiym.com/41582.html,转载请注明出处。
0
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录

微信扫一扫关注
如已关注,请回复“登录”二字获取验证码