# 用C/C++制作一个简单的俄罗斯方块小游戏
<!-- [toc] -->
- [用C/C++制作一个简单的俄罗斯方块小游戏](#用cc制作一个简单的俄罗斯方块小游戏)
- [0 准备](#0-准备)
- [1 游戏界面设计](#1-游戏界面设计)
- [1.1 界面布局](#11-界面布局)
- [1.2 用 EasyX 显示界面](#12-用-easyx-显示界面)
- [1.3 音乐播放](#13-音乐播放)
- [2 方块设计](#2-方块设计)
- [2.1 方块显示](#21-方块显示)
- [2.2 随机生成一个方块](#22-随机生成一个方块)
- [2.3 方块记录](#23-方块记录)
- [3 方块移动和旋转](#3-方块移动和旋转)
- [3.1 方块的移动](#31-方块的移动)
- [3.2 方块的旋转](#32-方块的旋转)
- [3.3 方块的碰撞和消除](#33-方块的碰撞和消除)
- [3.3.1 碰撞](#331-碰撞)
- [3.3.2 消除](#332-消除)
- [3.3.3 分数和下落速度](#333-分数和下落速度)
- [3.3.4 game over](#334-game-over)
- [4 制作 exe 文件](#4-制作-exe-文件)
- [5 总结](#5-总结)
![在这里插入图片描述](https://img-blog.csdnimg.cn/8994a9e5476a4c2f8629cab160843176.png)
## 0 准备
- 开发环境:Windows
- 编程语言:C/C++
- 开发软件:Visual Studio 2022 (软件安装可参考:链接: [Visual Studio 2022 免费版最新版本下载安装教程](https://blog.csdn.net/u011895157/article/details/128611019)
- 图形插件:EasyX
EasyX 的安装非常简单,百度搜索以下即可,**但是在安装前一定要先安装 Visual Studio**。下面的章节给出如何使用它。
## 1 游戏界面设计
### 1.1 界面布局
首先,我们要选择一章图片作为游戏的背景,我们可以在图片网站上下载合适的背景图片。
其次,在背景图片上划分出,游戏区和显示区,一般游戏区在正中间,两边为显示区。游戏区用于控制方块的移动、消除和旋转等;显示区用于速度和分数的展示。下面是我设计的游戏界面:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2ffba2436cdb4adc83f574fddd19690a.png)
用画图工具打开图片,可以看到背景大小为800*600像素,同时在图片中间设置游戏区(虚线框,大小自定义),添加速度和分数的文本框。
### 1.2 用 EasyX 显示界面
此时,我相信你应该会建立 VS 工程了,并且安装了 EasyX。
建立一个文件夹 imp ,把1.1小节中的图片放在里面。imp 文件夹和 `main.cpp` 文件同一目录。
显示图形需要调用头文件 `graphics.h`。我们需要知道显示的图形的大小,这边是800*600,显示的位置为(0,0)
```c
#include <graphics.h>
// 绘图窗口初始化
initgraph(imp_width, imp_heght);
loadimage(&background, _T("img/background.png"));
putimage(0, 0, &background);
```
显示如下:
![背景显示](https://img-blog.csdnimg.cn/b47e649ab3f14db7a8c730428c6ecf4b.png)
这是一个简单的显示案例,后续方块的显示也是用这种方式。
### 1.3 音乐播放
先用 酷狗 下载一首好听的音乐,然后将音乐放在和 `main.cpp` 同一目录下。
我这边用了两首音乐,每次打开都是随机播放
程序:
```c
#include "Windows.h"
#include <time.h>
#pragma comment (lib, "winmm.lib")
void Music::palyMusic()
{
int chFlag;
srand((unsigned)time(NULL));
chFlag = rand() % 2;
if (chFlag == 0)
{
//mciSendString("close 1.mp3", NULL, 0, NULL);
mciSendString("open 2.mp3", NULL, 0, NULL);
mciSendString("play 2.mp3 repeat", NULL, 0, NULL);
mciSendString("setaudio 2.mp3 volume to 100", 0, 0, 0);
}
else
{
//mciSendString("close 2.mp3", NULL, 0, NULL);
mciSendString("open 1.mp3", NULL, 0, NULL);
mciSendString("play 1.mp3 repeat", NULL, 0, NULL);
mciSendString("setaudio 1.mp3 volume to 100", 0, 0, 0);
}
}
```
## 2 方块设计
### 2.1 方块显示
设计7种方块类型:
```c
const int blocks[7][4] = {
1,3,5,7, // I
2,4,5,7, // Z 1型
3,5,4,6, // Z 2型
3,5,4,7, // T
2,3,5,7, // L
3,5,7,6, // J
2,3,4,5, // 田
};
```
方块的表示如下图所示:
![方块显示](https://img-blog.csdnimg.cn/3a27b5eab42a49eb8da3e0c6f77c2a72.png)
上面两张图表示在游戏中方块是如何表示的,方块可以由界面的横纵坐标表示,我们可以将下落的初始位置作为横坐标,方块的左边界作为纵坐标。其实就是游戏区的左上角作为坐标。
那么显示的原理知道了,就是操作数组,方块的图形呢?
![小方块显示](https://img-blog.csdnimg.cn/ad58fbc3fa554cc29b0e4d4a38f9e89e.png)
小方块的显示可以根据这张图,从上图不难看出,小方块的大小为:20*20像素。如果我们要显示第一个小方块,我们可以加载这张图片然后从坐标(0,0)开始,显示长宽为20像素的图片。同意,如果要显示第三个绿色方块,就是从坐标(40,0)开始。
下面是实现的部分程序:
```c
//计算小方块位置
blockType = rand() % 7;
for (int i = 0; i < 4; i++)
{
smallBlock[i][0] = blocks[blockType][i] / 2;
smallBlock[i][1] = blocks[blockType][i] % 2 + 1;//离左边界一格显示,方便旋转
}
//小方块显示函数
void Graph::block()
{
IMAGE imgTmp;
loadimage(&imgTmp, _T("img/small.png"));
SetWorkingImage(&imgTmp);
//putimage(0, 0, &imgTmp);
for (int i = 0; i < 7; i++) {
this->imgs[i] = new IMAGE;
getimage(this->imgs[i], i * blocks_size, 0, blocks_size, blocks_size);
}
SetWorkingImage();
}
```
![初始位置](https://img-blog.csdnimg.cn/f4cc7f9705514789adc0c4a0eac0a84f.png)
### 2.2 随机生成一个方块
随机生成方块的原理就是将记录正在下落方块的数组清空初始化
```c
void Graph::random()
{
blockType = rand() % 7;
for (int i = 0; i < 4; i++)
{
smallBlock[i][0] = blocks[blockType][i] / 2;
smallBlock[i][1] = blocks[blockType][i] % 2 + 1;//离左边界一格显示,方便变形
}
colBasis = 0;
rowBasis = 0;
}
```
### 2.3 方块记录
我们不仅需要对当前正在操作的方块进行记录,还需要对已经下落还未被消除的方块进行记录。可以将游戏区看作一个二维数组,开辟一个 29*14 的二维数组进行记录。
```c
//背景图像大小
const unsigned int imp_width = 800;
const unsigned int imp_heght = 600;
//小方块大小
const unsigned int blocks_size = 20;
//游戏区边界
const unsigned int left_margin = 240;
const unsigned int right_margin = 485;
const unsigned int down_margin = 570;
const unsigned int up_margin = 10;
const int rows = 29;
const int cols = 14;
//记录方块的数组
vector<vector<int>> allBlock;
```
这里有个小技巧,因为方块要显示不同的颜色,因此我们可以用二维数组allBlock的值当作颜色的值
当allBlock[i][j]的值为0时,表示该位置没有方块;
当allBlock[i][j]的值大于0时,表示该位置有方块,显示的颜色用allBlock[i][j]的之表示
```c
//已静止方块显示
for (int i = rows-1; i > 3; --i)
{
for (int j = 0; j < cols; ++j)
{
if(allBlock[i][j]!=0)
putimage(left_margin + j * blocks_size, up_margin + i * blocks_size, imgs[allBlock[i][j]-1]);
}
}
```
## 3 方块移动和旋转
### 3.1 方块的移动
方块的移动就是一个核心:**方块的移动 = 对数组的操作**
方块的下落 = 行坐标+1
方块的左移 = 列坐标-1
方块的右移 = 列坐标+1
前提是需要判断是否出界或者移动的下一个位置是否有方块
程序如下:
```c
void Graph::moveLeft()
{
for (int i = 0; i < 4; i++)
{
if (smallBlock[i][1] <= 0 || allBlock[smallBlock[i][0]][smallBlock[i][1] - 1] >= 1)
return;
}
for (int i = 0; i < 4; i++)
{
--smallBlock[i][1];
}
--colBasis;
}
void Graph::moveDown()
{
for (int i = 0; i < 4; i++)
{
if (smallBlock[i][0] >= rows)
return;
}
for (int i = 0; i < 4; i++)
{
++smallBlock[i][0];
}
++rowBasis;
}
void Graph::moveRight()
{
for (int i = 0; i < 4; i++)
{
if (smallBlock[i][1] >= col
没有合适的资源?快使用搜索试试~ 我知道了~
项目:俄罗斯方块;编程语言:c++
共73个文件
ipch:8个
vsidx:8个
tlog:7个
需积分: 1 1 下载量 192 浏览量
2024-03-17
11:14:56
上传
评论
收藏 150.4MB ZIP 举报
温馨提示
项目:俄罗斯方块;编程语言:c++项目:俄罗斯方块;编程语言:c++项目:俄罗斯方块;编程语言:c++项目:俄罗斯方块;编程语言:c++项目:俄罗斯方块;编程语言:c++项目:俄罗斯方块;编程语言:c++项目:俄罗斯方块;编程语言:c++项目:俄项目资源具有较高的学习借鉴价值,也可直接拿来修改复现。可以在这些基础上学习借鉴进行修改和扩展,实现其它功能。可下载学习借鉴,你会有所收获。 源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可 项目资源具有较高的学习借鉴价值,也可直接拿来修改复现。可以在这些基础上学习借鉴进行修改和扩展,实现其它功能。可下载学习借鉴,你会有所收获。 源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可 可下载学习借鉴,你会有所收获。可下载学习借鉴,你会有所收获。可下载学习借鉴,你会有所收获。# 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。2. 部分字体以及插图等来自网络,若是侵权请联系删除。
资源推荐
资源详情
资源评论
收起资源包目录
项目:俄罗斯方块;编程语言:c++.zip (73个子文件)
archieC317
Desktop.ini 182B
readme.md 13KB
.vs
ProjectSettings.json 42B
俄罗斯方块
v17
Browse.VC.db 36.37MB
.wsuo 27KB
ipch
AutoPCH
70b5ea486eea3a45
MAIN.ipch 68.13MB
FileContentIndex
508ea9ad-f969-4326-a664-2a866e07fb27.vsidx 53KB
d4158cb5-085e-4427-92e0-bd2822ccb6d0.vsidx 20KB
read.lock 0B
5158cd1a-d0c4-4842-8042-28be49d60988.vsidx 15KB
adb427a1-a585-4a73-9aca-f69027c2d61a.vsidx 15KB
slnx.sqlite 324KB
VSWorkspaceState.json 301B
project
Setup1
Setup1.vdproj 39KB
Debug
Setup1.msi 9.42MB
setup.exe 557KB
俄罗斯方块
俄罗斯方块.vcxproj.user 165B
Graph.h 2KB
俄罗斯方块.APS 1KB
.vs
俄罗斯方块
v17
Browse.VC.db 39.01MB
.suo 70KB
ipch
AutoPCH
749d5688adc90c05
MUSIC.ipch 45.81MB
d9b3f165e1a2ec66
MAIN.ipch 76.13MB
beee004466b96699
MAIN.ipch 81.63MB
71ea2b0498cc7a24
GRAPH.ipch 74.88MB
ef4d4adf5af7a0f7
MAIN.ipch 36.13MB
41798580b2f39e93
MUSIC.ipch 45.31MB
ba8f29c79184f8a6
GRAPH.ipch 83.88MB
FileContentIndex
e63b53f1-f971-4db4-84ec-f7986e3d46c7.vsidx 28KB
read.lock 0B
5f29a523-8b22-43df-9056-e840b6759bc6.vsidx 47KB
488e1a03-9a0f-4478-85f3-97d7be455326.vsidx 32KB
d3f94732-fd18-42d0-bf03-81e65c546898.vsidx 20KB
main.cpp 1KB
x64
Debug
vc143.pdb 524KB
俄罗斯方块.tlog
CL.write.1.tlog 1KB
CL.command.1.tlog 2KB
link.command.1.tlog 1KB
俄罗斯方块.lastbuildstate 184B
link.read.1.tlog 4KB
link.write.1.tlog 646B
CL.read.1.tlog 109KB
Music.obj 51KB
俄罗斯方块.Build.CppClean.log 1KB
俄罗斯方块.exe 186KB
俄罗斯方块.log 663B
俄罗斯方块.ilk 1.4MB
Graph.obj 136KB
vc143.idb 635KB
俄罗斯方块.pdb 1.78MB
俄罗斯方块.exe.recipe 319B
俄罗斯方块.vcxproj.FileListAbsolute.txt 171B
main.obj 319KB
img
背景.vsdx 1.25MB
背景.png 1.09MB
新建 Microsoft Visio 绘图.vsdx 27KB
background.png 1.09MB
新建 BMP 图像.bmp 0B
small.png 5KB
2.mp3 2.9MB
Graph.cpp 5KB
俄罗斯方块.vcxproj.filters 1KB
1.mp3 1.89MB
Music.cpp 945B
Debug
vc143.pdb 66KB
俄罗斯方块.tlog
unsuccessfulbuild 0B
CL.command.1.tlog 722B
俄罗斯方块.lastbuildstate 186B
俄罗斯方块.log 15KB
vc143.idb 29KB
俄罗斯方块.sln 2KB
Music.h 62B
俄罗斯方块.vcxproj 7KB
共 73 条
- 1
资源评论
阿齐Archie
- 粉丝: 9964
- 资源: 2300
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功