#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->resize(910,810);
this->setPalette(QPalette(QPalette::Background,QColor(125,125,125)));
label = new QLabel(this);
label->resize(610,810);
label->setMaximumSize(610,810);
label->setStyleSheet("border:5px solid #ccc;");
QLabel *label_back = new QLabel(this);
label_back->move(610,0);
label_back->resize(300,this->height());
QLabel *label_xt = new QLabel(label_back);
label_xt->move(5,5);
label_xt->setText("下一个:");
QLabel *label_x = new QLabel(label_back);
label_x->move(5,40);
label_x->resize(290,290);
label_x->setStyleSheet("border:5px solid #ccc;");
QLabel *label_k = new QLabel(label_back);
label_k->move(20,400);
label_k->resize(280,40);
label_k->setFont(QFont("宋体",12));
label_k->setText("控制:");
QLabel *label_one = new QLabel(label_back);
label_one->move(20,440);
label_one->resize(280,40);
label_one->setFont(QFont("宋体",12));
label_one->setText("A-向左移动 D-向右移动");
QLabel *label_two = new QLabel(label_back);
label_two->move(20,480);
label_two->resize(280,40);
label_two->setFont(QFont("宋体",12));
label_two->setText("S-加速 Space-旋转");
QLabel *label_three = new QLabel(label_back);
label_three->move(20,520);
label_three->resize(280,40);
label_three->setFont(QFont("宋体",12));
label_three->setText("J-暂停 K-开始");
QLabel *label_four = new QLabel(label_back);
label_four->move(20,560);
label_four->resize(280,40);
label_four->setFont(QFont("宋体",12));
label_four->setText("C-重新开始");
label_score = new QLabel(label_back);
label_score->move(20,750);
label_score->resize(200,40);
label_score->setFont(QFont("宋体",16));
label_score->setText("得分:0");
stype_s.append(static_cast<STYPE>(QRandomGenerator::global()->bounded(0,5)));
stype_s.append(static_cast<STYPE>(QRandomGenerator::global()->bounded(0,5)));
makeStype();
timer = new QTimer(this);
timer->start(50);
connect(timer,&QTimer::timeout,this,[=](){
QList<Index> lists;
for(int i = 0;i < indexs.size();i++){
lists.append(setIndex(indexs.at(i).x,indexs.at(i).y + 10));
}
bool flag = false;
for(int i = 0;i < indexs_userd.size();i++){
for(int j = 0;j < lists.size();j++){
if (indexs_userd.at(i).y <= -55){
label_score->setText("游戏结束");
timer->stop();
return;
}
if (indexs_userd.at(i).x == lists.at(j).x && (indexs_userd.at(i).y - lists.at(j).y) < 50 && (indexs_userd.at(i).y - lists.at(j).y) > 0){
path_x.clear();
flag = true;
break;
}
}
if (flag) break;
}
int number_cha = 0;
bool isChange = false;
for(int i = 0;i < lists.size();i++){
if (lists.at(i).y >= 755) {
number_cha = lists.at(i).y - 755;
flag = true;
isChange = true;
break;
}
}
if (isChange){
QList<Index> listsCopy;
for(int i = 0;i < lists.size();i++){
listsCopy.append(setIndex(lists.at(i).x,lists.at(i).y - number_cha));
}
indexs = listsCopy;
}
if (flag){
indexs_userd.append(indexs);
indexs.clear();
makeStype();
}else{
indexs = lists;
}
QMap<int,int> int_maps;
for(int i =0;i < indexs_userd.size();i++){
int num = 755 - indexs_userd.at(i).y;
if(num > 0){
num = num/50;
}
if(int_maps.count(num) > 0){
int value = int_maps.value(num);
value++;
int_maps.insert(num,value);
}else{
int_maps.insert(num,1);
}
}
QMap<int, int>::iterator iter = int_maps.begin();
int index;
QList<int> ins;
while (iter != int_maps.end())
{
if(iter.value() == 12){
score += 1;
label_score->setText(QString("得分:%1").arg(score));
index = iter.key();
ins.append(index);
for(int i = 0;i < indexs_userd.size();i++){
if(indexs_userd.at(i).y == 755 - index * 50){;
indexs_userd.removeAt(i);
i = i-1;
}
}
}
iter++;
}
if(ins.size() > 0){
for(int i = 0;i < ins.size();i++){
for(int j = 0;j < indexs_userd.size();j++){
if(indexs_userd.at(j).y < 755 - ins.at(i) * 50){
Index index;
index.x = indexs_userd.at(j).x;
index.y = indexs_userd.at(j).y + 50;
indexs_userd.removeAt(j);
indexs_userd.insert(j,index);
}
}
QList<int> intsCopy;
for(int j = 0;j < ins.size();j++){
int value = ins.at(j) - 1;
intsCopy.append(value);
}
ins = intsCopy;
}
}
update();
});
}
Index Widget::setIndex(int x, int y)
{
Index index;
index.x = x;
index.y = y;
return index;
}
bool Widget::checkIsAble(QList<Index> lists)
{
for(int i = 0;i < indexs_userd.size();i++){
for(int j = 0;j < lists.size();j++){
if (indexs_userd.at(i).x == lists.at(j).x && (indexs_userd.at(i).y - lists.at(j).y) < 50){
return false;
}
}
}
return true;
}
QList<Index> Widget::moveIndex(QList<Index> lists)
{
QList<Index> copy;
for(int i = 0;i < lists.size();i++){
if (lists.at(i).x >= 605){
for(int i = 0;i < lists.size();i++){
copy.append(setIndex(lists.at(i).x - 50,lists.at(i).y));
}
return moveIndex(copy);
}else if (lists.at(i).x < 5){
for(int i = 0;i < lists.size();i++){
copy.append(setIndex(lists.at(i).x + 50,lists.at(i).y));
}
return moveIndex(copy);
}
}
return lists;
}
void Widget::makeStype()
{
path_x.clear();
stype = stype_s.at(0);
indexs = makeStypeSwitch(stype);
indexs_x = makeStypeSwitchX(stype_s.at(1));
for(int i = 0;i < indexs_x.size();i++){
path_x.addRect(indexs_x.at(i).x,indexs_x.at(i).y,50,50);
}
stype_s.removeAt(0);
stype_s.append(static_cast<STYPE>(QRandomGenerator::global()->bounded(0,5)));
style = A;
}
QList<Index> Widget::makeStypeSwitch(STYPE sp)
{
QList<Index> moIndex;
switch (sp) {
case I_STYPE:
moIndex.append(setIndex(305,-205));
moIndex.append(setIndex(305,-155));
moIndex.append(setIndex(305,-105));
moIndex.append(setIndex(305,-55));
break;
case L_STYPE:
moIndex.append(setIndex(255,-155));
moIndex.append(setIndex(255,-105));
moIndex.append(setIndex(255,-55));
moIndex.append(setIndex(305,-55));
break;
case Z_STYPE:
moIndex.append(setIndex(255,-105));
moIndex.append(setIndex(305,-105));
moIndex.append(setIndex(305,-55));
moIndex.a