admin管理员组

文章数量:1534816

2024年6月22日发(作者:)

自己用qt动手写的小游戏,大家可以参考帮忙改进下,谢谢!!

游戏内容图片下坠,点击即可得分 ,未点击到则坠落到底则丢失,得分超过20则赢,丢失

超过10则输

文件声音和图片为方便均采用绝对路径;

首先需要创建一个ui文件

文件名为

里面拉2个label,一个为分数,一个为丢失数,objectname任意取

在拉2个lineedit,对应上面分别取objectivename为pointEdit和missEdit

在拉2个按钮 开始游戏 和 退出游戏objectivename为startGame和quitGame

再依次创建下面文件,并使用下面代码:

文件

SOURCES +=

FORMS +=

HEADERS +=

hei.h

zujian.h

gameArea.h

RESOURCES +=

image/

RC_FILE=image/ //定义运行图标 不需要的话可以删掉

运行主文件

#include

#include "hei.h"

#include

int main(int argc,char *argv[])

{

QApplication app(argc,argv);

QTextCodec::setCodecForTr(QTextCodec::codecForLocale());//使中文

有效

heiw w;

();

return ();

}

gameArea.h 设置游戏区域背景类 就是一个400*550的矩形框子,使用painter画笔画的,

如果想丰富一点,可将该类换成QLabel继承类,然后贴图作为背景,还可以自动更换图片

背景。

#ifndef GAMEAREA_H

#define GAMEAREA_H

#include

#include

#include

#include

class gamearea:public QWidget

{

Q_OBJECT

public:

gamearea(QWidget *parent=0);

void paintEvent(QPaintEvent *event);

QPainter *painter;

};

#endif // GAMEAREA_H

资源文件

#include"gameArea.h"

gamearea::gamearea(QWidget *parent):QWidget(parent)

{

update();

}

void gamearea::paintEvent(QPaintEvent *)//重绘函数

{

painter=new QPainter(this);

painter->setBrush(Qt::yellow);

painter->setPen(Qt::black);

painter->drawRect(0,0,400,550);

}

Zujian.h 游戏里移动图片类的定义

#ifndef ZUJIAN_H

#define ZUJIAN_H

#include

#include

#include

#include

#include

#include

#include

class zu:public QLabel

{

Q_OBJECT

public:

zu(QWidget *parent=0);

void rand();

void speedrand();

void setX(int a);

void ctlgame();

void mousePressEvent(QMouseEvent *event);

signals:

void point(const int a);

void miss(const int a);

void click();

public slots:

void clkevent();

void Timeout1();

private:

QSound *clicks,*misss;

int a;

QPixmap pix;

QTimer *timer1;

int psel;

int speed;

int X,Y;

bool ctrl;

QString str;

};

#endif // ZUJIAN_H

资源文件

#include "zujian.h"

zu::zu(QWidget *parent):QLabel(parent)

{

QTime t1;

t1=QTime::currentTime();

qsrand(()+()*800);//设置随机种子

psel=qrand()%4;//随机取数,用于随机取图片

speed=qrand()%100;//用于图片下坠速度

X=0;

Y=0;

a=0;

ctrl=true;

timer1=new QTimer(this);

clicks=new

QSound("C:");//点击图片

声音

misss=new

QSound("C:");//图片未被点

击丢失的声音

rand();

speedrand();

connect(this,SIGNAL(click()),this,SLOT(clkevent()));

}

void zu::mousePressEvent(QMouseEvent *event)

{

clicks->play();

emit click();

}

void zu::clkevent()//图片被点击事件

{

Y=0;

rand();

speedrand();

(str);

setPixmap(pix);

setGeometry(X,Y,100,120);

a=1;

emit point(a);

}

void zu::Timeout1()//图片下坠

{

if(Y>550)//图片下坠超过边界时则重新设置纵坐标为零,并发射丢失信号

{

Y=0;

Y+=5;

rand();

speedrand();

(str);

setPixmap(pix);

setGeometry(X,Y,100,120);

misss->play();

a=1;

emit miss(a);

}

Else//图标下坠

{

(str);

setPixmap(pix);

setGeometry(X,Y,100,120);

Y+=5;

}

}

void zu::rand()//当图片被点击或者丢失后 ,随机再取图

{

QTime t1;

t1=QTime::currentTime();

qsrand(()+()*800);

psel=qrand()%4;

switch(psel)

{

case 1: str="C:";break;

case 2: str="C:";break;

case 3: str="C:";break;

case 4: str="C:";break;

default: ;;

}

}

void zu::speedrand()//下坠速度设定

{

speed=qrand()%100;

timer1->start(speed);

disconnect(timer1,SIGNAL(timeout()),this,SLOT(Timeout1()));

connect(timer1,SIGNAL(timeout()),this,SLOT(Timeout1()));

}

void zu::setX(int a)//设置图片横坐标

