在ubuntu上用QT写一个简单的C++小游戏(附源码)
创始人
2024-01-17 13:36:50

最近老师让用Qt写一个可视化界面,然后就给了一个小视频,好奇的不得了,就照着做了一下
视频链接如下:C++案例教学–一个类游戏小程序的设计与实现全过程–用到QT-简单的STL容器


创建项目

1、打开QT
如果不知道怎么下载的话,可以参考这篇文章

在这里插入图片描述2、在这里可以修改项目的名字和保存位置

在这里插入图片描述
3、之后就按照默认的,一直按[next]就可以了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码如下

开始写代码了,具体操作老师在视频里全都说明了,这里只附上代码,希望对不想敲代码的朋友有帮助
在这里插入图片描述
以下这些代码都是自动生成后修改过的代码
ballobject.h

#ifndef BALLOBJECT_H
#define BALLOBJECT_H
#include 
#include //需要一些ball的共有属性和方法
class BaseBall
{
public:BaseBall();virtual ~BaseBall();int x, y;//位置int r;//半径virtual void LiveOneTimeSlice()=0;//存活在一个时间片里面virtual std::string GetClassName(){return "BaseBall";//获取对象所属的类的名字};
};class PassiveBall :public BaseBall
{
public:PassiveBall():BaseBall(){};void LiveOneTimeSlice() override;std::string GetClassName() override;
};class PlayerBall : public PassiveBall
{
public:PlayerBall():PassiveBall(){};std::string GetClassName() override;
};class RandomMoveBall :public BaseBall
{
public:RandomMoveBall():BaseBall(){};void LiveOneTimeSlice() override;std::string GetClassName() override;};
#endif // BALLOBJECT_H

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include 
#include 
#include "ballobject.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QTimer *timer;std::vector objList;//障碍物列表PlayerBall *playerball;//玩家来控制的小球void paintEvent(QPaintEvent *);void keyPressEvent(QKeyEvent *ev);void TimerEvent();
};
#endif // MAINWINDOW_H

ballobject.cpp

#include "ballobject.h"std::default_random_engine generator;
std::uniform_int_distribution distribution(0,100);
BaseBall::BaseBall()
{x = y = 0;r = 30;}BaseBall::~BaseBall()
{}void PassiveBall::LiveOneTimeSlice()
{}std::string PassiveBall::GetClassName()
{return "PassiveBall";
}std::string PlayerBall::GetClassName()
{return "PlayerBall";
}void RandomMoveBall::LiveOneTimeSlice()
{bool bLeft = distribution(generator)>49;x = bLeft ?x-20:x+20;bool bUp = distribution(generator)>49;y = bUp?y-10:y+10;
}std::string RandomMoveBall::GetClassName()
{return "RandomMoveBall";
}

mainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include "ballobject.h"
#include 
#include MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//设定定时器Timer,每秒刷新30次,FPS=30,大概是三十毫秒timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &MainWindow::TimerEvent);timer->start(50);//创建游戏对象1int objectsNum = 10;int H = this->height();int W = this->width();int xstep = (W - objectsNum*20)/(objectsNum-1);for(int i = 0;i < objectsNum;i++){PassiveBall* obj = new PassiveBall();//排放障碍物obj->x=i*(obj->r*2 + xstep)+obj->r;obj->y=H/2;obj->r=10;objList.push_back(obj);}//创建游戏对象2for(int i = 0;i < objectsNum;i++){RandomMoveBall* obj = new RandomMoveBall();//排放障碍物obj->x=i*(obj->r*2 + xstep)+obj->r;obj->y=H/2 - 20;obj->r=20;objList.push_back(obj);}//创建游戏对象3for(int i = 0;i < objectsNum;i++){RandomMoveBall* obj = new RandomMoveBall();//排放障碍物obj->x=i*(obj->r*2 + xstep)+obj->r;obj->y=H/2 - 20;obj->r=20;objList.push_back(obj);}//初始化玩家位置TODOplayerball = new PlayerBall();playerball->x = W/2;playerball->y = H;playerball->r=10;
}MainWindow::~MainWindow()
{delete ui;delete timer;//不删除就会内存泄露for(auto itm:objList){delete itm;}delete playerball;
}void MainWindow::paintEvent(QPaintEvent *)
{
//    static int x = 0;//    QPainter painter(this);
//    painter.setPen(Qt::red);
//    painter.setFont(QFont("楷体", 50));
//    painter.drawText(rect(), Qt::AlignCenter, "我爱你中国");//    painter.setPen(Qt::blue);
//    painter.setFont(QFont("楷体",500));
//    painter.drawEllipse(x,0,100,100);
//    x+=20;//给每一个游戏对象存活一个时间片for(auto itm:objList){itm->LiveOneTimeSlice();}//绘制整个游戏场景QPainter painter(this);painter.setPen(Qt::black);for(auto itm:objList){QBrush brush(QColor(0,200,250),Qt::Dense4Pattern);painter.setBrush(brush);painter.drawEllipse(itm->x-itm->r,itm->y-itm->r,itm->r*2,itm->r*2);}painter.setPen(Qt::darkBlue);QBrush brush(QColor(250,20,80),Qt::Dense4Pattern);painter.setBrush(brush);painter.drawEllipse(playerball->x-playerball->r,playerball->y-playerball->r,playerball->r*2,playerball->r*2);}void MainWindow::keyPressEvent(QKeyEvent *ev)
{if(ev->key()==Qt::Key_Up){playerball->y-=10;qDebug()<<"Press Key Up";return ;}if(ev->key()==Qt::Key_Down){playerball->y+=10;qDebug()<<"Press Key Down";return ;}if(ev->key()==Qt::Key_Left){playerball->x-=10;qDebug()<<"Press Key Left";return ;}if(ev->key()==Qt::Key_Right){playerball->x+=10;qDebug()<<"Press Key Right";return ;}
}void MainWindow::TimerEvent()
{//还要判断失败for(auto itm:objList){float distSqure = (itm->x - playerball->x)*(itm->x - playerball->x)+(itm->y - playerball->y)*(itm->y - playerball->y);if(distSqure<=((itm->r + playerball->r)*(itm->r + playerball->r))){qDebug() <<"Failed!";timer->stop();}}//判断成功if(playerball->y <= 0){qDebug() <<"Success!";timer->stop();}update();
}

效果如下

在这里插入图片描述
在这里插入图片描述
按动键盘上的上下左右键可以控制红色小球从下面往上跑,在不碰到蓝色小球的情况下安全到达最上方就挑战成功啦~

一点小问题

如果你下载的QTcreator版本在6以上,很有可能不能输入中文,虽然可以输出,如果是6以下的版本,可以采用一下方法修改配置,使其可以输入中文。

由Qt开发的软件界面不能输入中文
安装fcitx-libs-qt或fcitx-libs-qt5,在计算机中搜索libfcitxplatforminputcontextplugin.so文件,例如在我的计算机上,此文件位于

/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so

找到Qt的安装目录,将上述文件复制到安装目录下的plugins/platforminputcontexts子目录下。
重新运行程序即可。

QtCreator本身的编辑器不能输入中文
如果是QtCreator本身编辑器不能输入中文,则将上述文件拷贝至Qt安装目录的[Qt安装目录]/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts或者[Qt安装目录]/Tools/QtCreator/bin/plugins/platforminputcontexts。
对于不同版本的Qt,插件路径可能略有不同,但一定是在[Qt安装目录]/Tools/QtCreator/中,可以自己搜索一下。拷贝完成后,重新启动QtCreator即可生效。


看了老师的视频就知道老师想要实现一个HuntPlayerBall去追踪玩家,但是由于时间的限制没能实现,那我这个垃圾实现了更简单的功能,希望老师看到了不要嫌弃。

代码如下

ballobject.h

#ifndef BALLOBJECT_H
#define BALLOBJECT_H
#include 
#include //需要一些ball的共有属性和方法
class BaseBall
{
public:BaseBall();virtual ~BaseBall();int x, y;//位置int r;//半径virtual void LiveOneTimeSlice()=0;//存活在一个时间片里面virtual std::string GetClassName(){return "BaseBall";//获取对象所属的类的名字};
};class PassiveBall :public BaseBall
{
public:PassiveBall():BaseBall(){};void LiveOneTimeSlice() override;std::string GetClassName() override;
};class PlayerBall : public PassiveBall
{
public:PlayerBall():PassiveBall(){};std::string GetClassName() override;
};class RandomMoveBall :public BaseBall
{
public:RandomMoveBall():BaseBall(){};void LiveOneTimeSlice() override;std::string GetClassName() override;};
class HuntPlayerBall :public BaseBall
{
public:HuntPlayerBall():BaseBall(){};void LiveOneTimeSlice() override;std::string GetClassName() override;};
#endif // BALLOBJECT_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include 
#include 
#include "ballobject.h"
#include 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QTimer *timer;std::vector objList1;//障碍物列表std::vector objList2;//障碍物列表std::vector objList3;//障碍物列表PlayerBall *playerball;//玩家来控制的小球void paintEvent(QPaintEvent *);void keyPressEvent(QKeyEvent *ev);void TimerEvent();};
#endif // MAINWINDOW_H

ballobject.cpp

#include "ballobject.h"std::default_random_engine generator;
std::uniform_int_distribution distribution(0,100);
BaseBall::BaseBall()
{x = y = 0;r = 30;}BaseBall::~BaseBall()
{}void PassiveBall::LiveOneTimeSlice()
{}std::string PassiveBall::GetClassName()
{return "PassiveBall";
}std::string PlayerBall::GetClassName()
{return "PlayerBall";
}void RandomMoveBall::LiveOneTimeSlice()
{bool bLeft = distribution(generator)>49;x = bLeft ?x-10:x+10;bool bUp = distribution(generator)>49;y = bUp?y-10:y+10;
}std::string RandomMoveBall::GetClassName()
{return "RandomMoveBall";
}void HuntPlayerBall::LiveOneTimeSlice()
{bool bLeft = distribution(generator)>49;x = bLeft ?x-20:x+20;bool bUp = distribution(generator)>49;y = bUp?y-10:y+10;
}std::string HuntPlayerBall::GetClassName()
{return "HuntPlayerBall";
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include 
#include 
#include "ballobject.h"
#include 
#include 
#include 
#include //添加随机数种子,作用:利用当前系统时间生成随机数,以此来防止每一次的随机数相同
#include  //添加头文件MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//设定定时器Timer,每秒刷新30次,FPS=30,大概是三十毫秒timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &MainWindow::TimerEvent);timer->start(50);
//    start = new QTimer(this);
//    connect(start, &QTimer::timeout, this, &MainWindow::StartEvent);//创建游戏对象1int objectsNum = 10;int H = this->height();int W = this->width();int xstep = (W - objectsNum*20)/(objectsNum-1);for(int i = 0;i < 30;i++){PassiveBall* obj = new PassiveBall();//排放障碍物int bLeft = QRandomGenerator::global()->bounded(100,1200);//qDebug()<x=bLeft;int bRight = QRandomGenerator::global()->bounded(100,1200);//qDebug()<y=bRight;obj->r=15;objList1.push_back(obj);}//创建游戏对象2for(int i = 0;i < objectsNum;i++){RandomMoveBall* obj = new RandomMoveBall();//排放障碍物obj->x=i*(obj->r*2 + xstep)+obj->r;obj->y=H/2 - 20;obj->r=20;objList2.push_back(obj);}//创建游戏对象3for(int i = 0;i < objectsNum;i++){HuntPlayerBall* obj = new HuntPlayerBall();//排放障碍物srandobj->x=i*(obj->r*2 + xstep)+obj->r;obj->y=H/2 - 20;obj->r=10;objList3.push_back(obj);}//初始化玩家位置TODOplayerball = new PlayerBall();playerball->x = W/2;playerball->y = H;playerball->r=10;
}MainWindow::~MainWindow()
{delete ui;delete timer;//不删除就会内存泄露for(auto itm:objList1){delete itm;}for(auto itm:objList2){delete itm;}for(auto itm:objList3){delete itm;}delete playerball;
}void MainWindow::paintEvent(QPaintEvent *)
{
//    static int x = 0;//    QPainter painter(this);
//    painter.setPen(Qt::red);
//    painter.setFont(QFont("楷体", 50));
//    painter.drawText(rect(), Qt::AlignCenter, "我爱你中国");//    painter.setPen(Qt::blue);
//    painter.setFont(QFont("楷体",500));
//    painter.drawEllipse(x,0,100,100);
//    x+=20;//给每一个游戏对象存活一个时间片for(auto itm:objList1){itm->LiveOneTimeSlice();}for(auto itm:objList2){itm->LiveOneTimeSlice();}for(auto itm:objList3){itm->LiveOneTimeSlice();}//绘制整个游戏场景QPainter painter(this);painter.setPen(Qt::black);for(auto itm:objList1){QBrush brush(QColor(0,200,0),Qt::Dense4Pattern);painter.setBrush(brush);painter.drawEllipse(itm->x-itm->r,itm->y-itm->r,itm->r*2,itm->r*2);}for(auto itm:objList2){QBrush brush(QColor(0,200,250),Qt::Dense4Pattern);painter.setBrush(brush);painter.drawEllipse(itm->x-itm->r,itm->y-itm->r,itm->r*2,itm->r*2);}for(auto itm:objList3){QBrush brush(QColor(250,20,20),Qt::Dense4Pattern);painter.setBrush(brush);painter.drawEllipse(itm->x-itm->r,itm->y-itm->r,itm->r*2,itm->r*2);}painter.setPen(Qt::darkBlue);QBrush brush(QColor(255,255,0),Qt::Dense4Pattern);painter.setBrush(brush);painter.drawEllipse(playerball->x-playerball->r,playerball->y-playerball->r,playerball->r*2,playerball->r*2);}void MainWindow::keyPressEvent(QKeyEvent *ev)
{if(ev->key()==Qt::Key_Up){playerball->y-=30;qDebug()<<"Press Key Up";return ;}if(ev->key()==Qt::Key_Down){playerball->y+=30;qDebug()<<"Press Key Down";return ;}if(ev->key()==Qt::Key_Left){playerball->x-=30;qDebug()<<"Press Key Left";return ;}if(ev->key()==Qt::Key_Right){playerball->x+=30;qDebug()<<"Press Key Right";return ;}
}void MainWindow::TimerEvent()
{//还要判断失败for(auto itm:objList1){float distSqure = (itm->x - playerball->x)*(itm->x - playerball->x)+(itm->y - playerball->y)*(itm->y - playerball->y);if(distSqure<=((itm->r + playerball->r)*(itm->r + playerball->r))){qDebug() <<"Failed!";timer->stop();}}for(auto itm:objList2){float distSqure = (itm->x - playerball->x)*(itm->x - playerball->x)+(itm->y - playerball->y)*(itm->y - playerball->y);if(distSqure<=((itm->r + playerball->r)*(itm->r + playerball->r))){qDebug() <<"Failed!";timer->stop();}}for(auto itm:objList3){float distSqure = (itm->x - playerball->x)*(itm->x - playerball->x)+(itm->y - playerball->y)*(itm->y - playerball->y);if(distSqure<=((itm->r + playerball->r)*(itm->r + playerball->r))){qDebug() <<"Failed!";timer->stop();}}for(auto itm:objList3){float distSqure = sqrt((itm->x - playerball->x)*(itm->x - playerball->x)+(itm->y - playerball->y)*(itm->y - playerball->y));if(distSqure<=(itm->r + playerball->r+200)){float x_dis=(playerball->x - itm->x)/distSqure;float y_dis=(playerball->y - itm->y)/distSqure;itm->x+=x_dis*10;itm->y+=y_dis*10;}}//判断成功if(playerball->y <= 0){qDebug() <<"Success!";timer->stop();}update();
}

效果如下

红色小球会追踪,顺便绿色小球每次编译刷新

在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
怎么样消灭臭虫 臭虫用什么药消... 奔奔虫控|被吸血臭虫骚扰的滋味,你体会过吗?相信被臭虫骚扰过的人都不想再体验一次了吧?那么臭虫应该怎...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
苁蓉的食用方法 鲜苁蓉的吃法有... 肉苁蓉号称“温而不热,补而不峻,暖而不燥,滑而不泄,故有从容之名。”历来也是传统药食同源的滋补佳品。...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...