代码地址如下:
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大师代发,拒绝转载,转载需要作者授权

最新文章

  1. c语言第12次作业
  2. css权重
  3. js 函数和变量的提升
  4. LintCode 整数排序
  5. 掌握Tiles 框架 (一)---Tiles入门和Tiles 框架和体系结构
  6. 8个实用的页面布局和用户界面jQuery插件
  7. Oracle 中的 TO_DATE 和 TO_CHAR 函数
  8. hdu 1251 统计难题 trie入门
  9. HDU5107---K-short Problem (线段树区间 合并、第k大)
  10. queue,指针求最短路的区别
  11. Block使用中的一些要注意的地方
  12. redis运维的一些知识点
  13. 基于微博LBS API开发的周边美图android app
  14. 妙味课堂:JavaScript初级--第11课:字符串、查找高亮显示
  15. VS2010 Extension实践(2)
  16. JDBC url连接字符串错误1
  17. python 有参装饰器与迭代器
  18. Eclipse中配置resin 4.x
  19. url写法细节
  20. UVa 11178 Morley&#39;s Theorem (几何问题)

热门文章

  1. linux-修改时区时间
  2. Selenium2+python自动化37-爬页面源码(page_source)
  3. Javascript时间以及格式化秒
  4. @JVM中对象的引用类型
  5. OpenCV学习(21) Grabcut算法详解
  6. Python编程学习,高效求解素数程序实例
  7. mysql09---sql语句优化
  8. Lichee (五) sysconfig1.fex 配置系统
  9. iOS开发-UITableView表格优化
  10. Sublime Text2格式化HMTL/CSS/JS插件HTML-CSS-JS Prettify