{

switch(a)

{

case 0: X=0;break;

case 1: X=100;break;

case 2: X=200;break;

case 3: X=300;break;

default: ;;

}

}

void zu::ctlgame()//暂停继续游戏控制,在heiw文件中使用

{

if(ctrl)

{

connect(this,SIGNAL(click()),this,SLOT(clkevent()));

connect(timer1,SIGNAL(timeout()),this,SLOT(Timeout1()));

ctrl=false;

}

else

{

disconnect(this,SIGNAL(click()),this,SLOT(clkevent()));

disconnect(timer1,SIGNAL(timeout()),this,SLOT(Timeout1()));

ctrl=true;

}

}

Hei.h游戏里主界面的定义

#ifndef HEI_H

#define HEI_H

#include

#include

#include

#include

#include

#include "zujian.h"

class QLabel;

namespace Ui

{

class heid;

}

class heiw:public QDialog

{

Q_OBJECT

public:

heiw(QWidget *parent=0);

~heiw();

gamearea *game;

zu* pp[4];

void result();

private slots:

void startgame();

void info(int a);

void infomiss(int a);

private:

QSound *sound;

QFont font;

QPalette palette;

QString str,str1;

int miss;

bool starts;

bool Gnew;

int point;

Ui::heid *ui;

QLabel *label;

};

#endif // HEI_H

资源文件

#include "hei.h"

#include "ui_hei.h"

#include

heiw::heiw(QWidget *parent):QDialog(parent),ui(new Ui::heid)

{

ui->setupUi(this);

this->setFixedSize(630,551);//设定窗口固定大小

this->setWindowTitle(tr("o0O点你妹O0o"));//设置标题

game=new gamearea(this);//创建游戏背景对象

game->setGeometry(0,0,405,550);//设置游戏背景大小

this->game->setFocus();

starts=false;

Gnew=true;

point=0;

miss=0;

label=new QLabel(this);

elSize(16);

or(QPalette::WindowText,Qt::red);

label->setPalette(palette);

label->setFont(font);

label->setText(tr("森哥出品 谢谢试玩 rn 请点击开始游戏"));

label->setGeometry(140,220,140,40);

ui->pointEdit->setText(tr("0"));

ui->missEdit->setText(tr("0"));

sound=new

QSound("C:");//开始

音乐,为绝对路径,需更改

sound->play();

connect(ui->quitGame,SIGNAL(clicked()),qApp,SLOT(quit()));

connect(ui->startGame,SIGNAL(clicked()),this,SLOT(startgame()));

}

heiw::~heiw()

{

delete ui;

delete game;

for(int i=0;i<4;i++)

{

delete pp[i];

}

delete label;

}

void heiw::startgame()

{

starts=!starts;

if(starts)//游戏开始和继续

{

if(Gnew)//初次进入游戏时创建4个图片对象

{

for(int i=0;i<4;i++)

{

pp[i]=new zu(this);

pp[i]->setX(i);

pp[i]->show();

connect(pp[i],SIGNAL(point(int)),this,SLOT(info(int)));

connect(pp[i],SIGNAL(miss(int)),this,SLOT(infomiss(int)));

}

Gnew=false;

}

for(int i=0;i<4;i++)

{

pp[i]->ctlgame();

pp[i]->show();

}

ui->startGame->setText(tr("暂停游戏"));

label->setHidden(true);

}

Else//游戏暂停

{

ui->startGame->setText(tr("继续游戏"));

label->setText(tr("游戏暂停中......"));

label->show();

for(int i=0;i<4;i++)

{

pp[i]->ctlgame();;

pp[i]->setHidden(true);

}

}

}

void heiw::info(int a)//接收图片对象点击信号加分

{

point+=a;

str=QString("%1").arg(point);

ui->pointEdit->setText(str);

if(point>=20)

result();

}

void heiw::infomiss(int a)//接收图片对象丢失信号

{

miss+=a;

str1=QString("%1").arg(miss);

ui->missEdit->setText(str1);

if(miss>=10)

result();

}

void heiw::result()//游戏试玩结果超过20分为赢 ,丢失10个为输,并设置

重新开始按钮

{

if(point>=20)

label->setText(tr("好吧!你赢了"));

else

label->setText(tr("你输了!!哈哈"));

label->show();

for(int i=0;i<4;i++)

{

disconnect(pp[i],SIGNAL(point(int)),this,SLOT(info(int)));

disconnect(pp[i],SIGNAL(miss(int)),this,SLOT(infomiss(int)));

delete pp[i];

}

ui->startGame->setText(tr("重新开始"));

sound->play();

point=0;

miss=0;

ui->pointEdit->setText(tr("0"));

ui->missEdit->setText(tr("0"));

starts=false;

Gnew=true;

}

游戏运行结果如下:

本文标签: 图片游戏丢失点击下坠