SFML初学-俄罗斯方块实现

article/2025/9/30 13:30:14

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

 

资源:

 

源码:


/*****************************************************************************
*  Copyright (C) 2020 LL  596214569@qq.com.									 
*                                                                            
*  This file is part of SFML test project.                                   
*                                                                            
*  @file     SFML.cpp			                                             
*  @brief					                                                 
*  Details.                                                                 
*                                                                            
*  @author   LL                                                       
*  @email    596214569@qq.com                                              
*  @version  1.0.0.1                                                 
*  @date     596214569@163.com                                                                           
*                                                                            
*----------------------------------------------------------------------------
*  Remark         : Description                                              
*----------------------------------------------------------------------------
*  Change History :                                                          
*  <Date>     | <Version> | <Author>       | <Description>                   
*----------------------------------------------------------------------------
*  2020/01/05 | 1.0.0.1   | LL			   | Create file                     
*----------------------------------------------------------------------------
*                                                                            
*****************************************************************************/
// SFML.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <SFML/Graphics.hpp>
using namespace sf;
#include <time.h>
#include <WINDOWS.H>#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,// I2,4,5,7,// Z3,5,4,6,// 反向Z3,5,4,7,// T2,3,5,7,// L3,5,7,6,// J2,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<float>(j * 28), static_cast<float>(i * 28));window.draw(s);}}for (int i = 0; i < RectNum; i++){s.setTextureRect(IntRect(nColorNum * 28, 0, 28, 28));s.setPosition(static_cast<float>(figureNow[i].x * 28), static_cast<float>(figureNow[i].y * 28));window.draw(s);}window.display();}return 0;
}

 

运行效果;


http://chatgpt.dhexx.cn/article/Yn0wyR9o.shtml

相关文章

使用c++SFML制作月圆之夜总集篇

写在开头 重新以时间线的形式整理一下去年使用c的SFML库制作月圆之夜&#xff08;游戏程序设计大作业&#xff09;的开发过程&#xff0c;括号里面是新的补充以及对一年前自己的吐槽 因为是在大二转专业后做首次接触游戏开发后才做的&#xff0c;当时c学习得并不好&#xff0…

SFML loadFromFile()出错:failed to load image

解决方法&#xff1a;确保你的依赖项和你的运行库一致。 如果你的附加依赖项&#xff08;即动态链接库的.lib文件&#xff09;是debug版本&#xff0c;即以-d结尾。那么你的运行库也必须为debug版&#xff0c;即MDd。&#xff08;如下&#xff09; 附加依赖项的位置&#xff1…

用c++和SFML实现简易的界面版贪吃蛇

运行截图 等待开始界面 运行过程 失败界面截图 SFML配置 csdn上面已经有很多SFML配置的blog&#xff0c;随便就能搜到。正常配置好SFML后&#xff0c;还需要将字体ttf文件放在源代码同一目录和exe同一目录中&#xff0c;不然无法显示字符 代码部分 下面贴上各个部分的代码 …

VS2017、VS2019配置SFML

一、sfml官网下载32位的版本 一样的设置&#xff0c;64位的版本我没有成功&#xff0c;用不了。 https://www.sfml-dev.org/ bin目录下的文件拷贝到System32和SysWOW64里面。 二、 鼠标右击红色处&#xff0c;弹出菜单&#xff0c;点最后那个属性。 如果不是win32&#xff0c;…

VS2019配置SFML

VS2019配置SFML 1.下载安装SFML SDK 网址&#xff1a;https://www.sfml-dev.org/download.php 解压并放在文件夹里&#xff0c;记住这个路径。 在我的电脑中这个路径是F:\CProjects\_library\SFML-2.5.1 2.VS新建一个C控制台项目 我命名为SfmlTest&#xff0c;并放在常用的项…

sfml-tutorials 官方教程 windows篇

系列文章 SFML-windows 篇 SFML-Events explained 篇 SFML-Keyboard, mouse and joystick 篇 SFML-Using OpenGL in a SFML window 篇 SFML-Drawing 2D stuff 篇 SFML-Shapes 篇 SFML-Sprites and textures 篇 文章目录 系列文章打开一个windows执行windows绘制windows控制帧速…

SFML基础

原文地址&#xff1a;https://www.cnblogs.com/karl07/p/10285692.html (1) 窗口和交互 创建一个新窗口&#xff1a; sf::RenderWindow window(sf::VideoMode(500,500),"new window"); 但是光创建一个窗口并不能显示 还要加一个循环 while (window.isOpen()){sf:…

引擎开发四: SFML库及使用

