SFML初学-俄罗斯方块实现

SFML初学-俄罗斯方块实现偶然看到大神使用 SFML 制作游戏 简单学习了一下这个库的使用并且仿照 YouTube 上大神的思路做了一个俄罗斯方块 目前只实现了出现方块 消除方块的功能 随着慢慢学习一点点继续修改吧 资源 源码 Copyr

偶然看到大神使用 SFML 制作游戏,简单学习了一下这个库的使用并且仿照YouTube上大神的思路做了一个俄罗斯方块,目前只实现了出现方块、消除方块的功能,随着慢慢学习一点点继续修改吧;

 

资源:SFML初学-俄罗斯方块实现

 

源码:

 /* * Copyright (C) 2020 LL @.com. * * This file is part of SFML test project. * * @file SFML.cpp * @brief * Details. * * @author LL * @email @.com * @version 1.0.0.1 * @date @163.com * *---------------------------------------------------------------------------- * Remark : Description *---------------------------------------------------------------------------- * Change History : * 
  
    | 
   
     | 
    
      | 
     
       *---------------------------------------------------------------------------- * 2020/01/05 | 1.0.0.1 | LL | Create file *---------------------------------------------------------------------------- * */ // SFML.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include 
      
        using namespace sf; #include 
       
         #include 
        
          #define RectNum 4 // 每个俄罗斯方块的元素个数 const int M = 20;// 行 const int N = 10;// 列 /// 整个游戏区 int field[M][N] = { 0 }; /// 图形每个方块的坐标点 struct point { int x; int y; point() { x = 0; y = 0; }; }; /// 图形 /// * * * * /// * * * /// * * * * * /// * * * * int figures[7][4] = { 1,3,5,7,// I 2,4,5,7,// Z 3,5,4,6,// 反向Z 3,5,4,7,// T 2,3,5,7,// L 3,5,7,6,// J 2,3,4,5,// 口 }; // 检测当前图形是否合法 bool Check(point p[4]) { for (int i = 0; i < RectNum; i++) { if (p[i].x < 0 || p[i].x >= N || p[i].y >= M) { return false; } else if( field[p[i].y][p[i].x] ) { return false; } } return true; } // 随机选中图形 void SetFigures(point p[4]) { int n = rand() % 7; for (int i = 0; i < RectNum; i++) { p[i].x = figures[n][i] % 2; p[i].y = figures[n][i] / 2; } } int main() { RenderWindow window(VideoMode(280, 560), "Game"); Texture t; if (!t.loadFromFile("images/titles.png")) { MessageBox(NULL, TEXT("Pictures not found!"), TEXT("MSG"), MB_OK); return -1; } Sprite s(t); s.setTextureRect(IntRect(0,0,28,28));// 精灵 // 初始化相关变量 Clock clock; float delay = 0.3f; float time1 = 0; int nDeltaX = 0; bool bRotate = false; int nColorNum = 1; point figureNow[4], figureTemp[4]; SetFigures(figureNow); while ( window.isOpen() ) { nDeltaX = 0; bRotate = false; delay = 0.3f; srand((unsigned)time(NULL)); float time = clock.getElapsedTime().asSeconds(); clock.restart(); time1 += time; Event evt; while (window.pollEvent(evt)) { if (evt.type == Event::Closed) { window.close(); } if (evt.type == Event::KeyPressed) { if (evt.key.code == Keyboard::Up) { bRotate = true; } else if (evt.key.code == Keyboard::Left) { nDeltaX = -1; } else if (evt.key.code == Keyboard::Right) { nDeltaX = 1; } else if (evt.key.code == Keyboard::Down) { delay = 0.5; } } } for (int i = 0; i < RectNum; i++) { figureTemp[i] = figureNow[i]; figureNow[i].x += nDeltaX; } if (!Check(figureNow)) { for (int i = 0; i < RectNum; i++) { figureNow[i] = figureTemp[i]; } } // 旋转 if (bRotate) { point p = figureNow[1]; for (int i = 0; i < RectNum; i++) { int x = figureNow[i].y - p.y; int y = figureNow[i].x - p.x; figureNow[i].x = p.x - x; figureNow[i].y = p.y + y; } if (!Check(figureNow)) { for (int i = 0; i < RectNum; i++) { figureNow[i] = figureTemp[i]; } } } if (time1 > delay) { for (int i = 0; i < RectNum; i++) { figureTemp[i] = figureNow[i]; figureNow[i].y += 1; } if (!Check(figureNow)) { for (int i = 0; i < RectNum; i++) { field[figureTemp[i].y][figureTemp[i].x] = nColorNum; } nColorNum = 1 + rand() % 6; SetFigures(figureNow); } time1 = 0; } // 消除已满的行 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--; } } // 图形绘制 window.clear(Color::White); 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] * 28, 0, 28, 28)); s.setPosition(static_cast 
         
           (j * 28), static_cast 
          
            (i * 28)); window.draw(s); } } for (int i = 0; i < RectNum; i++) { s.setTextureRect(IntRect(nColorNum * 28, 0, 28, 28)); s.setPosition(static_cast 
           
             (figureNow[i].x * 28), static_cast 
            
              (figureNow[i].y * 28)); window.draw(s); } window.display(); } return 0; } 
             
            
           
          
         
        
       
      
     
    
  

 

