#include <QtGui>
#include "blockdialog.h"
BlockDialog::BlockDialog(QWidget *parent) : QDialog(parent),curBlock(BlockGroup(BLOCK_NUM))
{
qDebug()<<"setupUi";
setupUi(this);
setPalette(QPalette(Qt::white)); //设置窗口为白色背景
setAutoFillBackground(true);
flagFlush=0;
tickNum=0;
blockGroupList={};
connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
};
//BlockDialog::BlockDialog(QWidget *parent, int blockNum) : QDialog(parent),curBlock(BlockGroup(blockNum))
BlockDialog::BlockDialog( int blockNum) : curBlock(BlockGroup(blockNum))
{
qDebug()<<"setupUi";
setupUi(this);
// curBlock=BlockGroup(blockNum);
setPalette(QPalette(Qt::white)); //设置窗口为白色背景
setAutoFillBackground(true);
flagFlush=0;
tickNum=0;
blockGroupList={};
connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
};
void BlockDialog::paintEvent(QPaintEvent *event)
{
if(flagFlush==1){
flagFlush=0;
qDebug()<<"paintEvent flush";
QPainter painter (this);//创建QPainter对象
painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::TextAntialiasing);
int W=this->width(); //绘图区宽度
int H=this->height(); //绘图区高度
// qDebug()<<"W="<<W <<" H="<< H;
int w=40;
int h=40;
//设置画笔
QPen pen;
pen.setWidth(1); //线宽
// pen.setColor(Qt::black); //划线颜色
pen.setStyle(Qt::SolidLine);//线的样式,实线、虚线等
pen.setCapStyle(Qt::FlatCap);//线端点样式
pen.setJoinStyle(Qt::BevelJoin);//线的连接点样式
painter.setPen(pen);
//设置画刷
QBrush brush;
// brush.setColor(QColor(255,255,128)); //画刷颜色
brush.setStyle(Qt::SolidPattern); //画刷填充样式
painter.setBrush(brush);
//绘图
//画出当前方块
for(int j=0;j<curBlock.blockNum;j++){
pen.setColor(curBlock.block[j].penColor); //划线颜色
painter.setPen(pen);
brush.setColor(curBlock.block[j].brushColor);//画刷颜色
painter.setBrush(brush);
painter.drawRect(QRect(curBlock.block[j].leftUp.x()*w+10,curBlock.block[j].leftUp.y()*h+10,w,h));
// qDebug()<<" j="<<j<< " x="<< curBlock.block[j].leftUp.x() <<" y="<<curBlock.block[j].leftUp.y();
}
//写字
pen.setColor(Qt::black); //划线颜色
painter.setPen(pen);
painter.drawText(10,(curBlock.blockNum+1)*h-10,QString::fromLocal8Bit("有效组合:"));
//画出所有有效的方块组合,在下方,宽高为1/2
int row=0,column=0;
for(auto it=blockGroupList.begin();it!=blockGroupList.end();it++){
// qDebug()<<" blockPos="<< blockPos;
for(int j=0;j<curBlock.blockNum;j++){
pen.setColor(Qt::black); //划线颜色
painter.setPen(pen);
brush.setColor(Qt::yellow);//画刷颜色
painter.setBrush(brush);
painter.drawRect(QRect((column*curBlock.blockNum+1)*w/2 + (it->block[j].leftUp.x())*w/2,
(curBlock.blockNum+1)*h+row*(curBlock.blockNum+1)*h/2 + it->block[j].leftUp.y()*h/2,
w/2,h/2));
// qDebug()<< " x="<< it->block[j].leftUp.x() <<" y="<<it->block[j].leftUp.y();
}
column++;
// qDebug()<< " row="<< row <<" w="<<w<<" W="<<W<<" column="<<column;
//判断下一个块是否会超出窗体宽度
if((column+1)*curBlock.blockNum*w/2>W){
column=0;
row++;
}
}
QString str3 = QString::fromLocal8Bit("now time: ");
qDebug()<<str3 << QTime().currentTime();
}
}
void BlockDialog::timerEvent(QTimerEvent* ev){
if(ev->timerId() == timerID){//判断是否是定时器id
//该定时器具体的定时事件
qDebug()<<"timerEvent enter: tickNum="<<tickNum;
int x=0,y=0;
int w=1,h=1;
int pos[5];
int pointTotal=pow(curBlock.blockNum,2);//一个点可以选择的位置
// int pointTotal=pow(curBlock.blockNum-1,2);//似乎可以减少扫描的点位数目,而不影响结果,但是没有理论依据
int tryNum = pow(pointTotal,curBlock.blockNum);//每一个点,都有这么多种可能的位置,总的可能点位选择
while(tickNum<tryNum*2){//有显示,有隐藏,设置不同颜色,则再2倍之
for(int i=0;i<curBlock.blockNum;i++){
//将一个大数,分解为几个部分,每部分给一个块使用,用作坐标赋值
int pointLevel=pow(pointTotal,curBlock.blockNum-1-i);
pos[i]=((tickNum/2)/pointLevel)%pointTotal;
}
if(tickNum%2==0){
//计算,寻找有效的方块组合
for(int j=0;j<curBlock.blockNum;j++){
curBlock.block[j].leftUp.setX((x+pos[j]/curBlock.blockNum)*w);
curBlock.block[j].leftUp.setY((y+pos[j]%curBlock.blockNum)*h);
curBlock.block[j].width = w;
curBlock.block[j].height = h;
curBlock.block[j].penColor = Qt::black;
curBlock.block[j].brushColor = Qt::yellow;//QColor(255,255,128);
}
if(checkPosValid(&curBlock)!=1){//内部有点位重复,此种组合无效,跳过
// qDebug()<<"checkPosValid invalid: "<<tickNum;
// for(int j=0;j<curBlock.blockNum;j++){
// qDebug()<<" j="<<j<< " x="<< curBlock.block[j].leftUp.x() <<" y="<<curBlock.block[j].leftUp.y();
// }
tickNum+=2;
continue;
}
if(checkAdjacent(&curBlock)!=1){//检测每点都有相邻点,若不是,跳过
// qDebug()<<"checkAdjacent invalid: "<<tickNum;
// for(int j=0;j<curBlock.blockNum;j++){
// qDebug()<<" j="<<j<< " x="<< curBlock.block[j].leftUp.x() <<" y="<<curBlock.block[j].leftUp.y();
// }
tickNum+=2;
continue;
}
if(checkConnectivity(&curBlock)!=1){//检测组块内部的连通性,若不是,跳过
// qDebug()<<"checkConnectivity invalid: "<<tickNum;
// for(int j=0;j<curBlock.blockNum;j++){
// qDebug()<<" j="<<j<< " x="<< curBlock.block[j].leftUp.x() <<" y="<<curBlock.block[j].leftUp.y();
// }
tickNum+=2;
continue;
}
//规范坐标
adjustCoordinates(&curBlock);
int flagRepeat=0;
for(auto it=blockGroupList.begin();it!=blockGroupList.end();it++){
if(checkTranslationRepeatability(&(*it),&curBlock)){//发现是平移重复的
flagRepeat=1;
break;
}
if(checkRotaltionalRepeatability(&(*it),&curBlock)){//发现是旋转重复的
flagRepeat=1;
break;
}
}
if(flagRepeat==1){
tickNum+=2;
continue;
}
//新的有效方块组合,存入结果链表中
blockGroupList.push_back(curBlock);
// qDebug()<<"blockList.size: "<<blockGroupList.size();
// int blockPos=0;
// for(auto it=blockGroupList.begin();it!=blockGroupList.end();it++){
// qDebug()<<" blockPos="<< blockPos;
// for(int j=0;j<curBlock.blockNum;j++){
// qDebug()<< " x="<< it->block[j].leftUp.x() <<" y="<<it->block[j].leftUp
没有合适的资源?快使用搜索试试~ 我知道了~
遍历列举俄罗斯方块的所有形状,基于qt实现的源码
共22个文件
cpp:4个
h:4个
o:4个
需积分: 1 0 下载量 143 浏览量
2024-04-14
08:51:33
上传
评论
收藏 1.53MB ZIP 举报
温馨提示
用qt实现的,遍历列举俄罗斯方块的所有形状,更详细说明参见: https://blog.csdn.net/lintax/article/details/137721822?spm=1001.2014.3001.5501 简介: 以前玩俄罗斯方块的时候,就想过一个问题,为什么俄罗斯方块就这7种形状,还有没有别的形状? 从程序员的角度,这其实是一个遍历穷举的过程。 对于4个块的组合,考虑所有可能性,就是在4x4的一个区域里面,任意取点。 然后添加一些限制条件: 1,块内点位不重复; 2,每个点都至少需要有一个相邻点; 3,检查点的连通性; 4,平移不重复; 5,旋转不重复;
资源推荐
资源详情
资源评论
收起资源包目录
combineBlock.zip (22个子文件)
combineBlock
combineBlock.pro.user 14KB
blockInfo-345.bin 1KB
blockdialog.cpp 21KB
combineBlock.pro 916B
Makefile 37KB
blockdialog.h 1KB
main.cpp 363B
BlockGroup.h 1KB
debug
moc_blockdialog.o 549KB
combineBlock.exe 2.5MB
moc_blockdialog.cpp 4KB
main.o 596KB
BlockGroup.o 469KB
moc_predefs.h 15KB
blockdialog.o 1.23MB
release
BlockGroup.cpp 275B
ui_block.h 2KB
block.ui 1KB
Makefile.Debug 72KB
.qmake.stash 954B
blockInfo - 3.bin 56B
blockInfo - 4.bin 252B
共 22 条
- 1
资源评论
lintax
- 粉丝: 257
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功