C++编写简单的俄罗斯方块游戏
C++编写简单的俄罗斯方块游戏
使用C++编写一个简单的俄罗斯方块游戏。
1 环境要求
使用C++图形库SFML,官网下载地址为https://www.sfml-dev.org/download.php
解压安装
假设安装路径为:C:\Program Files\SFML
VS配置
- 新建项目以后,选中项目右击选中属性
- 在左上方的平台选择:X64
- 左边的配置属性选择:VC++ 目录,在右边方框可以看到,可执行目录、包含目录等等
- 可执行目录中添加 C:\Program Files\SFML\SFML-2.4.2\bin(添加的路径已本教程 SFML 的解压路径相应来写的,看官自己的路径对照着来就行了)
- 包含目录添加:C:\Program Files\SFML\SFML-2.4.2\include
- 库目录添加:C:\Program Files\SFML\SFML-2.4.2\lib
- 选择连接器–输入–附加依赖项,添加:
sfml-graphics-d.lib
sfml-window-d.lib
sfml-audio-d.lib
sfml-network-d.lib
2 项目目录结构
就一个.cpp 文件,同目录下有两个文件夹:用来描绘背景的图片素材的images 和 音乐素材的 audio。
3. 游戏逻辑结构
整个代码分为简单的5个模块:计时器、检查、转换、消除、新块生成
计时器
游戏运行核心、设置 delay 值后,计时器每到delay值,处理游戏的检查、消除和新块生成逻辑
//// Timer 逻辑
while(window.isOpen()) // SFML 窗口
{
timer += time; // time是上次计时到本次的时间
if(timer>delay){
// check
// transpose
// new block
timer = 0;
}
}
检查
检查主要检查两样东西:1是检查是否当前块落地,2是检查构成消除条件的行。
1.检查是否落地
砖块描述存储在
int field[20][10]中,每次有砖块落地,都会将该砖块的对应的位置赋值,后续砖块在下落过程中遇到有值的场地,则停止下落。检查落地用 check 描述bool check()
{
for (int i = 0; i<4; i++)
if (a[i].x<0 || a[i].x >= N || a[i].y >= M) return 0;
else if (field[a[i].y][a[i].x]) return 0; return 1;
};
2.检查消除行
当满足一行的field值都不为0的时候,构成消除行,消除逻辑由 checkline 描述
int k = M - 1;
for (int i = M - 1; i>0; i--)
{
int count = 0;
for (int j = 0; j<N; j++)
{
if (field[i][j]) count++;
field[k][j] = field[i][j];
}
if (count < N) { k--; }
else {
score += 1;
}
}
新块生成
新块生成无非是rand一个颜色和砖块样式。对于砖块样式,罗列在下:
用位置描述所有类型的俄罗斯砖块。之后再转换为坐标即可。
画图
只要窗口打开着,就需要画图,画图用draw描述:
/////////draw//////////
window.clear(Color::White);
window.draw(background); for (int i = 0; i<M; i++)
for (int j = 0; j<N; j++)
{
if (field[i][j] == 0) continue;
s.setTextureRect(IntRect(field[i][j] * 18, 0, 18, 18));
s.setPosition(j * 18, i * 18);
s.move(28, 31); //offset
window.draw(s);
} for (int i = 0; i<4; i++)
{
s.setTextureRect(IntRect(colorNum * 18, 0, 18, 18));
s.setPosition(a[i].x * 18, a[i].y * 18);
s.move(28, 31); //offset
window.draw(s);
} // next box
nextBox.setTextureRect(IntRect(0, 0, 72, 108));
nextBox.setPosition(240, 20);
window.draw(nextBox); // draw next item
for (int i = 0; i<4; i++)
{
s.setTextureRect(IntRect(colorNum_next * 18, 0, 18, 18));
s.setPosition(240+18+a[i].x_next * 18, 20+18+a[i].y_next* 18);
//s.move(28, 31); //offset
window.draw(s);
} window.draw(frame);
window.display();
4. 运行演示
C++编写简单的俄罗斯方块游戏
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
C++编写简单的俄罗斯方块游戏的更多相关文章
- 吴裕雄--天生自然python学习笔记:python 用pygame模块开发俄罗斯方块游戏
俄罗斯方块游戏 多年前,游戏机中最流行的游戏就是“俄罗斯方块”了.时至今日,虽然网络 游戏日新月异 ,但“俄罗斯方块”这款小游戏仍在许多人心中 占有一席之地.本例中, 我们将亲手设计一个简单的俄罗斯方 ...
- Python 写一个俄罗斯方块游戏
使用 Python 的 PyGame 库写一个俄罗斯方块游戏的逐步指南 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人 ...
- js实现简单的俄罗斯方块小游戏
js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 200px,高为 360px 的背景容器 <!DOCTYPE html> <html lang="en" ...
- 使用C#和MonoGame开发俄罗斯方块游戏
小的时候就看到有同学使用C语言在DOS下做过一款俄罗斯方块的游戏,当时是启用了DOS的图形化模式,感觉也挺有意思.最近上海疫情封控在家,周末也稍微有点空余时间,于是使用Visual Studio 20 ...
- 从零开始---控制台用c写俄罗斯方块游戏(1)
从零开始---控制台用c写俄罗斯方块游戏(1) 很少写博文,一来自身知识有限,二来自己知道,已经有很多这样的博文了,三就是因为懒,文笔也一般,四来刚出来工作,时间也不多 之所以写这篇博文,是因为应群里 ...
- 教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏
早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用C写一个功能基本齐全的俄罗斯方块的话,大 ...
- 俄罗斯方块游戏JavaScript代码
JavaScript代码俄罗斯方块游戏 早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用 ...
- 使用JS实现俄罗斯方块游戏
简单的JS俄罗斯方块游戏源码 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta charset=&q ...
- 我用Bash编写了一个扫雷游戏
我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法.比方说,当我想在 shell 编程方面更进一步时,我决定用 Bash 编写一个扫雷游戏来加以练习. 我在编程教学 ...
随机推荐
- python文本 字符串开头或者结尾匹配
python文本 字符串开头或者结尾匹配 场景: 字符串开头或者结尾匹配,一般是使用在匹配文件类型或者url 一般使用startwith或者endwith >>> a='http:/ ...
- JS浮点数运算
//乘法函数,用来得到精确的乘法结果 //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显.这个函数返回较为精确的乘法结果. //调用:accMul(arg1,arg2) ...
- apt-get无法下载,一些网址Not Found 404
apt-get无法下载,网址报 Not Found 404,原因是apt软件下载源有问题. 1.将/etc/apt/source.list里的内容替换. 在其他能够下载apt的ubuntu机器中拷贝过 ...
- Oracle常用系统查询SQL
以user1身份登录oracle,然后执行:select table_name from user_tables;或select table_name from tabs; 常用SQL --1.查询o ...
- Asp.Net MVC 3.0 使用Gzip压缩
前言 Gzip最早由Jean-loup Gailly和Mark Adler创建,用于Unix系统的文件压缩.我们在Linux中经常会用到后缀为.gz的文件,它们就是Gzip格式的.现今已经成为Inte ...
- python urlopen SSL: CERTIFICATE_VERIFY_FAILED
1.使用ssl创建未经验证的上下文,在urlopen中传入上下文参数 import sslimport urllib2 context = ssl._create_unverified_context ...
- Javascript时间以及格式化秒
var now = new Date(); timer = $.timer(timeout, function () { var sec_num = Math.ceil((now.getTim ...
- 中国计算机学会CCF推荐国际学术会议和期刊目录(PDF版,2015年)
total: CCF推荐国际学术会议和期刊目录(下载) parts: 点击下载: 计算机体系结构并行与分布计算存储系统.pdf 点击下载: 计算机网络.pdf 点击下载: 网络与信息安全.pdf ...
- 在Ubuntu 12.04 桌面上设置启动器(快捷方式)
在Ubuntu 12.04 桌面上设置启动器(快捷方式)过程讲解: 如下图所示,Eclipse 和 SQLDeveloper 都可以直接双击打开,这些应用程序的启动器都在 /usr/share/app ...
- 混沌数学之ASin模型
相关软件:混沌数学之离散点集图形DEMO 相关代码: class ASinEquation : public DiscreteEquation { public: ASinEquation() { m ...