qt小游戏

头文件:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QDateTime>
#include <QDebug>
#include<QMessageBox>
#include<QLabel>
#include<QTimer>
#include<QPixmap>
#include<QPaintDevice>
#include<QMovie>
#include<QSize>
#include<QKeyEvent>
#include<QPainter>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
   bool isTouched(QWidget* ss,QWidget* js);//判断碰撞
   void paintEvent(QPaintEvent *event);
   void jump();//松鼠跳跃
   void keyPressEvent(QKeyEvent *);
    void hit();//进行攻击
private:
    Ui::Dialog *ui;
    int n;//跳跃标志位
    int x;
    int y;
    int m;//松果数量标志位
    int speed;//松鼠速度
    int value;//松鼠血量
    int value_js;//僵尸血量
    QMovie *movie_ss;
    QMovie *movie_js;
    QTimer *timer_ss;//松鼠跳跃定时器
    QTimer *timer_js;//僵尸移动定时器
   QTimer *timer_cure;//血包移动定时器
   QTimer *timer_attack;//松果移动定时器
   QTimer *timer_hit;//松果攻击定时器
 private slots:
   void moveSlot();//僵尸移动
   void cureSlot();//血包移动
   void attackSlot();//松果移动
   void falseSlot();//游戏失败
   void victorySlot();//游戏成功
   void newSlot();//重新开始
   void downSlot();//松鼠下落
   void  hitSlot();//松果攻击
signals:
   void newSignal();
   void falseSignal();
   void victorySignal();

};

#endif // DIALOG_H

源文件:

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    n=0;
    m=0;
    speed=10;
    value =100;
    value_js=100;
    ui->setupUi(this);

    //松鼠
    movie_ss = new QMovie(this);
    movie_ss->setFileName(":/new/prefix1/ss.gif");
    ui->label_ss->move(480,280);
    ui->label_num->setText("松果数: 0 ");
    ui->label_num->move(750,0);
    ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);
    ui->progressBar->setValue(value);
    ui->label_ss->setMovie(movie_ss);
    movie_ss->start();
    //僵尸
    movie_js = new QMovie(this);
    movie_js->setFileName(":/new/prefix1/js.gif");
    ui->label_js->move(1550,230);
    ui->progressBar_js->move(ui->label_js->x(),ui->label_js->y()-10);
    ui->label_js->setMovie(movie_js);
    movie_js->start();

    //僵尸移动定时器
     timer_js= new QTimer(this);
     timer_js->setSingleShot(false);
     timer_js->setInterval(40);
     connect(timer_js,SIGNAL(timeout()),this,SLOT(moveSlot()));
     timer_js->start();

      //血包移动定时器
     timer_cure=new QTimer(this);
     timer_cure->setSingleShot(false);
     timer_cure->setInterval(4000);
     connect(timer_cure,SIGNAL(timeout()),this,SLOT(cureSlot()));
     timer_cure->start();

     //松果移动定时器
     timer_attack=new QTimer(this);
     timer_attack->setSingleShot(false);
     timer_attack->setInterval(6000);
     connect(timer_attack,SIGNAL(timeout()),this,SLOT(attackSlot()));
     timer_attack->start();

     //松果攻击定时器
     timer_hit=new QTimer(this);
     timer_hit->setSingleShot(false);
     timer_hit->setInterval(40);

  connect(timer_hit,SIGNAL(timeout()),this,SLOT(hitSlot()));
  connect(this,SIGNAL(falseSignal()),this,SLOT(falseSlot()));//游戏失败
  connect(this,SIGNAL(victorySignal()),this,SLOT(victorySlot()));//游戏成功
  connect(this,SIGNAL(newSignal()),this,SLOT(newSlot()));//重新游戏

}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::paintEvent(QPaintEvent *)//设置背景
{
    QPainter painter(this);
    QPixmap pic_back(":/new/prefix1/back.png");
    painter.drawPixmap(0,0,width(),height(),pic_back);
}

