VS编程俄罗斯方块游戏
俄罗斯方块游戏制作过程
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编程俄罗斯方块游戏相关推荐
- 俄罗斯方块游戏开发 ——图形化编程java swing 项目
通过java swing技术开发的俄罗斯方块游戏,实现了基础的游戏绘制.移动逻辑.消除逻辑.得分统计.死亡判定.预测方块等功能. 成果展示截图: 项目源码及 可执行文件jar 下载 : https:/ ...
- 500行代码写一个俄罗斯方块游戏
导读:本文我们要制作一个俄罗斯方块游戏. 01 俄罗斯方块 Tetris 俄罗斯方块游戏是世界上最流行的游戏之一.是由一名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这 ...
- 500 行代码写一个俄罗斯方块游戏
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 导读:本文我们要制作一个俄罗斯方块游戏. 作者 | 派森 ...
- EasyX实现俄罗斯方块游戏
文章目录 1 启动页面 1.1 启动页面分析 1.2 启动界面代码实现 2 初始化游戏环境 2.1 界面效果及分析 2.2 代码实现 3 新方块 3.1 显示效果 3.2 分析 3.3 代码实现 4 ...
- c语言程序设计俄罗斯方块PPT,俄罗斯方块游戏:C语言程序设计初步感受
C语言课程设以一节课,老师提供了一个C语言的俄罗斯方块游戏让我们感受,本学期C语言课程,主要是各种语句的练习,这次是用以前的知识来感受一个实际的系统. 首先安装c-free,然后打开老师所发给我们的小 ...
- python商城源码_自学Python才几天,就成功编写出俄罗斯方块游戏,附自学教程
人们常说,python不适合做游戏,但我偏爱玩游戏,做不了大的,做个小的也行啊. 于是,我在自己毫无基础的条件下,用两天时间学python基础理论,再用已有的俄罗斯方块游戏源码和源文件,在我的不懈努力 ...
- 一个简易的游戏代码_500 行代码写一个俄罗斯方块游戏
01 俄罗斯方块 Tetris 俄罗斯方块游戏是世界上最流行的游戏之一.是由一名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这个游戏就风靡了各个游戏平台. 俄罗斯方块归 ...
- 基于java的俄罗斯方块游戏系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
基于Java的俄罗斯方块游戏的设计与实现 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑.手机.掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛 ...
- 【180622】带音效的VC++俄罗斯方块游戏源码
今天再次发一个经典的俄罗斯方块游戏的源程序,以前发有很多了,有兴趣的自己在本站翻翻看.今天发的这个带有音效,而且代码里的注释也超多,对学习VC++的小游戏编程绝对有启发. 里面有不少技巧在编写其它小游 ...
- 安卓开发: Jetpack compose + kotlin 实现 俄罗斯方块游戏
文章目录 前言 俄罗斯方块开发文档 1.摘要 2.开发工具选取 2.1.Compose 的自身优点 2.2.数据驱动界面 3.设计需求 3.1.功能需求 3.1.1.基本游戏功能 3.1.2.拓展功能 ...
最新文章
- 大数据培训:Zookeeper集群管理与选举
- C和指针之函数之归以字符形式按顺序打印数字的每位数字(递归和非递归)
- 服务器返回值 解释 ajax提交方式 后台数据刷进前端
- Firefox for iOS现身Github 使用Swift编写
- 税收与补贴问题(洛谷-P1023)
- RePlugin 主程序接入指南
- python range 和 xrange 区别
- HCIE-Security Day35:IPSec-NAT-T
- HTML5 Media 原创翻译——第一章(持续更新中)
- uPyLoader简易使用教程
- 如何快速制作启动u盘
- Git与GitHub的了解与运用
- c语言赋值运算符大全,C语言基础学习运算符-赋值运算符(示例代码)
- js实现农历时间代码
- 计算机二级请假条,单位员工病假请假条范文模板
- kaldi-关键词识别kws
- 中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
- WiFi穿墙完全指南
- DEVC++第五人格V2.0
- 使用huggingface的Transformers预训练自己的bert模型+FineTuning
热门文章
- 现金流量表的编制 (by shany shang)
- excel表格筛选某一列重复数据
- 光电耦合器简单介绍以及作用
- 全民一起VBA提高篇 第三十二回 Select 简化分枝结构,静态变量坐看沧海桑田
- Word表格内数据换行,Word换行Java实现代码
- 更改html默认浏览器,如何设置或默认浏览器更改为浏览器,火狐,IE
- 视频截图获取视频某一帧做图片
- 11 Mortal Fibonacci Rabbits
- 边际递减,边际成本,边际收益,边际效益
- St. Luke’s University Health Network是世界首批试用远程患者管理解决方案Masimo SafetyNet™来协助COVID-19住院患者的机构之一