#include "gamewidget.h"
#include "ui_gamewidget.h"
#include <QKeyEvent>
#include <QMouseEvent>
#include <QPainter>
#include <QPen>
#include <QTimer>
#include <QTime>
#include <QMessageBox>
gamewidget::gamewidget(QWidget *parent) :
QDialog(parent),
ui(new Ui::gamewidget)
{
ui->setupUi(this);
ui->setupUi(this);
this->setAutoFillBackground(true);
this->setWindowIcon(QIcon(":/new/prefix1/img/1.png"));
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.wav");
//设置分数等级为0
score = 0;
level = 0;
str1=QString::number(score);
str2=QString::number(level);
ui->scoreshow->setText(str1);
ui->levelshow->setText(str2);
foodcount=0; //食物初始化
foodx=qrand()%COL; //初始化X
foody=qrand()%ROW; //初始化 y
direction=qrand()%4; //方向初始化
snake[0][0]=qrand()%COL;
snake[0][1]=qrand()%ROW;
int i = 1;
while(i) //食物出现的位置 不能跟snake 头 位置一样
{
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); //设置snake 跑 快慢速度
connect(timer,SIGNAL(timeout()),this,SLOT(timeoutSlot()));
//设置按钮操作
connect(ui->leftbtn,SIGNAL(clicked()),this,SLOT(leftbtnSlot()));
connect(ui->rightbtn,SIGNAL(clicked()),this,SLOT(rightbtnSlot()));
connect(ui->upbtn,SIGNAL(clicked()),this,SLOT(upbtnSlot()));
connect(ui->downbtn,SIGNAL(clicked()),this,SLOT(downbtnSlot()));
connect(ui->startbtn,SIGNAL(clicked()),this,SLOT(startbtnSlot()));
connect(ui->stopbtn,SIGNAL(clicked()),this,SLOT(stopbtnSlot()));
connect(ui->returnbtn,SIGNAL(clicked()),this,SLOT(returnbtnSlot()));
//设置键盘操作
connect(this,SIGNAL(UpSignal()), ui->upbtn,SLOT(click()));
connect(this,SIGNAL(DownSignal()), ui->downbtn,SLOT(click()));
connect(this,SIGNAL(LeftSignal()), ui->leftbtn,SLOT(click()));
connect(this,SIGNAL(RightSignal()), ui->rightbtn,SLOT(click()));
}
void gamewidget::timeoutSlot()
{
//判断是否吃到食物
if(snake[0][0]==foodx && snake[0][1]==foody) //当蛇头跟食物位置重合后
{
//吃到食物发出声音
sound->play();
//如果吃到食物,食物坐标更新
foodcount++;
score++;
str1=QString::number(score);
ui->scoreshow->setText(str1);
foodx=qrand()%COL; //随机产生新的食物
foody=qrand()%ROW;
int i=0;
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;
case 40:
timer->setInterval(100);level++;
break;
}
str2=QString::number(level);
ui->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]--; //向上Y 减1
break;
case DOWN:
snake[0][1]++; //向下Y 加1
break;
case LEFT:
snake[0][0]--; // 左 减1
break;
case RIGHT:
snake[0][0]++; //右 加 1
break;
}
//判断蛇是否撞到自身
for(int i=1; i<=foodcount; i++)
{
if(snake[0][0]==snake[i][0] && snake[0][1]==snake[i][1])
{
sound1->play(); //GG
memcpy(snake, snake1, sizeof(snake));
timer->stop();
if(QMessageBox::question(this,"提示","游戏结束,是否重新游戏",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes) // 如果重新开始
{
int i = 1;
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);
ui->scoreshow->setText(str1);
ui->levelshow->setText(str2);
timer->start();
}
return;
}
}
//判断蛇是否撞到墙体
if(snake[0][0]<0 || snake[0][0]>=COL || snake[0][1]<0 || snake[0][1]>=ROW)
{
sound1->play(); //GG
memcpy(snake,snake1,sizeof(snake));
timer->stop();
if(QMessageBox::question(this,"提示","游戏结束,是否重新游戏",QMessageBox::Yes,QMessageBox::No) == QMessageBox::Yes)
{
QTime t;
t= QTime::currentTime();
qsrand(t.msec()+t.second()*1000);
int i = 1;
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);
ui->scoreshow->setText(str1);
ui->levelshow->setText(str2);
timer->start();
}
else
{
delete this;
return ;
}
}
this->update();
}
void gamewidget::paintEvent(QPaintEvent *)
{
//画方格
QPainter painter(this);
// QPen _pen;
// _pen.setStyle(Qt::DashLine);
// painter.setPen(_pen);
for(int i=0; i<ROW*20; i+=20)
{
for(int j=0; j<COL*20; j+=20)
{
painter.drawRect(j, i, 20, 20);
}
}
//画食物
painter.drawImage(foodx*20, foody*20, QImage(":/new/prefix1/img/apple.png").scaled(QSize(20,20)));
//画蛇头
switch(direction)
{
case UP:
painter.drawImage(snake[0][0]*20, snake[0][1]*20, QImage(":/new/prefix1/img/headup.png").scaled(QSize(20,20)));
break;//蛇头向上
case DOWN:
painter.drawImage(snake[0][0]*20,snake[0][1]*20,QImage(":/new/prefix1/img/headdown.png").scaled(QSize(20,20)));
break;//蛇头向下
case LEFT:
painter.drawImage(snake[0][0]*20,snake[0][1]*20,QImage(":/new/prefix1/img/headleft.png").scaled(QSize(20,20)));
break;//蛇头向下
case RIGHT:
painter.drawImage(snake[0][0]*20,snake[0][1]*20,QImage(":/new/prefix1/img/headright.png").scaled(QSize(20,20)));
break;//蛇头向下
}
//画蛇身
for(int i=1; i<=foodcount; i++)
{
if(i != foodcount)
{ //对应四种情�
贪吃蛇源码版
5星 · 超过95%的资源 需积分: 31 14 浏览量
2017-07-08
10:38:49
上传
评论 5
收藏 852KB ZIP 举报
SoWhat1412
- 粉丝: 2w+
- 资源: 80