我罗斯方块最终篇2
首先,我们想补交一下上次的作业
关于是如何艰难完成这次的作业:
①因为此次游戏目的是设计双人版的,所以我们打算先设计完单人版后再以此基础设计双人版的。
②在第一次的作业中,简述了完成此次作业相关的各类函数,但实操后发现事情并不简单...
③在最终完成的代码中,有以下几个我认为比较重要的函数
bool check() //为了防止方块在合理的范围内移动的检查方块合法性的函数
void moveLeftRight(int offset) //移动方块
void doRotate() //旋转方块
void keyEvent(RenderWindow *window) //给某个按键赋予功能性
void newBlock() //随机获取一个新方块
void drawBlocks(Sprite *spriteBlock,RenderWindow *window) //方块的体现
void drop() //控制方块下落的函数
void clearLine() //在最后一行满行时消除此行
④我们的背景音乐很好听(超大声!!)
代码要点
我们遇到了哪些问题?(排名不分先后)
①背景图、边框和方块的像素处理问题
因为边框和方块的像素要成倍数关系,所以就比较困难。
第一次处理后我们的方块:
是不是还蛮搞笑的...
多次处理后我们的方块:
虽然还是没有很完美但是可以见人了!
②我觉得是写旋转方块的那个函数叭,因为要搞清楚旋转点就有、、难。
一开始我们写的代码是
void doRotate() //旋转
{
for (int i = 0; i < 4; i++)
{
BakBlock[i] = curBlock[i];
}
Point p = curBlock[1];
for (int i = 0; i < 4; i++)
{
Point tmp = curBlock[i];
curBlock[i].x = p.x - tmp.y + p.y;
curBlock[i].y = tmp.x - p.x + p.y;
}
运行以后发现七种方块中“田”字格的方块在按下旋转键后会小范围的走动,然后貌似此方块旋不旋转都是一个形态,所以就直接在函数体的开头限定了此方块的形态。
if (blockIndex == 7)
{
return;
}
加上后解决了这个问题。
③计算分数的问题,因为我们起初不知道怎么把消行和分数关联在一起,还有分数的显示之类的,后来有借鉴网络上的各种代码,最后弄出来惹。以下是我们的代码
void initScore()
{
if (!font.loadFromFile("Sansation.ttf")) {
exit(1);
}
textScore.setFont(font);
textScore.setCharacterSize(30);
textScore.setFillColor(sf::Color::Black);
textScore.setStyle(sf::Text::Bold);
textScore.setPosition(1500, 200);
textScore.setString("0");
}
如何把单人版变成双人版???
由单人变成双人,首先是在单人的界面框旁边加一个框,实在不知道怎么把另外一个框放在一个位置上,然后又突然定义的另外一个新的的方块在一个范围活动,就手动把另外一个框贴上去了。。试了很多遍,怎么产生双人的效果,先是,想着弄两个RenderWindow window,但是他出现的两个界面没办法同时进行按键检测,只能放弃。接着又想着重新定义一个按键检测的函数,进行两遍按键检测,但是不知道为什么,就只能检测到一个,可能是进去了就不出来了吧?最后不知道怎么的,最后,我试着把所有的按键检测放到一起,突然就可以了!!
代码的 git 仓库链接(https://github.com/cailiting/woels)
运行视频(https://www.bilibili.com/video/BV1Gg4y1q76z)
运行的截图
依然存在的问题
①只能手动结束游戏
②没有垃圾行这一功能
③页面缺少美观
收获与心得
虽然和其他同学比起来,我们的我罗斯真的哈哈哈哈哈哈哈哈“低一个档次”,我们在查看别的同学的作业时都惊呆了,太厉害了👍!!但是对我而言,我们敲代码可能本身就没有那么强,能勉强完成作业已经是一个很大的突破了叭。其实当时我们被作业难度劝退了的,但是后面想想还是试一下叭,弄到哪里算哪里,然后就真的算是写出来了叭。这次作业让我们学到了很多,也认识到自己还有很多不足,希望在今后的学习道路上更加努力!