void Dialog::keyPressEvent(QKeyEvent *event)//按键设置
{
    int code=event->key();
    switch (code) {
    case Qt::Key_A:
    if(ui->label_ss->x()>150)
    {ui->label_ss->move(ui->label_ss->x()-speed,ui->label_ss->y());
     ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);}
     break;

    case Qt::Key_D:
      if(ui->label_ss->x()<1450&&ui->label_js->x()<=1400)
     {ui->label_ss->move(ui->label_ss->x()+speed,ui->label_ss->y());
     ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);}
     break;

    case Qt::Key_W:
     if(ui->label_ss->y()>20)
    {ui->label_ss->move(ui->label_ss->x(),ui->label_ss->y()-speed);
    ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);}
     break;

    case Qt::Key_S:
    if(ui->label_ss->y()<660)
    {ui->label_ss->move(ui->label_ss->x(),ui->label_ss->y()+speed);
    ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);}
    break;

    case Qt::Key_Space:jump();break;
    case Qt::Key_J:if(m==1)hit();break;
    default:break;
    }
}

void Dialog::jump()//松鼠跳起
{
    if(n==0)//控制不能二级跳
    {
    y=ui->label_ss->y();
     x=ui->label_ss->x();
    ui->label_ss->move(ui->label_ss->x(),ui->label_ss->y()-200);
    ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);
    }
    n=1;
    timer_ss = new QTimer(this);
    timer_ss->setSingleShot(true);
    timer_ss->setInterval(800);
   connect(timer_ss,SIGNAL(timeout()),this,SLOT(downSlot()));
   timer_ss->start();
}

void Dialog::downSlot()//松鼠下落
{
  ui->label_ss->move(x,y);
  ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);
  n=0;
}

void Dialog::moveSlot()//僵尸移动
{
   ui->label_js->move(ui->label_js->x()-5,ui->label_js->y());
  ui->progressBar_js->move(ui->label_js->x(),ui->label_js->y()-10);
   if(isTouched(ui->label_js,ui->label_ss))//碰撞触发行为
   {
       value-=1;
       ui->progressBar->setValue(value);//控制松鼠血量
       if(value==0)
       {
         emit falseSignal();
       }
   }

   if(isTouched(ui->label_ss,ui->label_cure))//吃到血包
   {

       ui->label_cure->clear();
       ui->label_cure->move(ui->label_cure->x()+100,ui->label_cure->y()+100);//防止重复触发触碰
       if(value<=80)
           value+=20;
       else
        value=100;
       ui->progressBar->setValue(value);
   }

   if(isTouched(ui->label_ss,ui->label_attack))//吃到松果
   {
       if(m==0)
       {
       m=1;
        ui->label_num->setText("松果数: 1 ");
       ui->label_attack->clear();
       ui->label_attack->move(ui->label_attack->x()+100,ui->label_attack->y()+100);//防止重复触发触碰
       //QMessageBox::information(this,"information","恭喜获得神器诛尸果!!!按J可攻击一次");
       }
   }
   //僵尸重复移动
   if(ui->label_js->x()<ui->label_ss->x()-250)
   {
    int random = qrand()%10+1;
    ui->label_js->move(ui->label_ss->x()+random*30+100,ui->label_ss->y()-50);
    ui->progressBar_js->move(ui->label_js->x(),ui->label_js->y()-10);
    qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
    timer_js->setInterval(40-random*2);   //僵尸速度随机加快
    speed=random+5;//松鼠速度变化
   }
}

void Dialog::falseSlot()//失败动作
{
    QMessageBox::StandardButton result =QMessageBox::question(this,"question","游戏失败是否要重新开始?");
     if(result == QMessageBox:: No)
        close();
     else
     {
          emit newSignal();
     }
}

void Dialog::victorySlot()//成功动作
{
    timer_js->stop();
    QMessageBox::StandardButton result =QMessageBox::question(this,"question","挑战成功!!!!是否继续游戏?");
     if(result == QMessageBox:: No)
        close();
     else
     {
        emit newSignal();
     }
}

