C++ 控制台俄罗斯方块:无需图形库
是的,C++ 可以实现俄罗斯方块游戏而不依赖图形库。你可以使用控制台窗口来显示游戏界面和方块,并使用键盘输入来控制方块的移动和旋转。
以下是一个简单的 C++ 代码示例,实现了基本的俄罗斯方块游戏逻辑:
#include <iostream>
#include <vector>
#include <conio.h> // 用于接收键盘输入
using namespace std;
const int WIDTH = 10;
const int HEIGHT = 20;
vector<vector<int>> board(HEIGHT, vector<int>(WIDTH, 0)); // 游戏区域
vector<vector<int>> currentPiece; // 当前方块
int currentX, currentY; // 当前方块的位置
// 初始化方块
void initPiece() {
currentPiece = {{1, 1, 1, 1}};
currentX = WIDTH / 2 - 2;
currentY = 0;
}
// 检查方块是否与游戏区域发生碰撞
bool checkCollision() {
for (int i = 0; i < currentPiece.size(); i++) {
for (int j = 0; j < currentPiece[i].size(); j++) {
if (currentPiece[i][j] != 0 && (currentY + i >= HEIGHT || currentX + j < 0 || currentX + j >= WIDTH || board[currentY + i][currentX + j] != 0)) {
return true; // 发生碰撞
}
}
}
return false; // 未发生碰撞
}
// 旋转方块
void rotatePiece() {
vector<vector<int>> newPiece(currentPiece[0].size(), vector<int>(currentPiece.size()));
for (int i = 0; i < currentPiece.size(); i++) {
for (int j = 0; j < currentPiece[i].size(); j++) {
newPiece[j][currentPiece.size() - i - 1] = currentPiece[i][j];
}
}
currentPiece = newPiece;
}
// 更新游戏区域
void updateBoard() {
for (int i = 0; i < currentPiece.size(); i++) {
for (int j = 0; j < currentPiece[i].size(); j++) {
if (currentPiece[i][j] != 0) {
board[currentY + i][currentX + j] = currentPiece[i][j];
}
}
}
}
// 清除满行
void clearLines() {
for (int i = HEIGHT - 1; i >= 0; i--) {
bool isFull = true;
for (int j = 0; j < WIDTH; j++) {
if (board[i][j] == 0) {
isFull = false;
break;
}
}
if (isFull) {
for (int k = i; k > 0; k--) {
board[k] = board[k - 1];
}
board[0] = vector<int>(WIDTH, 0);
}
}
}
// 绘制游戏界面
void draw() {
system("cls"); // 清屏
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (board[i][j] != 0) {
cout << '■';
} else {
cout << ' ';
}
}
cout << endl;
}
}
int main() {
initPiece();
while (true) {
draw();
if (checkCollision()) {
updateBoard();
clearLines();
initPiece();
}
if (_kbhit()) {
char ch = _getch();
if (ch == 'a' && currentX > 0) {
currentX--;
} else if (ch == 'd' && currentX < WIDTH - currentPiece[0].size()) {
currentX++;
} else if (ch == 's' && currentY < HEIGHT - currentPiece.size()) {
currentY++;
} else if (ch == 'w') {
rotatePiece();
if (checkCollision()) {
rotatePiece(); // 旋转回原来的状态
}
}
}
currentY++;
if (checkCollision()) {
currentY--;
}
}
return 0;
}
这段代码使用二维向量来表示游戏区域和方块,通过不断更新和绘制游戏区域,实现了简单的俄罗斯方块游戏逻辑。你可以通过控制台窗口的输出来显示游戏界面和方块,通过键盘输入来控制方块的移动和旋转。
请注意,这只是一个简单的示例,可能还有一些功能和细节需要完善。你可以根据自己的需求和想法进行修改和扩展。
原文地址: https://www.cveoy.top/t/topic/mXh2 著作权归作者所有。请勿转载和采集!