qt的贪吃蛇实现

匿名 (未验证) 提交于 2019-12-03 00:34:01

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


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//该部分原本在绘图事件函数中,但是由于在其中的时候程序总是意外关闭,故将其提出

{

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!