#include "GameWidget.h"
#define ROW 13
#define COL 16
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
GameWidget::GameWidget(QWidget *parent) : QWidget(parent)
{
this->setAutoFillBackground(true);
this->setWindowTitle("游戏开始");
this->setWindowIcon(QIcon(":/new/prefix1/img/1.png"));
this->resize(700,500);
this->setMaximumSize(700,480);
QPalette palette;
palette.setBrush(QPalette::Background,QBrush(QPixmap(":/new/prefix1/img/green.jpg").scaled(this->size())));
this->setPalette(palette);
//声音区
sound=new QSound(":/listen/img/5611.wav");
sound1=new QSound(":/listen/img/die.mp3");
//按钮区
upbtn=new QPushButton("↑",this);
upbtn->setGeometry(QRect(580,280,40,30));
leftbtn=new QPushButton("←",this);
leftbtn->setGeometry(QRect(540,320,40,30));
rightbtn=new QPushButton("→",this);
rightbtn->setGeometry(QRect(620,320,40,30));
downbtn=new QPushButton("↓",this);
downbtn->setGeometry(QRect(580,360,40,30));
startbtn=new QPushButton("开始",this);
startbtn->setGeometry(QRect(540,400,40,30));
returnbtn=new QPushButton("返回",this);
returnbtn->setGeometry(QRect(620,400,40,30));
//设置分数等级为0
score=0;
level=0;
Init_db();
maxnum=GetMaxnum();
//显示分数等级标签区
QFont font;
font.setFamily("Consolas");
font.setBold(true);
font.setPixelSize(20);
maxscore=new QLabel("最高分:",this);
maxscore->setFont(font);
maxscore->setGeometry(QRect(540,1,70,30));
scorelabel=new QLabel("分数:",this);
scorelabel->setFont(font);
scorelabel->setGeometry(QRect(540,30,60,30));
levellabel=new QLabel("等级:",this);
levellabel->setFont(font);
levellabel->setGeometry(QRect(540,60,60,30));
str1=QString::number(score);
str2=QString::number(level);
str3=QString::number(maxnum);
maxshow=new QLabel(this);
maxshow->setFont(font);
maxshow->setGeometry(QRect(620,1,60,30));
maxshow->setText(str3);
scoreshow=new QLabel(this);
scoreshow->setFont(font);
scoreshow->setGeometry(QRect(620,30,60,30));
scoreshow->setText(str1);
levelshow=new QLabel(this);
levelshow->setFont(font);
levelshow->setGeometry(QRect(620,60,60,30));
levelshow->setText(str2);
connect(leftbtn,SIGNAL(clicked()),this,SLOT(leftbtnSlot()));
connect(rightbtn,SIGNAL(clicked()),this,SLOT(rightbtnSlot()));
connect(upbtn,SIGNAL(clicked()),this,SLOT(upbtnSlot()));
connect(downbtn,SIGNAL(clicked()),this,SLOT(downbtnSlot()));
connect(startbtn,SIGNAL(clicked()),this,SLOT(startbtnSlot()));
connect(returnbtn,SIGNAL(clicked()),this,SLOT(returnbtnSlot()));
connect(this,SIGNAL(UpSignal()),upbtn,SLOT(click()));
connect(this,SIGNAL(DownSignal()),downbtn,SLOT(click()));
connect(this,SIGNAL(LeftSignal()),leftbtn,SLOT(click()));
connect(this,SIGNAL(RightSignal()),rightbtn,SLOT(click()));
foodcount=0;
int i=1;
QTime t;
t= QTime::currentTime();
qsrand(t.msec()+t.second()*1000);
snake[0][0]=qrand()%COL;
snake[0][1]=qrand()%ROW;
foodx=qrand()%COL;
foody=qrand()%ROW;
direction=qrand()%4;
while(i)
{
if(snake[0][0]==foodx&&snake[0][1]==foody)
{
foodx=qrand()%COL;
foody=qrand()%ROW;
i=1;
}
else i=0;
}
timer=new QTimer(this);
timer->setInterval(500);
connect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));
}
GameWidget::~GameWidget()
{
SetMaxnum();
delete startbtn;
delete returnbtn;
delete leftbtn;
delete rightbtn;
delete upbtn;
delete downbtn;
delete timer;
delete sound;
delete sound1;
}
void GameWidget::upbtnSlot()
{
if(direction!=DOWN) direction=UP;
return;
}
void GameWidget::downbtnSlot()
{
if(direction!=UP) direction=DOWN;
return;
}
void GameWidget::leftbtnSlot()
{
if(direction!=RIGHT) direction=LEFT;
return;
}
void GameWidget::rightbtnSlot()
{
if(direction!=LEFT) direction=RIGHT;
return;
}
void GameWidget::startbtnSlot()
{
timer->start();
}
void GameWidget::returnbtnSlot()
{
delete this;
}
void GameWidget::timeoutSlot()
{
if(snake[0][0]==foodx&&snake[0][1]==foody)
{
sound->play();
int i=0;
foodcount++;
score++;
str1=QString::number(score);
scoreshow->setText(str1);
if(score>maxnum)
{
maxnum=score;
str3=QString::number(maxnum);
maxshow->setText(str3);
}
QTime t;
t= QTime::currentTime();
qsrand(t.msec()+t.second()*1000);
foodx=qrand()%COL;
foody=qrand()%ROW;
while(i<=foodcount)
{
i++;
if(snake[i][0]==foodx&&snake[i][1]==foody)
{
foodx=qrand()%COL;
foody=qrand()%ROW;
i=0;
}
}
switch(score)
{
case 10:timer->setInterval(350);level++;break;
case 20:timer->setInterval(250);level++;break;
case 30:timer->setInterval(150);level++;break;
}
str2=QString::number(level);
levelshow->setText(str2);
}
memcpy(snake1,snake,sizeof(snake));
for(int i=foodcount;i>=1;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
}
switch(direction)
{
case UP:snake[0][1]--;break;
case DOWN:snake[0][1]++;break;
case LEFT:snake[0][0]--;break;
case RIGHT:snake[0][0]++;break;
}
for(int i=1;i<=foodcount;i++)
{
if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1])
{
sound1->play();
memcpy(snake,snake1,sizeof(snake));
timer->stop();
if(QMessageBox::question(this,"提示","游戏结束,是否重新游戏",QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes)
{
QTime t;
int i;
t= QTime::currentTime();
qsrand(t.msec()+t.second()*1000);
snake[0][0]=qrand()%COL;
snake[0][1]=qrand()%ROW;
direction=qrand()%4;
foodx=qrand()%COL;
foody=qrand()%ROW;
while(i)
{
if(snake[0][0]==foodx&&snake[0][1]==foody)
{
foodx=qrand()%COL;
foody=qrand()%ROW;
i=1;
}
else
i=0;
}
foodcount=0;
score=0;
level=0;
str1=QString::number(score);
str2=QString::number(level);
scoreshow->setText(str1);
levelshow->setText(str2);
}
return;
}
}
if(snake[0][0]<0||snake[0][0]>=COL||snake[0][1]<0||snake[0][1]>=ROW)
{
sound1->play();
memcpy(snake,snake1,sizeof(snake));
timer->stop();
if(QMessageBox::question(this,"提示","游戏结束,是否重新游戏",QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes)
{
QTime t;
int i;
t= QTime::currentTime();
qsrand(t.msec()+t.second()*1000);
snake[0][0]=qrand()%COL;
snake[0][1]=qrand()%ROW;
direction=qrand()%4;
foodx=qrand()%COL;
foody=qrand()%ROW;
while(i)