使用c++编写一个俄罗斯方块游戏,要求实现好看的界面
时间: 2024-05-16 10:13:21 浏览: 123
要实现一个俄罗斯方块游戏,首先需要确定开发平台。如果想要实现好看的界面,建议使用图形界面库,如Qt或SFML。
下面是使用SFML库来实现俄罗斯方块游戏的示例代码:
#include <SFML/Graphics.hpp>
#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>
const int BLOCK_SIZE = 30; //方块的大小
const int BOARD_WIDTH = 10; //游戏面板的宽度
const int BOARD_HEIGHT = 20; //游戏面板的高度
class Block {
public:
Block(int x, int y, sf::Color color) {
m_x = x;
m_y = y;
m_color = color;
}
//获取坐标
int getX() const {
return m_x;
}
int getY() const {
return m_y;
}
//设置坐标
void setX(int x) {
m_x = x;
}
void setY(int y) {
m_y = y;
}
//设置颜色
void setColor(sf::Color color) {
m_color = color;
}
//绘制方块
void draw(sf::RenderWindow& window) {
sf::RectangleShape block(sf::Vector2f(BLOCK_SIZE, BLOCK_SIZE));
block.setPosition(m_x * BLOCK_SIZE, m_y * BLOCK_SIZE);
block.setFillColor(m_color);
window.draw(block);
}
private:
int m_x, m_y;
sf::Color m_color;
};
class Board {
public:
Board() {
m_blocks.resize(BOARD_WIDTH * BOARD_HEIGHT);
for (int i = 0; i < BOARD_HEIGHT; i++) {
for (int j = 0; j < BOARD_WIDTH; j++) {
m_blocks[i * BOARD_WIDTH + j] = sf::Color::White;
}
}
}
//获取块的颜色
sf::Color getBlockColor(int x, int y) const {
return m_blocks[y * BOARD_WIDTH + x];
}
//设置块的颜色
void setBlockColor(int x, int y, sf::Color color) {
m_blocks[y * BOARD_WIDTH + x] = color;
}
//检查行是否已满
bool isRowFull(int y) const {
for (int x = 0; x < BOARD_WIDTH; x++) {
if (getBlockColor(x, y) == sf::Color::White) {
return false;
}
}
return true;
}
//移除满行
void removeFullRows() {
int numRemoved = 0;
for (int y = BOARD_HEIGHT - 1; y >= 0; y--) {
if (isRowFull(y)) {
numRemoved++;
for (int i = y; i > 0; i--) {
for (int j = 0; j < BOARD_WIDTH; j++) {
setBlockColor(j, i, getBlockColor(j, i - 1));
}
}
for (int j = 0; j < BOARD_WIDTH; j++) {
setBlockColor(j, 0, sf::Color::White);
}
y++;
}
}
m_score += numRemoved * numRemoved * 100;
}
//检查方块是否可以移动
bool canMove(const std::vector<Block>& blocks, int dx, int dy) const {
for (int i = 0; i < blocks.size(); i++) {
int x = blocks[i].getX() + dx;
int y = blocks[i].getY() + dy;
if (x < 0 || x >= BOARD_WIDTH || y < 0 || y >= BOARD_HEIGHT) {
return false;
}
if (getBlockColor(x, y) != sf::Color::White) {
return false;
}
}
return true;
}
//在游戏面板中添加方块
void addBlocks(const std::vector<Block>& blocks) {
for (int i = 0; i < blocks.size(); i++) {
int x = blocks[i].getX();
int y = blocks[i].getY();
setBlockColor(x, y, blocks[i].getColor());
}
}
//获取得分
int getScore() const {
return m_score;
}
//绘制游戏面板
void draw(sf::RenderWindow& window) {
for (int i = 0; i < BOARD_HEIGHT; i++) {
for (int j = 0; j < BOARD_WIDTH; j++) {
sf::RectangleShape block(sf::Vector2f(BLOCK_SIZE, BLOCK_SIZE));
block.setPosition(j * BLOCK_SIZE, i * BLOCK_SIZE);
block.setFillColor(getBlockColor(j, i));
window.draw(block);
}
}
}
private:
std::vector<sf::Color> m_blocks;
int m_score = 0;
};
class Tetromino {
public:
Tetromino() {
//定义所有的方块形状
m_shapes.push_back({ {0, 0}, {0, 1}, {1, 0}, {1, 1} }); //O
m_shapes.push_back({ {-1, 0}, {0, 0}, {1, 0}, {2, 0} }); //I
m_shapes.push_back({ {0, 0}, {1, 0}, {1, 1}, {2, 1} }); //Z
m_shapes.push_back({ {0, 1}, {1, 1}, {1, 0}, {2, 0} }); //S
m_shapes.push_back({ {0, 0}, {1, 0}, {2, 0}, {1, 1} }); //T
m_shapes.push_back({ {0, 0}, {1, 0}, {2, 0}, {3, 0} }); //L
m_shapes.push_back({ {0, 0}, {1, 0}, {2, 0}, {2, 1} }); //J
//随机选择一个形状
std::srand(std::time(nullptr));
m_currentShape = m_shapes[std::rand() % m_shapes.size()];
//设置颜色
m_color = sf::Color::Red;
}
//获取方块的颜色
sf::Color getColor() const {
return m_color;
}
//获取方块坐标
std::vector<Block> getBlocks(int x, int y) const {
std::vector<Block> blocks;
for (int i = 0; i < m_currentShape.size(); i++) {
blocks.push_back(Block(m_currentShape[i].first + x, m_currentShape[i].second + y, m_color));
}
return blocks;
}
//旋转方块
void rotate() {
std::vector<std::pair<int, int>> newShape;
for (int i = 0; i < m_currentShape.size(); i++) {
int x = m_currentShape[i].first;
int y = m_currentShape[i].second;
newShape.push_back(std::make_pair(y, -x));
}
m_currentShape = newShape;
}
private:
std::vector<std::pair<int, int>> m_currentShape;
std::vector<std::vector<std::pair<int, int>>> m_shapes;
sf::Color m_color;
};
int main() {
//创建窗口
sf::RenderWindow window(sf::VideoMode(BLOCK_SIZE * BOARD_WIDTH, BLOCK_SIZE * BOARD_HEIGHT), "Tetris");
//创建游戏面板和方块
Board board;
Tetromino tetromino;
std::vector<Block> blocks = tetromino.getBlocks(BOARD_WIDTH / 2 - 2, 0);
//设置方块下落速度
sf::Clock clock;
float dropTime = 0.5f;
//游戏主循环
while (window.isOpen()) {
//处理事件
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
else if (event.type == sf::Event::KeyPressed) {
switch (event.key.code) {
case sf::Keyboard::Left:
if (board.canMove(blocks, -1, 0)) {
for (int i = 0; i < blocks.size(); i++) {
blocks[i].setX(blocks[i].getX() - 1);
}
}
break;
case sf::Keyboard::Right:
if (board.canMove(blocks, 1, 0)) {
for (int i = 0; i < blocks.size(); i++) {
blocks[i].setX(blocks[i].getX() + 1);
}
}
break;
case sf::Keyboard::Down:
if (board.canMove(blocks, 0, 1)) {
for (int i = 0; i < blocks.size(); i++) {
blocks[i].setY(blocks[i].getY() + 1);
}
}
break;
case sf::Keyboard::Up:
tetromino.rotate();
if (!board.canMove(blocks, 0, 0)) {
tetromino.rotate();
}
break;
}
}
}
//使方块自动下落
if (clock.getElapsedTime().asSeconds() > dropTime) {
if (board.canMove(blocks, 0, 1)) {
for (int i = 0; i < blocks.size(); i++) {
blocks[i].setY(blocks[i].getY() + 1);
}
}
else {
//如果方块无法下落,则将方块加入到游戏面板中
board.addBlocks(blocks);
board.removeFullRows();
//重新生成方块
tetromino = Tetromino();
blocks = tetromino.getBlocks(BOARD_WIDTH / 2 - 2, 0);
//检查游戏是否结束
if (!board.canMove(blocks, 0, 0)) {
std::cout << "Game over!" << std::endl;
window.close();
}
}
clock.restart();
}
//绘制游戏界面
window.clear();
board.draw(window);
for (int i = 0; i < blocks.size(); i++) {
blocks[i].draw(window);
}
window.display();
}
std::cout << "Score: " << board.getScore() << std::endl;
return 0;
}
由于SFML库的灵活性,你可以根据自己的需求来自定义游戏的界面和操作方式。
相关推荐
















