#include "mainw.h"
#include "ui_mainw.h"
//#include <windows.h>
//#include <QTime>
MainW::MainW(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MainW)
{
//初始化ui
ui->setupUi(this);
setFixedSize(260,400);
//初始化
init();
//进度条
//初始化边界
// progressBarBoundary = 100;
ui->progressBar->setRange(0, proBarBoundary);
//初始化显示
/*
* %v - 被当前值所取代
* %m - 被总步数所取代
*/
ui->progressBar->setFormat(" %v / %m");
//程序打开,启动进度条
startProTimer();
//在子窗口更改昵称,主窗口昵称刷新
connect(®Widget, &Register::reNamed, this, &MainW::registered);
//在丹药子窗口使用混元丹,主窗口增加修炼进度
connect(&medicineWidget, &Medicine::hunyuanUsed, this, &MainW::hunyuanUse);
//在丹药子窗口使用凝气丹,主窗口增加修炼进度
connect(&medicineWidget, &Medicine::ningqiUsed, this, &MainW::ningqiUse);
}
MainW::~MainW()
{
delete ui;
}
void MainW::init(){
//一个配置
// QSettings * m_psetting = nullptr;
QCoreApplication::applicationDirPath(); //获取可执行文件所在路径
QString configFileName = QCoreApplication::applicationDirPath() + "/Config.ini";
//根据Config.ini路径new QSetting对象
myConfig = new QSettings(configFileName, QSettings::IniFormat);
//判断Config.ini是否存在,若不存在则再可执行文件的同级目录下创建一个Config.ini
QFileInfo fileInfo(configFileName);
if(!fileInfo.exists())
{
//打印创建文件的路径
qDebug("%s 不存在。", configFileName.toLatin1().data());
//写入默认值
myConfig->beginGroup("player");
myConfig->setValue("name", "未知");
myConfig->setValue("level", 0);
myConfig->setValue("progress", 0);
myConfig->setValue("martialmethod", 0);
myConfig->setValue("proSpeed", 40);
myConfig->endGroup();
myConfig->beginGroup("bag");
myConfig->setValue("hunyuan", 0);
myConfig->setValue("ningqi", 0);
myConfig->setValue("money", 500);
}
//读取配置
QString initName = myConfig->value("player/name").toString();
int initProgress = myConfig->value("player/progress").toInt();
int initLevel = myConfig->value("player/level").toInt();
int initMartialMethod = myConfig->value("player/martialmethod").toInt();
int initHunyuan = myConfig->value("bag/hunyuan").toInt();
int initNingqi = myConfig->value("bag/ningqi").toInt();
int initMoney = myConfig->value("bag/money").toInt();
//输出日志
qDebug() << "昵称:" << initName;
qDebug() << "进度:" << initProgress;
qDebug() << "境界:" << initLevel;
qDebug() << "功法:" << initMartialMethod;
qDebug() << "修炼速度:" << myConfig->value("player/proSpeed").toInt();
qDebug() << "混元丹:" << initHunyuan;
qDebug() << "凝气丹:" << initNingqi;
qDebug() << "钱:" << initMoney;
//昵称初始化
ui->name->setText(initName);
//如果已注册昵称则隐藏注册按钮
if(initName != "未知")
{
ui->regBtn->hide();
}
//境界初始化
newLevel = initLevel;
if(initLevel == 0)
{
ui->stateLabel->setText("炼气");
}
else if(initLevel == 1)
{
ui->stateLabel->setText("筑基");
}
else if(initLevel == 2)
{
ui->stateLabel->setText("金丹");
}
else if(initLevel == 3)
{
ui->stateLabel->setText("元婴");
}
else if(initLevel == 4)
{
ui->stateLabel->setText("合体");
}
else if(initLevel == 5)
{
ui->stateLabel->setText("大乘");
}
else if(initLevel == 6)
{
ui->stateLabel->setText("渡劫");
}
else if(initLevel == 7)
{
ui->stateLabel->setText("仙");
}
else
{
qDebug() << "配置出错";
ui->stateLabel->setText("配置读取出错,请尝试重启本软件");
}
//修炼速度初始化
proSpeed = myConfig->value("player/proSpeed").toInt();
//练功进度初始化
ui->progressBar->setValue(initProgress);
tick = initProgress;
//功法初始化
//初始化功法存储数组
QStringList Methods;
Methods << "未知功法" << "人族修炼总纲" << "晨曦吐纳法" << "管理员的黑科技";
//初始化功法修炼速度数组
QVector<double> MethodsVelocity(505);
MethodsVelocity = {1,1.1,1.2,20};
//数组显示临时放置
QStringList methods;
//取个位
int unit = initMartialMethod % 10;
//添加功法
methods << Methods.at(unit);
//添加速度
qDebug() << "修炼速度除数:" << MethodsVelocity.at(unit);
proSpeed = int(proSpeed / MethodsVelocity.at(unit));
// methods << "未知功法";
ui->MartialMethodList->addItems(methods);
}
void MainW::startProTimer()
{
//用qTimer来控制进度条
proTimer = new QTimer();
connect(this->proTimer, SIGNAL(timeout()), this, SLOT(start()));
proTimer->start(proSpeed); //50可以换成其他数值,越大进度条越慢,越小进度条越快
}
void MainW::start()
{
if(tick < proBarBoundary+1)
{
tick = ui->progressBar->value()+1;
ui->progressBar->setValue(tick++);
}
else
{
tick = 1;
ui->progressBar->reset(); //进度条归零
//提升境界
newLevel ++;
//境界判断,更改显示
levelJudge();
//修改修炼速度
// proSpeed = int(proSpeed * 4);
//修改进度条边界
proBarBoundary = proBarBoundary * int(pow(2,newLevel));
ui->progressBar->setRange(0, proBarBoundary);
proTimer->start(proSpeed);
}
}
void MainW::on_list_clicked()
{
//排行榜功能未开发提示
QMessageBox::information(this, "提示", "暂未开发,敬请期待", QMessageBox::Ok , QMessageBox::Ok);
}
void MainW::on_medicine_clicked()
{
//显示丹药子窗口
medicineWidget.show();
}
void MainW::on_regBtn_clicked()
{
//显示昵称编辑界面
regWidget.show();
}
void MainW::on_magicWeapons_clicked()
{
//法宝功能未开发提示
QMessageBox::information(this, "提示", "暂未开发,敬请期待", QMessageBox::Ok , QMessageBox::Ok);
}
//境界判断更新显示函数
void MainW::levelJudge()
{
if(newLevel == 0)
{
ui->stateLabel->setText("炼气");
}
else if(newLevel == 1)
{
ui->stateLabel->setText("筑基");
}
else if(newLevel == 2)
{
ui->stateLabel->setText("金丹");
}
else if(newLevel == 3)
{
ui->stateLabel->setText("元婴");
}
else if(newLevel == 4)
{
ui->stateLabel->setText("合体");
}
else if(newLevel == 5)
{
ui->stateLabel->setText("大乘");
}
else if(newLevel == 6)
{
ui->stateLabel->setText("渡劫");
}
else if(newLevel == 7)
{
ui->stateLabel->setText("仙");
}
else
{
qDebug() << "境界判断出错";
ui->stateLabel->setText("出错,请尝试重启本软件");
}
}
//刷新昵称函数
void MainW::registered()
{
QString Name = myConfig->value("player/name").toString();
ui->name->setText(Name);
//隐藏注册按钮
ui->regBtn->hide();
}
//使用混元丹
void MainW::hunyuanUse()
{
//修炼进度增加100
int proValue = ui->progressBar->value();
qDebug() << proValue;
proValue += 100;
qDebug() << proValue;
ui->progressBar->setValue(proValue);
}
//使用凝气丹
void MainW::ningqiUse()
{
//修炼进度增加500
int proValue = ui->progressBar->value();
qDebug() << proValue;
proValue += 500;
qDebug() << proValue;
ui->progressBar->setValue(proValue);
}
基于C++开发的摸鱼修仙的小游戏,通过QT创建 有丹药、灵石系统
需积分: 0 200 浏览量
更新于2024-03-23
3
收藏 104KB ZIP 举报
在本项目中,开发者利用C++编程语言以及Qt框架创建了一个名为"摸鱼修仙"的小游戏。这个项目展示了如何将这两种技术结合,构建出一个包含丹药和灵石系统的趣味游戏。以下是对这个项目中涉及的主要知识点的详细说明:
1. C++编程语言:C++是一种强大的、通用的编程语言,具有面向对象特性,支持类、继承、多态等概念。在这个项目中,C++被用来编写游戏的核心逻辑,包括角色的状态管理、丹药和灵石的效果计算、游戏规则的实现等。
2. Qt框架:Qt是跨平台的C++图形用户界面应用程序开发框架,广泛用于创建桌面和移动应用。开发者使用Qt来设计和实现游戏的用户界面,包括窗口、按钮、文本框等元素,使玩家能够直观地与游戏互动。
3. GUI编程:Qt提供了一套丰富的控件和API,用于构建图形用户界面。在"摸鱼修仙"游戏中,这些控件可能包括游戏主菜单、角色信息面板、丹药和灵石的图标等。开发者通过信号和槽机制连接UI元素和背后的游戏逻辑,实现用户操作与游戏状态的同步。
4. 文件系统交互:游戏可能包含保存和读取进度的功能,这就需要与文件系统进行交互。Qt提供了QFile和QDataStream类,可以方便地进行文件的读写操作,实现游戏数据的持久化存储。
5. 对象模型设计:在丹药和灵石系统中,每个元素(如丹药、灵石)都可能有自己的属性和行为。开发者需要设计合适的类结构来表示这些对象,例如定义丹药类和灵石类,包含其属性(如效果、价格等)以及方法(如使用、获取等)。
6. 数据结构和算法:为了高效地管理游戏中的资源,开发者可能使用了数组、链表、哈希表等数据结构。例如,丹药和灵石可能存储在一个集合中,通过键值对或索引快速查找和访问。
7. 事件驱动编程:游戏通常采用事件驱动模式,当用户做出操作(如点击按钮)时,会触发相应的事件处理函数。Qt的事件处理机制使得开发者能轻松响应用户输入,更新游戏状态。
8. 错误处理和调试:在开发过程中,良好的错误处理和调试能力至关重要。Qt提供了异常处理机制,开发者应确保程序在遇到问题时能够适当地处理异常并给出反馈。
9. 跨平台性:Qt的一大优势是跨平台性,这意味着"摸鱼修仙"游戏可以在Windows、Linux、macOS甚至移动设备上运行,只需编写一次代码。
10. 游戏逻辑:游戏的规则和玩法是核心部分,开发者需要设计一套完整的规则,包括角色升级、丹药效果、灵石功能等,并用C++实现这些逻辑。
通过这个项目,开发者不仅可以提升C++编程技能,还能深入理解Qt框架的使用,同时锻炼面向对象设计和游戏开发能力。对于学习者而言,这是一个很好的实践案例,可以从中学习到软件开发的多个方面。

MarcoPage
- 粉丝: 4657
最新资源
- 典型监控系统基于PLC的泵站监控_论文.doc
- 2023年最新大学生网络安全知识竞赛.doc
- 阿里云腾讯云百度云究竟谁比较厉害一文解析云计算的未来趋势.pdf
- 2023年年度工作业绩汇报通信线路维护类.docx
- Oracle电子商务建设方案详细.doc
- 2023年app网络推广策划书方案.doc
- 财务会计与核算信息化管理知识分析.pptx
- 2023年中国医科大学网络学院11月老年护理学试题答案.doc
- DB22_T_2039_2014_工业锅炉节能运行管理规范.pdf
- AutoCAD桥梁制图的讲解及要求.pptx
- PILZ安全PLC资料.ppt
- 2023年山东省职业院校技能大赛高职组计算机网络组建与信息安全技术项目竞赛规程.doc
- AdobePremiere案例教学.ppt
- DB22_T_397.7_2017_保健用品功能学评价程序和检验方法_第7部分:改善皮肤瘙痒功能检验方法.pdf
- IPMP项目管理(PPT374页).pptx
- ORACLE相关:表空间、序列、索引、分区、游标、存储过程、分区等创建.doc