代码地址如下:
http://www.demodashi.com/demo/14593.html

C++编写简单的俄罗斯方块游戏

使用C++编写一个简单的俄罗斯方块游戏。

1 环境要求

使用C++图形库SFML,官网下载地址为https://www.sfml-dev.org/download.php

  1. 解压安装

    假设安装路径为:C:\Program Files\SFML

  2. 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++编写简单的俄罗斯方块游戏

代码地址如下:
http://www.demodashi.com/demo/14593.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

C++编写简单的俄罗斯方块游戏的更多相关文章

  1. 吴裕雄--天生自然python学习笔记:python 用pygame模块开发俄罗斯方块游戏

    俄罗斯方块游戏 多年前,游戏机中最流行的游戏就是“俄罗斯方块”了.时至今日,虽然网络 游戏日新月异 ,但“俄罗斯方块”这款小游戏仍在许多人心中 占有一席之地.本例中, 我们将亲手设计一个简单的俄罗斯方 ...

  2. Python 写一个俄罗斯方块游戏

    使用 Python 的 PyGame 库写一个俄罗斯方块游戏的逐步指南 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人 ...

  3. js实现简单的俄罗斯方块小游戏

    js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 200px,高为 360px 的背景容器 <!DOCTYPE html> <html lang="en" ...

  4. 使用C#和MonoGame开发俄罗斯方块游戏

    小的时候就看到有同学使用C语言在DOS下做过一款俄罗斯方块的游戏,当时是启用了DOS的图形化模式,感觉也挺有意思.最近上海疫情封控在家,周末也稍微有点空余时间,于是使用Visual Studio 20 ...

  5. 从零开始---控制台用c写俄罗斯方块游戏(1)

    从零开始---控制台用c写俄罗斯方块游戏(1) 很少写博文,一来自身知识有限,二来自己知道,已经有很多这样的博文了,三就是因为懒,文笔也一般,四来刚出来工作,时间也不多 之所以写这篇博文,是因为应群里 ...

  6. 教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏

    早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用C写一个功能基本齐全的俄罗斯方块的话,大 ...

  7. 俄罗斯方块游戏JavaScript代码

    JavaScript代码俄罗斯方块游戏 早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用 ...

  8. 使用JS实现俄罗斯方块游戏

    简单的JS俄罗斯方块游戏源码 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta charset=&q ...

  9. 我用Bash编写了一个扫雷游戏

    我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法.比方说,当我想在 shell 编程方面更进一步时,我决定用 Bash 编写一个扫雷游戏来加以练习. 我在编程教学 ...

随机推荐

  1. UI---------EventSystem

    创建uGUI控件后,Unity会同时创建一个叫EventSystem的GameObject,用于控制各类事件.可以看到Unity自带了两个Input Module,一个用于响应标准输入,一个用于响应触 ...

  2. Selenium2+python自动化47-判断弹出框存在(alert_is_present)

    前言 系统弹窗这个是很常见的场景,有时候它不弹出来去操作的话,会抛异常.那么又不知道它啥时候会出来,那么久需要去判断弹窗是否弹出了. 本篇接着Selenium2+python自动化42-判断元素(ex ...

  3. Visual Studio 2013键盘码农常用快捷键

    声明及广告 所有功能针对C#开发配置而写,面向人群是喜欢键盘操作而非鼠标操作的开发者.部分功能可能由插件提供,我会尽可能标注出相应的插件名称.为行文方便,所有快捷键以大写形式表示.太常用的快捷键,如C ...

  4. 数学图形之SineSurface与粽子曲面

    SineSurface直译为正弦曲面.这有可能和你想象的正弦曲线不一样.如果把正弦曲线绕Y轴旋转,得到的该是正弦波曲面.这个曲面与上一节中的罗马曲面有些相似,那个是被捏过的正四面体,这个则是个被捏过正 ...

  5. 血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息

    在JavaScript文件中存储敏感数据,不仅是一种错误的实践方式,而且还是一种非常危险的行为,长期以来大家都知道这一点. 而原因也非常简单,我们可以假设你为你的用户动态生成了一个包含API密钥的Ja ...

  6. 【Gson】简介 文档 基本使用 示例

    简介 new TypeToken<List<Person>>() {}.getType() 1 1   1 new TypeToken<List<Person> ...

  7. Java 解析Excel文件为JSON

    Excel转Json的需求 反正我对SSM基本不会的情况下来到现在这家公司,都是90后,感觉很好.第二天就给我开发任务,就是把用户上传的Excel文件转成JSON返回给前台用于大屏的数据展示. 解决方 ...

  8. input框设置onInput事件只能输入数字,能兼容火狐IE9

    使用onInput()事件 onInput()是 HTML5 的标准事件,对于检测 textarea, input:text, input:password 和 input:search 这几个元素通 ...

  9. android 地址控件概述

    最近,公司做项目,需要一个地址控件,本来是想androidcopy开源的android的地址控件,但是了,找来找去.都没有找到一个真正满足我的需求的,普通的地址控件只是精确到市县区三级,但是我们的需求 ...

  10. phpcms pc标签 start不生效的原因

    start 和 page 参数不可同时使用,使用了page参数 会造成start 参数无效