通过查阅资料,完成最终样品

snake.pro为配置文件
widget为父窗口相关文件
gamewidget为子窗口相关文件
⒉widget.h中的代码
#ifndef WIDGET_H#define WIDGET_H
#include<QWidget>#include<QIcon>#include<QPalette>#include<QBrush>#include<QPixmap>#include<QPushButton>#include<QMessageBox>
#include"gamewidget.h"
classWidgetpublicQWidget
{
public:
0);
//声明一个新的界面
private
void
void
};
#endif // WIDGET_H
3.widget.cpp中的代码
#include"widget.h"#include"gamewidget.h"#include<QDebug>
Widget::Widget(QWidget *parent)
parent)
{
->resize(891,510);
->setWindowTitle("贪吃蛇");
->setWindowIcon(QIcon(":/Picture/img/WindowPicture.jpg"));
.setBrush(QPalette::Background,QBrush(QPixmap(":/Picture/img/Back2.jpg")));
->setStyleSheet("background-image:url(qrc:/new/Gamewindow/img/GameBack.jpg)");
->setPalette(palette);
=new
=new
->setIconSize(QSize(920,45));
->setGeometry(400,360,90,45);
->setIcon(QIcon(":/Picture/img/Start.png"));
->setFlat(1);
->setIconSize(QSize(90,45));
->setGeometry(400,420,90,45);
->setIcon(QIcon(":/Picture/img/Exit.png"));
->setFlat(1);//设置按钮的透明属性
=new
}
void::M_startPush()
{
=new//创建一个新的界面,任然以原来的界面为父窗口,退出后可以直接回到上一个界面。
->show();
}void::M_exitPush()
{
if(QMessageBox::Yes==QMessageBox::question(this,"Tips:","Do you want to leave th ox:⒋gamewidget.h中的代码:No))
}
4.
gamewidget.h中的代码
#ifndef GAMEWIDGET_H#define GAMEWIDGET_H
#include <QWidget>#include<QIcon>#include<QPalette>#include<QBrush>#include<QPixmap>#include<QPushButton>#include<QMessageBox>#include<QPaintEvent>#include<QPainter>#include<QLabel>#include<QTimer>#include<QTime>#include<ctime>#include<QButtonGroup>#include<QKeyEvent>#define longnumber 20//宏定义游戏界面方格的多少#define widthnumber 16
classGamewidgetpublicQWidget
{
public:
0);
void
void
int200][2];//创建了一个包含蛇的身体坐标的数组
int200][2];//这个数组只是上一个坐标的复制,在最后一步(咬到身体或者撞到边缘)需要将它的身体坐标还原
staticint//对方向的更改的存储
//上下左右四个键构成一个按钮组,根据它们的返回值改变方向的值
int//食物的X坐标
int//食物的Y坐标
int
bool
int
int//难度级别,时间变化private:
signals:
public
void
void
voidint
void
void
void
};
#endif // GAMEWIDGET_H
5.gamewidget.cpp中的代码
#include "gamewidget.h"#include"widget.h"#include<QDebug>
int4;
Gamewidget::Gamewidget(QWidget *parent) : QWidget(parent)
{
//随机数的种子
0;
1;
this->setAutoFillBackground(true);//设置父窗口背景可被覆盖填充
this->resize(891,510);
this->setWindowTitle("李子的贪吃蛇");
this->setWindowIcon(QIcon(":/Picture/img/WindowPicture.jpg"));
":/new/Gamewindow/img/GameBack.jpg").scaled(this->size())));
this->setPalette(palette);
newthis);
newthis);
newthis);
newthis);
newthis);
newthis);
newthis);
1);
2);
3);
4);
int)),this,SLOT(M_setDiretion(int)));
45,90));
750,160,45,90);
":/new/Gamewindow/img/up.png"));
1);
45,90));
750,260,45,90);
":/new/Gamewindow/img/down.png"));
1);
90,45));
650,230,90,45);
":/new/Gamewindow/img/left.png"));
1);
90,45));
800,230,90,45);
":/new/Gamewindow/img/right.png"));
1);
90,45));
650,400,90,45);
1);
":/Picture/img/Start.png"));
90,45));
780,400,90,45);
":/Picture/img/Exit.png"));
1);
newthis);
newthis);
"Score:");
690,10,120,90);
"Level:");
690,50,120,90);
newthis);
newthis);
"分");
750,10,120,90);
"级");
750,50,120,90);
newthis);
this,SLOT(M_timeout()));
bool)),this,SLOT(M_startPush()));
bool)),this,SLOT(M_exitPush()));
0][0]=(rand()%18+1)*30+30;
0][1]=(rand()%15+1)*30+30;
4)+1;
20)*30;
15)*30;
1//包含蛇的头和尾巴
true;
this->repaint();
}void//按键处理
{
switch(e->key())
caseif(m_setDiretion!=2)m_setDiretion=1break;
caseif(m_setDiretion!=2)m_setDiretion=1break;
caseif(m_setDiretion!=1)m_setDiretion=2break;
caseif(m_setDiretion!=1)m_setDiretion=2break;
caseif(m_setDiretion!=4)m_setDiretion=3break;
caseif(m_setDiretion!=4)m_setDiretion=3break;
caseif(m_setDiretion!=3)m_setDiretion=4break;
caseif(m_setDiretion!=3)m_setDiretion=4break;
defaultbreak;
}void//绘图事件
{
this);
if(0<=snake[0][0]&&snake[0][0]<=600&&0<=snake[0][1]&&snake[0][1]<=480&&Nobite)
0][0];
for(int0;i--)
if(i==bodycount)//画出尾巴部分
if(snake[i][0]==snake[i-1][0]&&snake[i][1]<snake[i-1][1])
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/taildown.png"));
elseif(snake[i][0]==snake[i-1][0]&&snake[i][1]>snake[i-1][1])
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/tailup.png"));
elseif(snake[i][0]<snake[i-1][0]&&snake[i][1]==snake[i-1][1])
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/tailright.png"));
elseif(snake[i][0]>snake[i-1][0]&&snake[i][1]==snake[i-1][1])
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/tailleft.png"));
else
if((snake[i][0]==snake[i-1][0]&& snake[i][1]<snake[i-1][1]&&snake[i+1][0]<snake[i][0]&&snake[i+1][1]==snake[i][1])||
0]>snake[i-1][0])&& snake[i][1]==snake[i-1][1]&&snake[i+1][0]==snake[i][0]&&snake[i+1][1]>snake[i][1]))
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/leftdown.png"));
elseif((snake[i][0]<snake[i-1][0]&& snake[i][1]==snake[i-1][1]&&snake[i+1][0]==snake[i][0]&&snake[i+1][1]>snake[i][1])||
0]==snake[i-1][0]&& snake[i][1]<snake[i-1][1]&&snake[i+1][0]>snake[i][0]&&snake[i+1][1]==snake[i][1]))
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/rightdown.png"));
elseif((snake[i][0]>snake[i-1][0]&& snake[i][1]==snake[i-1][1]&&snake[i+1][0]==snake[i][0]&&snake[i+1][1]<snake[i][1])||
0]==snake[i-1][0]&& snake[i][1]>snake[i-1][1]&&snake[i+1][0]<snake[i][0]&&snake[i+1][1]==snake[i][1]))
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/leftup.png"));
elseif(((snake[i][0]==snake[i-1][0])&& snake[i][1]>snake[i-1][1]&&snake[i+1][0]>snake[i][0]&&snake[i+1][1]==snake[i][1])||
0]<snake[i-1][0]&& snake[i][1]==snake[i-1][1]&&snake[i+1][0]==snake[i][0]&&snake[i+1][1]<snake[i][1]))
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/rightup.png"));
elseif((snake[i][0]==snake[i-1][0]&&snake[i][0]==snake[i+1][0])&&((snake[i][1]<snake[i-1][1]&&snake[i+1][1]<snake[i][1])||
1]>snake[i-1][1]&&snake[i+1][1]>snake[i][1])))
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/downup.png"));
elseif1]==snake[i-1][1]&&snake[i][1]==snake[i+1][1])&&((snake[i][0]<snake[i-1][0]&&snake[i+1][0]<snake[i][0])||
0]>snake[i-1][0]&&snake[i+1][0]>snake[i][0])))
0],snake[i][1],30,30),QImage(":/new/Gamewindow/img/leftright.png"));
30,30),QImage(":/new/Gamewindow/img/Apple.png"));
for(int0;i<=widthnumber;i++)
for(int0;j<=longnumber;j++)
30*j,30*i,30,30));
switch
case1: painter.drawImage(QRect(snake[0][0],snake[0][1],30,30),QImage(":/new/Gamewindow/img/headup.png"));
if(bodycount==10][0],snake[0][1]+30,30,30),QImage(":/new/Gamewindow/img/tailup.png"));
break;
case2: painter.drawImage(QRect(snake[0][0],snake[0][1],30,30),QImage(":/new/Gamewindow/img/headdown.png"));
if(bodycount==1) painter.drawImage(QRect(snake[0][0],snake[0][1]-30,30,30),QImage(":/new/Gamewindow/img/taildown.png"));
break;
case3: painter.drawImage(QRect(snake[0][0],snake[0][1],30,30),QImage(":/new/Gamewindow/img/headleft.png"));
if(bodycount==1) painter.drawImage(QRect(snake[0][0]+30,snake[0][1],30,30),QImage(":/new/Gamewindow/img/tailleft.png"));
break;
case4: painter.drawImage(QRect(snake[0][0],snake[0][1],30,30),QImage(":/new/Gamewindow/img/headright.png"));
if(bodycount==10][0]-30,snake[0][1],30,30),QImage(":/new/Gamewindow/img/tailright.png"));
break;
default:
break;
}
void
{
if(snake[0][0]==foodx&&snake[0][1]==foody)//当蛇头的坐标与食物坐标重合的时候,重新布置食物的位置
20)*30;
15)*30;
//蛇的身体加一
5+1;
"分");
"级");
800-Difficulty>0? 800-Difficulty*80:80/(Difficulty-8));
memcpy(snake1,snake,sizeof(snake));
for(int0;i--)//将蛇身体的前一个坐标赋值给后一个坐标,实现蛇身体的连续出现
0]=snake[i-1][0];
1]=snake[i-1][1];
this);
for(int3;i--)
if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1])
false;
switch
case1: snake[0][1]=snake[0][1]-30,painter.drawImage(QRect(snake[0][0],snake[0][1],30,30),QImage(":/new/Gamewindow/img/headup.png"))
break;
case2: snake[0][1]=snake[0][1]+30,painter.drawImage(QRect(snake[0][0],snake[0][1],30,30),QImage(":/new/Gamewindow/img/headdown.png"))
break;
case3: snake[0][0]=snake[0][0]-30,painter.drawImage(QRect(snake[0][0],snake[0][1],30,30),QImage(":/new/Gamewindow/img/headleft.png"))
break;
case4: snake[0][0]=snake[0][0]+30,painter.drawImage(QRect(snake[0][0],snake[0][1],30,30),QImage(":/new/Gamewindow/img/headright.png"))
break;
default:
break;
if(0>snake[0][0]||snake[0][0]>600||0>snake[0][1]||snake[0][1]>480)
memcpy(snake,snake1,sizeof(snake));
false;
this->update();
this,SLOT(M_CheckGameOver()));
}
void//时间函数开始计时
{
800);
bool)),this,SLOT(M_startPush()));
":/Picture/img/Pause.png"));
bool)),this,SLOT(M_pausePush()));
}void//实现开始与暂停按钮的管理
{
bool)),this,SLOT(M_startPush()));
":/Picture/img/Start.png"));
bool)),this,SLOT(M_pausePush()));
}
voidint//接收按钮组的整数,确定方向
{
switch
case1:if(m_setDiretion!=2)m_setDiretion=1break;
case2:if(m_setDiretion!=1)m_setDiretion=2break;
case3:if(m_setDiretion!=4)m_setDiretion=3break;
case4:if(m_setDiretion!=3)m_setDiretion=4break;
defaultbreak;
}
void
{
this->close();
deletethis;
}
void//该部分原本在绘图事件函数中,但是由于在其中的时候程序总是意外关闭,故将其提出