QT写贪吃蛇
QT写贪吃蛇的话,分几个部分,一个是界面一个是算法,界面有游戏界面和贴图界面。
1.界面需要注意的部分
void MainWindow::intbackground(){
setAutoFillBackground(true);
QPalette palette;
palette.setBrush(QPalette::Background, QBrush(QPixmap(":/images/back.jpg").scaled(this->size())));
setPalette(palette);
ui->pushButton->setIcon(QIcon(":/images/quit.png"));//将图片贴到pushbuttom上
ui->pushButton->setIconSize(QSize(100,100));//调整贴图大小
ui->pushButton->setFlat(true);//是否露出边框
ui->pushButton_2->setIcon(QIcon(":/images/start.png"));
ui->pushButton_2->setIconSize(QSize(100,100));
ui->pushButton_2->setFlat(true);
// //ui->pushButton_3->setIcon(QIcon(":/images/AUTO1.png"));
//ui->pushButton_3->setIconSize(QSize(100,100));
//ui->pushButton_3->setFlat(true);
}
void MainWindow::intwindow(){
setWindowTitle("贪吃蛇");//这个就是设计左上角的那段文字
setWindowIcon(QIcon(":/images/icon.png"));//可以给一个贴图在左上角
}
//结束
void MainWindow::on_pushButton_clicked()
{
exit(1);
}
//开始
void MainWindow::on_pushButton_2_clicked()//
{
she *game=new she(this);//我建了一个叫做蛇的子类
game->show();//在创一个窗口
}
可能你们贴图的时候无法显示出来,这个问题,我也遇见过,说什么资源文件过大,你需要用ps处理下,好像是打开图片另存为,在那个选项中去掉啥子,详细过程可以去百度下。
//建立分数以及难度表格
scorelable=new QLabel(this);//新建一个lable
levelable=new QLabel(this);
scorelable->setText("score:");//添加文字
scorelable->setGeometry(900,100,120,90);//位置处理
levelable->setText("level:");
levelable->setGeometry(900,140,120,90);
scorenumber=new QLabel(this);
levelablenum=new QLabel(this);
lp=new QLabel(this);
scorenumber->setText(QString::number(score)+"分");
scorenumber->setGeometry(960,100,120,90);
levelablenum->setText(QString::number(diff)+"级");
levelablenum->setGeometry(960,140,120,90);
//新建按钮
starpush=new QPushButton(this);
pause=new QPushButton(this);
exitpush=new QPushButton(this);
autp=new QPushButton(this);
autp->setIcon(QIcon(":/images/AUTO1.png"));//贴图
autp->setIconSize(QSize(60,60));//大小
autp->setGeometry(850,600,60,60);//位置
autp->setFlat(1);
Timer=new QTimer(this);//新建一个timer
connect(exitpush,SIGNAL(clicked(bool)),this,SLOT(exit_push()));//将按钮和函数链接起来
connect(starpush,SIGNAL(clicked(bool)),this,SLOT(star_push()));
connect(pause,SIGNAL(clicked(bool)),this,SLOT(pause_push()));
connect(Timer,SIGNAL(timeout()),this,SLOT(time_p()));//这个特殊将一个函数与timer链接起来
connect(autp,SIGNAL(clicked(bool)),this,SLOT(ai()));
关于苹果的生成就几个部分
1.随机函数
2.2个数组来储存位置
3.冲突的判断
4.用一个私有成员来记录苹果的个数,来达到更新的作用
关于蛇的话就简单的多,只要处理好碰撞问题,和方向问题就行了
//方向用一个私有成员代替direct
void she::keyPressEvent(QKeyEvent *event){
switch(event->key()){
case Qt::Key_W:if(direct!=2)direct=1;break;
case Qt::Key_S:if(direct!=1)direct=2;break;
case Qt::Key_A:if(direct!=4)direct=3;break;
case Qt::Key_D:if(direct!=3)direct=4;break;
}
}
void she::pause_push(){
Timer->stop();//停止
connect(starpush,SIGNAL(clicked(bool)),this,SLOT(star_push()));
starpush->setIcon(QIcon(":/images/Play.png"));
disconnect(starpush,SIGNAL(clicked(bool)),this,SLOT(pause_push()));
}
void she::star_push(){
Timer->start(500);没500ms调用一次与timer链接的函数
disconnect(starpush,SIGNAL(clicked(bool)),this,SLOT(star_push()));
starpush->setIcon(QIcon(":/images/start.png"));
connect(starpush,SIGNAL(clicked(bool)),this,SLOT(pause_push()));
}
之前我们用timer和这个函数链接起来,我们在开始函数
void she::time_p()
{
//如果蛇头碰到了苹果
if(snake[0][0]==foodx[lef]/40&&snake[0][1]==foody[lef]/40)
{
data[n2][lef]='1';
n_len=0;
body++;
score=score+10;//加分
lef++;//吃到苹果的个数
int n4;
n4=data[n2].size();
if(n2==0)
n4++;
if(lef==n4-1){
diff++;
Timer->start(500-n2*20);
}
levelablenum->setText(QString::number(diff)+"级");
scorenumber->setText(QString::number(score)+"分");
}
int n3=data[n2].size();
//如果吃到全部的苹果
if(lef>=n3){
delete []foodx;
delete []foody;
n2++;
n1=data[n2].size();
foodx=new int[n1];
foody=new int[n1];
lp->setText(data2[n2]);
for(int i=0;i<n1;i++){
foodx[i]=(rand()%19)*40;
if(foodx[i]==0)
foodx[i]=40;
foody[i]=(rand()%19)*40;
if(foody[i]==0)
foody[i]=40;
}
}
lef=0;
}
for(int i=body;i!=0;i--){
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
cap[snake[i][0]][snake[i][1]]=1;
}
}
QPainter painter(this);
switch (direct) {
case 1:--snake[0][1];break;//,painter.drawImage(QRect((40*snake[0][0]),(40*snake[0][1]),40,40),QImage(":/images/shu.png"));break;
case 2:++snake[0][1];break;//painter.drawImage(QRect((40*snake[0][0]),(40*snake[0][1]),40,40),QImage(":/images/shu.png"));break;
case 3:--snake[0][0];break;//,painter.drawImage(QRect((40*snake[0][0]),(40*snake[0][1]),40,40),QImage(":/images/heng.png"));break;
case 4:++snake[0][0];break;//,painter.drawImage(QRect((40*snake[0][0]),(40*snake[0][1]),40,40),QImage(":/images/heng.png"));break;
default:
break;
}
this->update();//更新
connect(Timer,SIGNAL(timeout()),this,SLOT(game_over()));//链接结束
}
void she::game_over(){
if(snake[0][0]<0||snake[0][0]>20||snake[0][1]<0||snake[0][1]>20)
{
Timer->stop();
QMessageBox::Yes==QMessageBox::information(this,"Tips:","Game Over!",QMessageBox::Yes);
this->hide();
delete this;
}
else
for(int i=1;i<body;i++){
if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1]){
Timer->stop();
this->hide();
QMessageBox::Yes==QMessageBox::information(this,"Tips:","Game Over!",QMessageBox::Yes);
delete this;
}
}
this->update();
;
}