写一个俄罗斯方块c++代码
时间: 2023-11-04 22:26:18 浏览: 47
好的,以下是一个简单的俄罗斯方块的C++代码,仅供参考:
```c++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
using namespace std;
const int WIDTH = 10; // 画布宽度
const int HEIGHT = 20; // 画布高度
// 俄罗斯方块类
class Tetromino {
public:
Tetromino(int type, int x = 0, int y = 0)
: type(type), x(x), y(y) {
// 初始化方块矩阵
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
matrix[i][j] = false;
}
}
switch (type) {
case 0: // I 形
matrix[1][0] = true;
matrix[1][1] = true;
matrix[1][2] = true;
matrix[1][3] = true;
break;
case 1: // J 形
matrix[0][0] = true;
matrix[1][0] = true;
matrix[1][1] = true;
matrix[1][2] = true;
break;
case 2: // L 形
matrix[0][2] = true;
matrix[1][0] = true;
matrix[1][1] = true;
matrix[1][2] = true;
break;
case 3: // O 形
matrix[0][0] = true;
matrix[0][1] = true;
matrix[1][0] = true;
matrix[1][1] = true;
break;
case 4: // S 形
matrix[0][1] = true;
matrix[0][2] = true;
matrix[1][0] = true;
matrix[1][1] = true;
break;
case 5: // T 形
matrix[0][1] = true;
matrix[1][0] = true;
matrix[1][1] = true;
matrix[1][2] = true;
break;
case 6: // Z 形
matrix[0][0] = true;
matrix[0][1] = true;
matrix[1][1] = true;
matrix[1][2] = true;
break;
}
}
// 获取方块矩阵
bool getMatrix(int row, int col) const {
return matrix[row][col];
}
// 获取方块类型
int getType() const {
return type;
}
// 获取方块位置
int getX() const {
return x;
}
int getY() const {
return y;
}
// 将方块向左移动
void moveLeft() {
x--;
}
// 将方块向右移动
void moveRight() {
x++;
}
// 将方块向下移动
void moveDown() {
y++;
}
// 将方块逆时针旋转
void rotate() {
bool temp[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
temp[i][j] = matrix[i][j];
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
matrix[i][j] = temp[j][3 - i];
}
}
}
private:
bool matrix[4][4]; // 方块矩阵
int type; // 方块类型
int x, y; // 方块位置
};
// 画布类
class Canvas {
public:
Canvas() {
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (j == 0 || j == WIDTH - 1 || i == HEIGHT - 1) {
data[i][j] = true;
} else {
data[i][j] = false;
}
}
}
}
// 判断方块是否可以放置
bool canPlace(const Tetromino& tetromino) const {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (tetromino.getMatrix(i, j)) {
int row = tetromino.getY() + i;
int col = tetromino.getX() + j;
if (data[row][col]) {
return false;
}
}
}
}
return true;
}
// 放置方块
void place(const Tetromino& tetromino) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (tetromino.getMatrix(i, j)) {
int row = tetromino.getY() + i;
int col = tetromino.getX() + j;
data[row][col] = true;
}
}
}
}
// 消除已满行
int clearFullRows() {
int count = 0;
for (int i = HEIGHT - 2; i > 0; i--) {
bool full = true;
for (int j = 1; j < WIDTH - 1; j++) {
if (!data[i][j]) {
full = false;
break;
}
}
if (full) {
count++;
for (int k = i; k > 0; k--) {
for (int j = 1; j < WIDTH - 1; j++) {
data[k][j] = data[k - 1][j];
}
}
i++;
}
}
return count;
}
// 输出画布
void print() const {
system("cls");
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (data[i][j]) {
cout << "#";
} else {
cout << " ";
}
}
cout << endl;
}
}
private:
bool data[HEIGHT][WIDTH]; // 画布数据
};
int main() {
srand(time(NULL)); // 初始化随机数种子
Canvas canvas; // 创建画布对象
Tetromino tetromino(rand() % 7); // 随机生成一个俄罗斯方块
int score = 0; // 分数
while (true) {
canvas.print(); // 输出画布
cout << "Score: " << score << endl;
if (!canvas.canPlace(tetromino)) { // 如果方块不能放置
canvas.place(tetromino); // 将方块放置到画布上
int count = canvas.clearFullRows(); // 消除已满行
score += count * 10; // 根据消除的行数计算分数
tetromino = Tetromino(rand() % 7); // 随机生成一个新的俄罗斯方块
if (!canvas.canPlace(tetromino)) { // 如果新的方块也不能放置
break; // 游戏结束
}
}
if (_kbhit()) { // 如果有按键输入
char ch = _getch();
if (ch == 'a') { // 将方块向左移动
Tetromino temp = tetromino;
temp.moveLeft();
if (canvas.canPlace(temp)) {
tetromino = temp;
}
} else if (ch == 'd') { // 将方块向右移动
Tetromino temp = tetromino;
temp.moveRight();
if (canvas.canPlace(temp)) {
tetromino = temp;
}
} else if (ch == 's') { // 将方块向下移动
Tetromino temp = tetromino;
temp.moveDown();
if (canvas.canPlace(temp)) {
tetromino = temp;
}
} else if (ch == 'w') { // 将方块逆时针旋转
Tetromino temp = tetromino;
temp.rotate();
if (canvas.canPlace(temp)) {
tetromino = temp;
}
}
}
tetromino.moveDown(); // 将方块向下移动
Sleep(100); // 等待一段时间
}
cout << "Game over! Your score is " << score << endl;
return 0;
}
```
这只是一个简单的俄罗斯方块游戏,如果你想要更加完整的游戏体验,可以尝试添加音效、计时、排行榜等功能。