用C++实现2048游戏时多位数破坏棋盘边框如何解决
问题本质
你当前的实现中,每个棋盘网格仅预留了1个字符的展示空间,当插入2位及以上的数字时,多出来的字符会挤占后续边框的位置,最终导致整个棋盘布局错乱。
解决思路
统一给所有数字单元格设置固定宽度,2048游戏的常规最大数字为2048(4位),我们给每个单元格预留4字符的固定宽度即可,所有内容输出时都占相同宽度,就不会打乱边框位置。
同时不建议用二维数组预存整个棋盘的每个字符,改为单独存储4*4的游戏数值,渲染时动态生成边框,维护效率更高。
修改后的示例代码
#include <iostream> #include <iomanip> using namespace std; int main() { // 存4*4的游戏数值,0代表空格 int board[4][4] = {0}; // 测试填入不同位数的数字 board[0][2] = 128; board[1][3] = 2048; board[2][1] = 32; board[3][0] = 2; // 渲染棋盘 int cell_width = 4; // 每个单元格固定4位宽度 for (int i = 0; i < 4; ++i) { // 打印上边框 for (int j = 0; j < 4; ++j) { cout << "+"; for (int k = 0; k < cell_width; ++k) cout << "-"; } cout << "+" << endl; // 打印数字行 for (int j = 0; j < 4; ++j) { cout << "|"; if (board[i][j] == 0) { cout << setw(cell_width) << " "; // 空单元格输出空格,占固定宽度 } else { cout << setw(cell_width) << board[i][j]; // 数字输出占固定宽度 } } cout << "|" << endl; } // 打印最底部边框 for (int j = 0; j < 4; ++j) { cout << "+"; for (int k = 0; k < cell_width; ++k) cout << "-"; } cout << "+" << endl; return 0; }
关键修改说明
- 引入
<iomanip>头文件的setw方法,强制每个单元格内容输出时占固定的4字符宽度,不管数字是1位还是4位都不会挤占其他位置 - 改用4*4的数值数组存储游戏数据,和渲染逻辑分离,后续做数字移动、合并、随机生成新数字的逻辑也会更简单
- 边框动态生成,位置完全和单元格宽度绑定,不会出现错位问题
内容的提问来源于stack exchange,提问作者Yanbo Liu
相关产品推荐
相关产品推荐