SFML 是多媒体库&#xff0c;它为PC的各个组件提供简单的界面&#xff0c;用来简化游戏和多媒体应用程序的开发。 主要由五个模块组成&#xff0c;分别是&#xff1a;系统&#xff0c;窗口&#xff0c;图形&#xff0c;音频和网络。 SFML 是跨平台的&#xff0c;通过 SFML&…

【C++】开源:多媒体SFML库使用入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍SFML库使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

使用SFML框架打造属于自己的俄罗斯方块

目录 一、效果展示 二、游戏说明 三、开发环境 四、代码展示 五、代码详解 1.游戏区域表示 2.方块表示 3.方块旋转 4.消行处理 六、个性化定制 七、结语 一、效果展示 二、游戏说明 相信大家都玩过俄罗斯方块&#xff0c;五种按键就能带来极高的可玩性。如果想要开发…

超详细!SFML库vs2022配置教程

1.官网下载SFML 官方网址&#xff1a;SFML 点击下载 根据自己电脑选择合适的版本下载 我的电脑是64位的 下载完成之后将文件放在一个自己方便找到的地方 2.vs2022配置 选择空项目 添加cpp源文件 附加包含目录 添加你SFML中的include路径 例如&#xff1a; 添加SFML中的li…

SFML学习笔记(1)——初识SFML

一、SFML SFML 是多媒体库&#xff0c;它为PC的各个组件提供简单的界面&#xff0c;用来简化游戏和多媒体应用程序的开发。 SFML分成以下五个模块&#xff0c;这些模块相互独立&#xff0c;也可以根据需要组合在一起: System(系统)&#xff1a;一个核心模块&#xff0c;它定义…

找出数组中第k大的数

给定一个数组&#xff0c;找出数组中第k大的数。其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* author wjgs**/ public class FindK {public static void find(int[]array,int begin,int end,int k){int ipartition(array,begin,end);if(i1>k){//左半…

n个数中找最大数c语言,N个数中找到第K大的数值(C语实现)

N个数中找到第K大的数值(C语实现) N个数中找到第K大的数值(C语实现) 研究生了,选了计算机算法这门课程,这周布置了一个作业,在OJ上做:**N个数中找到第K大的数值**。大一简单学过C语言基础,目前只能用C语言编程,后续会学C++编程。 分享一份不超时的C语代码~ 测试例子: 思…

快速排序计算第K大的数

先说结论&#xff0c;最终版本代码如下&#xff1a; public class KthNum {public static int k 2;public static boolean bigK false;public static void main(String[] args) {int arr[] {3, 2, 3, 1, 7, 4, 5, 5, 6};int kNum quickSort(arr);System.out.println("…

寻找第K大的数 C语言实现的一种方法

描述 在一个数组中&#xff0c;找到第K 大的数值一个数组&#xff0c;如&#xff1a;[3,2,1,5,6,4] &#xff0c;输入 2&#xff0c;返回&#xff1a;5也就是这个K的取值&#xff0c;是从 1 开始的&#xff0c;不超过数组的最大个数 解决思路 可以使用任意的排查函数&#x…

C++——寻找第k大的数

给出一个数组&#xff0c;找出数组的第k大的数&#xff1a;基于快速排序的思路&#xff0c;每次快排后&#xff0c;基准的左边都是比其小的数&#xff0c;右边都是比其大的数&#xff0c;一次快排结束后&#xff0c;若基准所处的位置正好是第k大&#xff08;即基准右边有k-1个数…

面试题:从n个数中找出第K大的数

参考https://blog.csdn.net/orangefly0214/article/details/84997668的思路 从有n个元素的乱序数组中找出第k大的元素 方法1&#xff1a;基于冒泡排序和简单选择排序&#xff0c;时间复杂度o(n*k) 我们知道&#xff0c;在冒泡排序和简单选择排序中&#xff0c;最外层的循环每…

在N个数中查找第K大的数字(Top K问题)

在N个乱序数字中查找第k大的数字&#xff0c;时间复杂度可以减小至 O(N*logN)O(N)O(1)O(2) 答案&#xff1a;B 所谓“第&#xff08;前&#xff09;k大数问题”指的是在长度为n(n>k)的乱序数组中S找出从大到小顺序的第&#xff08;前&#xff09;k个数的问题。 注意&…

idea控制台乱码解决方法

一、问题情况&#xff1a; IntelliJ IDEA 控制台输出中文乱码部分如图所示&#xff1a; 二、解决方法&#xff1a; 1.打开tomcat配置页面&#xff0c;Edit Configurations。 2.选择项目部署的tomcat&#xff0c;在配置项VM options文本框中输入-Dfile.encodingUTF-8,点击Appl…