运用C++俄罗斯方块代码(带背景音乐)在vs环境下
时间: 2023-12-24 11:05:23 浏览: 87
VC++带音乐功能的俄罗斯方块
以下是在 Visual Studio 环境下运行的 C++ 俄罗斯方块代码,其中包含背景音乐。
```c++
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib") // 引入 Windows 多媒体库
using namespace std;
const int WIDTH = 10; // 游戏区域宽度
const int HEIGHT = 20; // 游戏区域高度
const int BLOCK_SIZE = 4; // 方块大小
const int SCREEN_WIDTH = 60; // 游戏画面宽度
const int SCREEN_HEIGHT = 25; // 游戏画面高度
int field[HEIGHT][WIDTH] = { 0 }; // 游戏区域
int block[BLOCK_SIZE][BLOCK_SIZE] = { 0 }; // 当前方块
int block_x, block_y; // 当前方块位置
int block_type, block_rotation; // 当前方块类型和旋转状态
int score = 0; // 得分
bool game_over = false; // 游戏是否结束
bool need_new_block = true; // 是否需要生成新方块
// 方块类型
enum BLOCK_TYPE {
I_BLOCK, O_BLOCK, S_BLOCK, Z_BLOCK, J_BLOCK, L_BLOCK, T_BLOCK
};
// 方块形状
const int block_shapes[7][4][4] = {
{ { 0,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } }, // I型
{ { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, // O型
{ { 0,1,1,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, // S型
{ { 1,1,0,0 },{ 0,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, // Z型
{ { 1,1,1,0 },{ 0,0,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, // J型
{ { 1,1,1,0 },{ 1,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, // L型
{ { 1,1,1,0 },{ 0,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, // T型
};
// 播放背景音乐
void play_bgm() {
PlaySound(TEXT("bgm.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
}
// 生成新方块
void new_block() {
block_type = rand() % 7;
block_rotation = rand() % 4;
block_x = WIDTH / 2 - 2;
block_y = 0;
for (int i = 0; i < BLOCK_SIZE; i++) {
for (int j = 0; j < BLOCK_SIZE; j++) {
block[i][j] = block_shapes[block_type][block_rotation][i * BLOCK_SIZE + j];
}
}
need_new_block = false;
}
// 画方块
void draw_block(int x, int y, int type, int rotation) {
for (int i = 0; i < BLOCK_SIZE; i++) {
for (int j = 0; j < BLOCK_SIZE; j++) {
if (block_shapes[type][rotation][i * BLOCK_SIZE + j]) {
gotoxy(x + j, y + i);
cout << "■";
}
}
}
}
// 擦除方块
void erase_block(int x, int y, int type, int rotation) {
for (int i = 0; i < BLOCK_SIZE; i++) {
for (int j = 0; j < BLOCK_SIZE; j++) {
if (block_shapes[type][rotation][i * BLOCK_SIZE + j]) {
gotoxy(x + j, y + i);
cout << " ";
}
}
}
}
// 画游戏区域
void draw_field() {
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
gotoxy(j, i);
if (field[i][j] == 1) {
cout << "■";
}
else {
cout << " ";
}
}
}
}
// 更新游戏区域
void update_field() {
for (int i = 0; i < BLOCK_SIZE; i++) {
for (int j = 0; j < BLOCK_SIZE; j++) {
if (block[i][j]) {
field[block_y + i][block_x + j] = 1;
}
}
}
// 消除行
for (int i = HEIGHT - 1; i >= 0; i--) {
int count = 0;
for (int j = 0; j < WIDTH; j++) {
if (field[i][j]) {
count++;
}
}
if (count == WIDTH) {
score += 10;
for (int k = i; k > 0; k--) {
for (int j = 0; j < WIDTH; j++) {
field[k][j] = field[k - 1][j];
}
}
i++;
}
}
}
// 判断是否碰撞
bool check_collision(int x, int y, int type, int rotation) {
for (int i = 0; i < BLOCK_SIZE; i++) {
for (int j = 0; j < BLOCK_SIZE; j++) {
if (block_shapes[type][rotation][i * BLOCK_SIZE + j]) {
if (y + i >= HEIGHT || x + j < 0 || x + j >= WIDTH || field[y + i][x + j]) {
return true;
}
}
}
}
return false;
}
// 旋转方块
void rotate_block() {
int new_rotation = (block_rotation + 1) % 4;
if (!check_collision(block_x, block_y, block_type, new_rotation)) {
erase_block(block_x, block_y, block_type, block_rotation);
block_rotation = new_rotation;
draw_block(block_x, block_y, block_type, block_rotation);
}
}
// 移动方块
void move_block(int dx, int dy) {
if (!check_collision(block_x + dx, block_y + dy, block_type, block_rotation)) {
erase_block(block_x, block_y, block_type, block_rotation);
block_x += dx;
block_y += dy;
draw_block(block_x, block_y, block_type, block_rotation);
}
else if (dy > 0) {
update_field();
need_new_block = true;
}
}
// 游戏结束
void game_over_handler() {
game_over = true;
gotoxy((SCREEN_WIDTH - 16) / 2, SCREEN_HEIGHT / 2);
cout << "Game Over! Score: " << score;
}
int main() {
srand((unsigned int)time(NULL));
// 设置控制台窗口大小
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT rc = { 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 };
SetConsoleWindowInfo(hOut, TRUE, &rc);
// 隐藏控制台光标
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(hOut, &cursor_info);
// 播放背景音乐
play_bgm();
while (!game_over) {
if (need_new_block) {
new_block();
}
// 处理输入
if (_kbhit()) {
int key = _getch();
switch (key) {
case 'w': case 'W':
rotate_block();
break;
case 'a': case 'A':
move_block(-1, 0);
break;
case 's': case 'S':
move_block(0, 1);
break;
case 'd': case 'D':
move_block(1, 0);
break;
case 'q': case 'Q':
game_over_handler();
break;
}
}
// 自动下落
move_block(0, 1);
// 画游戏区域和方块
draw_field();
draw_block(block_x, block_y, block_type, block_rotation);
// 画得分
gotoxy(WIDTH + 2, HEIGHT / 2 - 2);
cout << "Score: " << score;
// 延时
Sleep(100);
}
return 0;
}
```
在代码中,我们使用了 `PlaySound` 函数播放背景音乐。需要注意的是,我们需要在代码中引入 Windows 多媒体库,否则编译时会报错。可以使用 `#pragma comment(lib, "winmm.lib")` 来引入该库。
除此之外,代码中还包含了一些控制台窗口的设置,例如窗口大小和光标隐藏。
阅读全文