俄罗斯方块游戏制作过程

1. 编码前的准备:
开发环境的搭建:
1.安装visual studio 2019
到官网下载相应的软件,然后在网上找到安装步骤,按照步骤进行安装;
安装完成 下一步就是创建空项目,前方高能 !!!要注意了
当你开始测试编写代码时 有可能出现这样的问题

不用慌 解决方法 按以下图片步骤操作

点击项目

选择项目属性

点击C/C++ 在右侧选中 使用Windows运行时扩展 右边有个下拉选项 选择 是
最后确定

到这里问题就解决了

我还遇到过一个问题,由于看网站上的解决方法造成的
没有修改是这样的

修改后

产生的错误如下:

2.SFML库下载
去SFML官网下载,下载之后进入到

项目属性----->VC++目录---->包含目录 点击右侧小三角 点击编辑
再点击文件夹小图标

找到安装SFML的安装路径 直到找到下面路径C:\download\SFML-2.5.1\include

同样 库目录也一样编辑 添加路径C:\download\SFML-2.5.1\lib
编辑好之后 点击确定

最后就是导入文件到 项目里
先找到 C:\download\SFML-2.5.1\bin

选择这几个文件复制

右击项目 打开文件所在位置

在进入到debug中粘贴

然后


在依附项中添加 需要用到的文件
比如
sfml-graphics-d.lib
sfml-audio-d.lib
sfml-system-d.lib
sfml-window-d.lib

点击确定, 这样就完成了环境的搭建

2. 编码
主要代码:

#include<SFML/Graphics.hpp>//图像处理的头文件
#include<SFML/Audio.hpp>//声音处理
#include<time.h>//处理时间
using namespace sf;
//函数声明
void moveLeftRight(int dx);
void doRotate();
void keyEvent(RenderWindow* window);
void newBlock();
void drawBlocks(Sprite* spriteBlock, RenderWindow* window);
bool check();
void drop();
bool gameOver();
//只读常量,不能进行修改的值
const int ROW_COUNT = 20;
const int COL_COUNT = 15;
//定义游戏界面,用数组放方块
//当 table[i][j]=0,表示空白,否则表示有方块
//当 table[i][j]=3,表示有方块,有第3种颜色
int table[ROW_COUNT][COL_COUNT] = { 0 };
int blockIndex;//表示当前方块的种类
const float SPEED_NORMAL = 0.5;
const float SPEED_QUICK = 0.05;
//表示下降速度
float delay = SPEED_NORMAL;
Sound sou;
//方块各种形状的表示
int blocks[7][4] = {{1,3,5,7},//1字型{2,4,5,7},//Z 1型{3,5,4,6},//Z 2型{3,5,4,7},//T字型{2,4,6,7},//L字型{3,5,7,6},//J字型{2,3,4,5}//田字型
};
struct Point {int x;int y;
}curBlock[4],bakBlock[4];  //游戏方块的表示   以及方块备份
//方块左右移动
void moveLeftRight(int dx)
{for (int i = 0; i < 4; i++){bakBlock[i] = curBlock[i];curBlock[i].x += dx;}if (!check()){for (int i = 0; i < 4; i++){curBlock[i] = bakBlock[i];}}}
//方块旋转
void doRotate()
{//田字型的方块不要旋转if (blockIndex == 7){return;}//先备份for (int i = 0; i < 4; i++){bakBlock[i] = curBlock[i];}for (int i = 0; i < 4; i++){//旋转中心为curBlock[1]curBlock[i].x = bakBlock[1].x - curBlock[i].y + bakBlock[1].y;curBlock[i].y = bakBlock[i].x - bakBlock[1].x + bakBlock[1].y; }if (!check()){for (int i = 0; i < 4; i++){curBlock[i] = bakBlock[i];}}
}
//按键操作
void keyEvent(RenderWindow *window)
{bool rotate = false;//是否旋转Event e;//事件变量   pollEvent 从事件队列中取出一个事件int dx = 0;//如果没有事件了,返回假while (window->pollEvent(e)){if (e.type == Event::Closed){window->close();}if (e.type == Event::KeyPressed){switch (e.key.code){case Keyboard::Up:rotate = true;break;case Keyboard::Left:dx=-1;break;case Keyboard::Right:dx = 1;break;default:break;}}if (Keyboard::isKeyPressed(Keyboard::Down)){delay = SPEED_QUICK;}if (e.type==Event::KeyReleased){if (Keyboard::Down){delay = SPEED_NORMAL;}}if (dx != 0){moveLeftRight(dx);}if (rotate){doRotate();}}
}
//产生新方块
void newBlock()
{//获取随机值(0···7)blockIndex = rand() % 7 + 1;int n = blockIndex - 1;//序号%2  就是x坐标//序号/2  就是y坐标for (int i = 0; i < 4; i++){curBlock[i].x = blocks[n][i] % 2;curBlock[i].y = (blocks[n][i] / 2)-4;}
}
//绘制方块
void drawBlocks(Sprite *spriteBlock,RenderWindow *window)
{//1.已经降落到底部的for(int  i=0;i< ROW_COUNT;i++){ for(int  j=0;j< COL_COUNT;j++){ if (table[i][j]!=0){//画小方块//需要先使用精灵sprite表示完整的方块图片//设置绘制区域                       图形在图片的哪个位置spriteBlock->setTextureRect(IntRect(table[i][j]*18,0,18,18));spriteBlock->setPosition(j * 18, i*18);//设置偏移量//spriteBlock->move(28,31);window->draw(*spriteBlock);}}}//2.正在降落中的for (int i = 0; i < 4; i++){spriteBlock->setTextureRect(IntRect(blockIndex * 18, 0, 18, 18));spriteBlock->setPosition(curBlock[i].x * 18, curBlock[i].y * 18);//spriteBlock->move(28, 31);window->draw(*spriteBlock);}}
//检查方块的合法性
bool check()
{for (int i = 0; i < 4; i++){//碰墙或到底了,撞到底部的方块了if (curBlock[i].x < 0 || curBlock[i].x >= COL_COUNT || curBlock[i].y >= ROW_COUNT|| table[curBlock[i].y][curBlock[i].x]){return false;}}return true;
}
//方块下降
void drop()
{if (gameOver() != false){for (int i = 0; i < 4; i++){bakBlock[i] = curBlock[i];curBlock[i].y += 1;}}//要固定方块位置if (!check()){for (int i = 0; i < 4; i++){curBlock[i] = bakBlock[i];table[bakBlock[i].y][bakBlock[i].x] = blockIndex;}//产生新方块if (gameOver() != false){newBlock();}}
}
//消行
void clearLine()
{int k = ROW_COUNT - 1;for (int i = ROW_COUNT - 1; i > 0; i--){int count = 0;for (int j = 0; j < COL_COUNT; j++){if (table[i][j])count++;table[k][j] = table[i][j];}if (count < COL_COUNT){k--;}else{sou.play();}}}
//判断游戏是否结束:方块到顶了
bool gameOver()
{ for (int i = 0; i <= COL_COUNT; i++){if (table[0][i]!=0)//第0行有方块{return false;break;}}
}
int main()
{srand(time(0));//生成一个随机种子//背景音乐Music music;music.openFromFile("Bg.wav");music.setLoop(true);//设置缓存 消行音乐SoundBuffer xiaochu;xiaochu.loadFromFile("xiaochu.wav");//播放背景音乐和消行音乐sou.setBuffer(xiaochu);music.play();//1.创建窗口//1.1准备窗口的背景图片RenderWindow window(VideoMode(270, 360),"Tetris");//窗口模式,大小  要根据图片设定//窗口标题//添加背景Texture t1;//把图片加载到内存t1.loadFromFile("image/bg2.jpg");Sprite spriteBg(t1);//根据图片来创建精灵Texture t2;t2.loadFromFile("image/title.png");Sprite spriteBlock(t2);//游戏结束newBlock();//SFML提供一个计时器Clock clock;float timer = 0;while (window.isOpen())//窗口没有关闭{//获取从clock被重启或启动之后,到现在的时间float time=clock.getElapsedTime().asSeconds();clock.restart();timer += time;//等待用户开始按键按下,自定义函数keyEvent(&window);if (timer > delay){//降落  下降一个位置drop();timer = 0;}//消行clearLine();//产生第一个新方块//绘制游戏//窗口渲染这个精灵window.draw(spriteBg);//绘制方块drawBlocks(&spriteBlock, &window);// 刷新并运行窗口window.display();}system("pause");return 0;
}

3.过程中遇到的bug*
在编码过程中遇到了两个bug
1. 到顶了还是会产生新的方块,
解决的方法在产生新方块的前面加一个判断

bool gameOver()
{ for (int i = 0; i <= COL_COUNT; i++){if (table[0][i]!=0)//第0行有方块{return false;break;}}
}

2. 方块在旋转的时候会跑出边界,
出现问题的函数是doRotate();
主要是因为这行代码复制的时候忘记改过来了bakBlock [i] = curBlock[i];
改好之后的代码

//方块旋转
void doRotate()
{//田字型的方块不要旋转if (blockIndex == 7){return;}//先备份for (int i = 0; i < 4; i++){bakBlock[i] = curBlock[i];}for (int i = 0; i < 4; i++){//旋转中心为curBlock[1]curBlock[i].x = bakBlock[1].x - curBlock[i].y + bakBlock[1].y;curBlock[i].y = bakBlock[i].x - bakBlock[1].x + bakBlock[1].y; }if (!check()){for (int i = 0; i < 4; i++){curBlock[i] = bakBlock[i];}}
}

VS编程俄罗斯方块游戏相关推荐

  1. 俄罗斯方块游戏开发 ——图形化编程java swing 项目

    通过java swing技术开发的俄罗斯方块游戏,实现了基础的游戏绘制.移动逻辑.消除逻辑.得分统计.死亡判定.预测方块等功能. 成果展示截图: 项目源码及 可执行文件jar 下载 : https:/ ...

  2. 500行代码写一个俄罗斯方块游戏

    导读:本文我们要制作一个俄罗斯方块游戏. 01 俄罗斯方块 Tetris 俄罗斯方块游戏是世界上最流行的游戏之一.是由一名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这 ...

  3. 500 行代码写一个俄罗斯方块游戏

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 导读:本文我们要制作一个俄罗斯方块游戏. 作者 | 派森 ...

  4. EasyX实现俄罗斯方块游戏

    文章目录 1 启动页面 1.1 启动页面分析 1.2 启动界面代码实现 2 初始化游戏环境 2.1 界面效果及分析 2.2 代码实现 3 新方块 3.1 显示效果 3.2 分析 3.3 代码实现 4 ...

  5. c语言程序设计俄罗斯方块PPT,俄罗斯方块游戏:C语言程序设计初步感受

    C语言课程设以一节课,老师提供了一个C语言的俄罗斯方块游戏让我们感受,本学期C语言课程,主要是各种语句的练习,这次是用以前的知识来感受一个实际的系统. 首先安装c-free,然后打开老师所发给我们的小 ...

  6. python商城源码_自学Python才几天,就成功编写出俄罗斯方块游戏,附自学教程

    人们常说,python不适合做游戏,但我偏爱玩游戏,做不了大的,做个小的也行啊. 于是,我在自己毫无基础的条件下,用两天时间学python基础理论,再用已有的俄罗斯方块游戏源码和源文件,在我的不懈努力 ...

  7. 一个简易的游戏代码_500 行代码写一个俄罗斯方块游戏

    01 俄罗斯方块 Tetris 俄罗斯方块游戏是世界上最流行的游戏之一.是由一名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这个游戏就风靡了各个游戏平台. 俄罗斯方块归 ...

  8. 基于java的俄罗斯方块游戏系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)

    基于Java的俄罗斯方块游戏的设计与实现 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑.手机.掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛 ...

  9. 【180622】带音效的VC++俄罗斯方块游戏源码

    今天再次发一个经典的俄罗斯方块游戏的源程序,以前发有很多了,有兴趣的自己在本站翻翻看.今天发的这个带有音效,而且代码里的注释也超多,对学习VC++的小游戏编程绝对有启发. 里面有不少技巧在编写其它小游 ...

  10. 安卓开发: Jetpack compose + kotlin 实现 俄罗斯方块游戏

    文章目录 前言 俄罗斯方块开发文档 1.摘要 2.开发工具选取 2.1.Compose 的自身优点 2.2.数据驱动界面 3.设计需求 3.1.功能需求 3.1.1.基本游戏功能 3.1.2.拓展功能 ...

最新文章

  1. 大数据培训:Zookeeper集群管理与选举
  2. C和指针之函数之归以字符形式按顺序打印数字的每位数字(递归和非递归)
  3. 服务器返回值 解释 ajax提交方式 后台数据刷进前端
  4. Firefox for iOS现身Github 使用Swift编写
  5. 税收与补贴问题(洛谷-P1023)
  6. RePlugin 主程序接入指南
  7. python range 和 xrange 区别
  8. HCIE-Security Day35:IPSec-NAT-T
  9. HTML5 Media 原创翻译——第一章(持续更新中)
  10. uPyLoader简易使用教程
  11. 如何快速制作启动u盘
  12. Git与GitHub的了解与运用
  13. c语言赋值运算符大全,C语言基础学习运算符-赋值运算符(示例代码)
  14. js实现农历时间代码
  15. 计算机二级请假条,单位员工病假请假条范文模板
  16. kaldi-关键词识别kws
  17. 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
  18. WiFi穿墙完全指南
  19. DEVC++第五人格V2.0
  20. 使用huggingface的Transformers预训练自己的bert模型+FineTuning

热门文章

  1. 现金流量表的编制 (by shany shang)
  2. excel表格筛选某一列重复数据
  3. 光电耦合器简单介绍以及作用
  4. 全民一起VBA提高篇 第三十二回 Select 简化分枝结构,静态变量坐看沧海桑田
  5. Word表格内数据换行,Word换行Java实现代码
  6. 更改html默认浏览器,如何设置或默认浏览器更改为浏览器,火狐,IE
  7. 视频截图获取视频某一帧做图片
  8. 11 Mortal Fibonacci Rabbits
  9. 边际递减,边际成本,边际收益,边际效益
  10. St. Luke’s University Health Network是世界首批试用远程患者管理解决方案Masimo SafetyNet™来协助COVID-19住院患者的机构之一