void Dialog::newSlot()//重新开始游戏
{
    qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
     int random = qrand()%10+1;
     ui->label_ss->move(480,280+40*random);
     ui->label_js->move(1400,230+40*random);
     speed=1;
     timer_js->start();
     value=100;
     value_js=100;
     ui->progressBar->setValue(value);
     ui->progressBar->move(ui->label_ss->x(),ui->label_ss->y()-10);
    ui->progressBar_js->move(ui->label_js->x(),ui->label_js->y()-10);
}

void Dialog::cureSlot()//血包移动
{
    QPixmap pic(":/new/prefix1/cure.png");//生成血包
    qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
    int random = qrand()%10+1;
    ui->label_cure->move(100*random,50*random);
    ui->label_cure->setPixmap(pic);

}

 void Dialog::attackSlot()//松果移动
   {
     if(m==0)
     {
           qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
           int random = qrand()%10+1;
           QPixmap pic1(":/new/prefix2/attack.png");//生成松果武器
           QSize pic1Size(30,30);
           pic1 = pic1.scaled(pic1Size,Qt::KeepAspectRatioByExpanding);
           ui->label_attack->move(109*random,+67*random);
           ui->label_attack->setPixmap(pic1);
     }
}

void Dialog::hit()//松果攻击
{
    ui->label_attack->move(ui->label_ss->x()+100,ui->label_ss->y()+40);
    QPixmap pic1(":/new/prefix2/attack.png");//生成松果武器
    QSize pic1Size(30,30);
    pic1 = pic1.scaled(pic1Size,Qt::KeepAspectRatioByExpanding);
    ui->label_attack->setPixmap(pic1);
    timer_hit->start();
}

void Dialog::hitSlot()
{
      ui->label_attack->move(ui->label_attack->x()+5,ui->label_attack->y());
      if(isTouched(ui->label_js,ui->label_attack))//打到僵尸
      {
          qsrand(QDateTime::currentMSecsSinceEpoch()); // 种子
          int random = qrand()%10+1;
          m=0;
          ui->label_num->setText("松果数: 0 ");
          ui->label_attack->clear();
          if(value_js>=random+5)
          value_js-=random+5;
          else
          value_js=0;
          ui->progressBar_js->setValue(value_js);
          if(value_js==0)
          emit victorySignal();
          timer_hit->stop();
      }
  else if(ui->label_attack->x()>=1480)
      {
          m=0;
         ui->label_num->setText("松果数: 0 ");
          ui->label_attack->clear();
          timer_hit->stop();
      }

}

bool  Dialog::isTouched(QWidget*ss,QWidget* js)//碰撞条件
{
    // 拿到两个组件的位置和宽高
    int ss_width = ss->width();
    int ss_height = ss->height();
    int ss_x = ss->x();
    int ss_y = ss->y();

    int js_width = js->width();
    int js_height = js->height();
    int js_x = js->x();
    int js_y = js->y();

    // 僵尸的左上角碰到了松鼠!
    if(js_x>= ss_x && js_x<= ss_x + ss_width &&
            js_y >= ss_y && js_y <= ss_y+ss_height)
    {
        return true;
    }

    // 僵尸的右上角碰到了松鼠!
    if(js_x+js_width>= ss_x && js_x+js_width<= ss_x + ss_width &&
            js_y >= ss_y && js_y <= ss_y+ss_height)
    {
        return true;
    }

    // 左下角碰到了!
    if(js_x>= ss_x && js_x<= ss_x + ss_width &&
            js_y+js_height >= ss_y && js_y+js_height <= ss_y+ss_height)
    {
        return true;
    }

    // 右下角
    if(js_x+js_width>= ss_x && js_x+js_width<= ss_x + ss_width &&
            js_y+js_height >= ss_y && js_y+js_height <= ss_y+ss_height)
    {
        return true;
    }

    return false;
}

效果:

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值