#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <time.h>
#include <QPainter>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
srand(time(NULL));
ui->setupUi(this);
this->setAutoFillBackground(true);
QPalette palette;
palette.setColor(QPalette::Background, QColor(255,255,255));
this->setPalette(palette);
colors.push_back("background-color:rgb(255,0,0);");
colors.push_back("background-color:rgb(255,153,18);");
colors.push_back("background-color:rgb(0,255,0);");
colors.push_back("background-color:rgb(0,0,255);");
colors.push_back("background-color:rgb(138,43,226);");
setColorButton.push_back(ui->colorButton_1);
setColorButton.push_back(ui->colorButton_2);
setColorButton.push_back(ui->colorButton_3);
setColorButton.push_back(ui->colorButton_4);
setColorButton.push_back(ui->colorButton_5);
int i, j;
for(i=0; i<setColorButton.length(); i++){
setColorButton[i]->setStyleSheet(colors[i]);
setColorButton[i]->setxy(i, -1);
setColorButton[i]->setVisible(false);
connect(setColorButton[i], SIGNAL(clickedXY(int,int)), SLOT(setColorCilcked(int,int)));
}
isSet = false;
connect(ui->beginButton, SIGNAL(clicked(bool)), SLOT(beginGame(bool)));
connect(ui->setButton, SIGNAL(clicked(bool)), SLOT(setCilcked(bool)));
for(i=0; i<HEIGHT; i++){
for(j=0; j<WIDTH; j++){
blocks[i][j] = new Block(this);
blocks[i][j]->setGeometry(11+j*40,11+i*40,39,39);
blocks[i][j]->setxy(j, i);
blocks[i][j]->setColor(-1);
connect(blocks[i][j], SIGNAL(clickedXY(int,int)), this, SLOT(blockClicked(int,int)));
}
}
setBlockColor();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::paintEvent(QPaintEvent*)
{
QPainter paint(this);
paint.setPen(Qt::black);
paint.drawLine(10,10,10,410);
paint.drawLine(10,10,410,10);
paint.drawLine(10,410,410,410);
paint.drawLine(410,10,410,410);
}
void MainWindow::setBlockColor(){
int i, j;
for(i=0; i<HEIGHT; i++){
for(j=0; j<WIDTH; j++){
if(blocks[i][j]->getColor() == -1)
blocks[i][j]->setStyleSheet("background-color:rgb(255,255,255);");
else blocks[i][j]->setStyleSheet(colors[blocks[i][j]->getColor()]);
}
}
}
void MainWindow::beginGame(bool){
int i, j;
for(i=0; i<HEIGHT; i++){
for(j=0; j<WIDTH; j++){
int t = rand() % colors.length();
blocks[i][j]->setColor(t);
}
}
score = 0;
ui->scroceNumber->display(score);
setBlockColor();
}
void MainWindow::setCilcked(bool){
int i, j;
if(!isSet){
for(i=0; i<setColorButton.length(); i++){
setColorButton[i]->setVisible(true);
}
for(i=0; i<HEIGHT; i++){
for(j=0; j<WIDTH; j++){
blocks[i][j]->setColor(-1);
}
}
setBlockColor();
isSet = true;
ui->setButton->setText("设置结束");
}
else{
for(i=0; i<setColorButton.length(); i++){
setColorButton[i]->setVisible(false);
}
isSet = false;
ui->setButton->setText("设置");
score = 0;
}
}
void MainWindow::setColorCilcked(int x,int y){
setColorNum = x;
}
int way[4][2] = {0,1,1,0,-1,0,0,-1};
int number = 0;
void MainWindow::blockClicked(int x, int y){
if(isSet){
blocks[y][x]->setColor(setColorNum);
setBlockColor();
}
else{
if(blocks[y][x]->getColor() == -1) return;
int i;
for(i=0; i<4; i++){
int xx = x + way[i][0];
int yy = y + way[i][1];
if(xx >= 0 && xx < WIDTH && yy >= 0 && yy < HEIGHT)
if(blocks[yy][xx]->getColor() == blocks[y][x]->getColor()) break;
}
if(i < 4){
number = 0;
dfs(x, y, blocks[y][x]->getColor());
score += number * number;
ui->scroceNumber->display(score);
reSetColor();
setBlockColor();
}
}
}
void MainWindow::dfs(int x, int y, int color){
blocks[y][x]->setColor(-1);
number++;
int i;
for(i=0; i<4; i++){
int xx = x + way[i][0];
int yy = y + way[i][1];
if(xx >= 0 && xx < WIDTH && yy >= 0 && yy < HEIGHT)
if(blocks[yy][xx]->getColor() == color) dfs(xx, yy, color);
}
}
void MainWindow::reSetColor(){
int s, e, i, j, k;
for(j=WIDTH-1; j>=0; j--){
while(1){
for(i=HEIGHT-1; i>=0; i--){
if(blocks[i][j]->getColor() == -1) break;
}
if(i < 0) break;
s = i;
for(i=i-1; i>=0; i--){
if(blocks[i][j]->getColor() >= 0) break;
}
if(i < 0){
if(s == HEIGHT-1){
for(k=j; k<WIDTH-1; k++){
for(i=0; i<HEIGHT; i++){
blocks[i][k]->setColor(blocks[i][k+1]->getColor());
blocks[i][k+1]->setColor(-1);
}
}
}
break;
}
e = i;
for(i=s; e-s+i>=0; i--){
blocks[i][j]->setColor(blocks[e - s + i][j]->getColor());
blocks[e - s + i][j]->setColor(-1);
}
}
}
}