运行效果;

SFML初学-俄罗斯方块实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214291.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:36
下一篇 2026年3月18日 下午4:37


相关推荐

  • 龙虾热来了,可是你有龙虾的逻辑吗

    龙虾热来了,可是你有龙虾的逻辑吗

    2026年3月13日
    2
  • GPRS DTU是什么?其工作原理是什么?

    GPRS DTU是什么?其工作原理是什么?GPRSDTU 全称 GPRS 数据传输单元 在国内目前实际上对 GPRSDTU 具有更加明确的约定 GPRSDTU 是专门用于将串口数据通过 GPRS 网络进行传送的 GPRS 无线设备 GPRSDTU 的四个核心功能 1 内部集成 TCP IP 协议栈 GPRSDTU 内部封装了 PPP 拨号协议以及 TCP IP 协议栈并且具有嵌入式操作系统 从硬件上 它可看作是嵌入式 PC 与无线 GPRSMODEM 的结合 它

    2026年3月18日
    2
  • Java中使用double转BigDecimal的问题

    Java中使用double转BigDecimal的问题先上结论:不要直接用double变量作为构造BigDecimal的参数。线上有这么一段Java代码逻辑:1,接口传来一个JSON串,里面有个数字:57.3。2,解析JSON并把这个数字保存在一个float变量。3,把这个float变量赋值给一个BigDecimal对象,用的是BigDecimal的double参数的构造:newBigDecimal(doubleval)4,把这个BigDecimal保存到MySQL数据库,字段类型是decimal(15,2)。…

    2022年5月24日
    141
  • 0.09/张的Nano Banana Pro API详细接入教程,支持2k,4k分辨率

    0.09/张的Nano Banana Pro API详细接入教程,支持2k,4k分辨率

    2026年3月13日
    2
  • void loop在c语言中什么意思,C语言中的loop是什么意思,在C语言中loop是什么意思?…[通俗易懂]

    void loop在c语言中什么意思,C语言中的loop是什么意思,在C语言中loop是什么意思?…[通俗易懂]loop是一个在编程中习惯用的语句标号。且长配合goto语句使用。由于现在编程不提倡使用goto语句,c中的语句标号也好少用到。另附上goto,break,continue和return用法:===========================================程序中的语句通常总是按顺序方向,或按语句功能所定义的方向执行的。假如需要改变程序的正常流向,可以使用本小节介绍的转…

    2022年5月19日
    59
  • Java实用教程(第5版)参考答案

    Java实用教程(第5版)参考答案Java 实用教程 第 5 版 参考答案第 1 章 Java 入门一 问答题二 选择题三 阅读程序第 2 章基本数据类型与数组一 问答题二 选择题三 阅读或调试程序四 编写程序第 1 章 Java 入门一 问答题 1 Java 语言的主要贡献者是谁 JamesGosling 开发 Java 应用程序需要经过哪些主要步骤 需要 3 个步骤 1 用文本编辑器编写源文件 2 使用 javac 编译源文件 得到字节

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号