qt-有趣的小球游戏大球吃小球

qt-有趣的小球游戏大球吃小球

  • 一、演示效果
  • 二、核心程序
  • 三、下载链接


一、演示效果

请添加图片描述

二、核心程序

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "organism.h"
#include "badorganism.h"
#include <QPainter>
#include <QTime>
#include <QTimer>
#include <QPushButton>
#include <QMessageBox>
#include <cstdlib>
#include <QVBoxLayout>
#include <QThread>// zmienne globalne
bool show_widget = true; // zmienna która operuje przycisk Esc(zamyka i otwiera widget_2)
bool game_on = false; // zmienna która umożliwia wysłanie sygnału Esc tylko gdy symulacja jest aktywnadaMainWindow::MainWindow(QWidget *parent): QMainWindow(parent),ui(new Ui::MainWindow),foodTimer(new QTimer(this)){ui->setupUi(this);timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &MainWindow::updateTimer);timer->start(1000);QTimer *timer_l = new QTimer(this);connect(timer_l, SIGNAL(timeout()), this, SLOT(incrementOrganismTime()));timer_l->start(1000); // Uruchamiamy timer co sekundę (1000 ms)resize(1400, 1000);//ustawienia domyślneui->organizm_speed->setValue(25); // Prędkość organizmuui->food_slider1->setValue(5); // Ilość potrzebna do rozmnarzaniaui->food_slider2->setValue(20);// Ilość jedzenia na mapieui->food_show_time->hide(); // ukrycie opcji ustawienia czasu pojawiania się jedzeniaui->s_label->hide();ui->organism_time->setValue(1.00); // czas życia organizmuui->bad_organisms_number->setValue(3); // ilośc złych organizmówui->bad_organizm_speed->setValue(50);  // Prędkość złego organizmuui->bad_organism_damage->setValue(2); // damage złego organizmu// ui->infoButton->hide();// ukrywanie obiektów w menuui->widget->hide();ui->widget_2->hide();ui->widget_3->hide();ui->widget_settings->hide();}MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::startSimulation()
{// Rozpocznij odliczanie czasuelapsedTimer.start();elapsedSeconds = 0;// Rozpocznij odliczanie czasu w timerzetimer->start(1000); // Aktualizuj co 1000 ms (1 sekunda)}void MainWindow::stopSimulation()
{// Zatrzymaj odliczanie czasu w timerzetimer->stop();
}
void MainWindow::incrementOrganismTime()
{for (int i = 0; i < organisms.size(); i++) {Organism &organism = organisms[i];organism.time++;}
}void MainWindow::updateTimer()
{int elapsedSeconds = elapsedTimer.elapsed() / 1000;int minutes = elapsedSeconds / 60;int seconds = elapsedSeconds % 60;QString timeText = QString("%1:%2").arg(minutes, 2, 10, QLatin1Char('0')).arg(seconds, 2, 10, QLatin1Char('0'));ui->timerLabel->setText(timeText);
}void MainWindow::on_startButton_clicked()
{game_on = true;ui->widget->setStyleSheet("background-color: rgba(255, 255, 255, 0.5);");// wyswietlanie interfejsuui->widget->show();// ukrywanie przyciskowui->widget_menu->hide();// Inicjalizacja kulki na środku mapyOrganism organism;organism.position = QPoint(width() / 2, height() / 2);organisms.append(organism);// Inicjalizacja złego organizmusrand(time(NULL));for(int i=0; i<ui->bad_organisms_number->value(); i++){BadOrganism bad_organism;bad_organism.generatePosition(width(), height());bad_organisms.append(bad_organism);}// Utworzenie timera i połączenie sygnału timeout() z metodą moveOrganisms()timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &MainWindow::moveOrganisms);timer->start(ui->organizm_speed->value()); // Uruchomienie timera dla organizmu// Utworzenie timera dla złego organizmu i połączenie sygnału z moveBadOrganisms()timer_bad = new QTimer(this);connect(timer_bad, &QTimer::timeout, this, &MainWindow::moveBadOrganisms);timer_bad->start(100 - ui->bad_organizm_speed->value() + 10);// Utworzenie timera do generowania jedzeniaconnect(foodTimer, &QTimer::timeout, this, &MainWindow::spawnFood);// Uruchomienie timera dla jedzeniaif(ui->checkBox->isChecked())foodTimer->start(ui->food_show_time->value() * 1000);elsefoodTimer->start(1);timer->start();foodTimer->start();// Zresetuj elapsedTimerelapsedTimer.restart();// Rozpocznij odliczanie czasuconnect(timer, &QTimer::timeout, this, &MainWindow::updateTimer);timer->start(1000);}void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);// Rysowanie organizmówfor (Organism &organism : organisms) {organism.paintOrganism(painter);}painter.setBrush(Qt::red);for (const Organism &organism : bad_organisms) {painter.drawEllipse(QRect(organism.position.x(), organism.position.y(), organism.size, organism.size));}// Rysowanie jedzeniapainter.setBrush(Qt::green);for (const QRect &foodRect : foodList) {painter.drawEllipse(foodRect);}
}void MainWindow::moveOrganisms()
{for (int i = 0; i < organisms.size(); i++) {Organism &organism = organisms[i];// Usunięcie organizmu któremu skończył się czasif(organism.time >= ui->organism_time->value() * 60){organisms.removeAt(i);int count = ui->organizmCounter->text().toInt();ui->organizmCounter->setText(QString::number(count - 1));}organism.directOrganism(width(), height());for (int j = 0; j < foodList.size(); j++) {const QRect &foodRect = foodList[j];if (foodRect.intersects(QRect(organism.position, QSize(organism.size, organism.size)))) {// Usunięcie zjedzonego jedzeniafoodList.removeAt(j);// Zwiększenie licznika zjedzonego jedzenia dla organizmuorganism.foodCounter++;// Zwiększenie wielkości organizmuorganism.size += 2;// Sprawdzenie, czy organizm zjadł wystarczającą ilość jedzenia do rozmnożeniaif (organism.foodCounter >= ui->food_slider1->value()) {// Skopiowanie cech rodzica dla nowego organizmuOrganism newOrganism;newOrganism.position = organism.position;organism.foodCounter = 0;organism.size = 50;// Dodanie nowego organizmu do listyorganisms.append(newOrganism);//wyswietlenie licznika organizmówint count = ui->organizmCounter->text().toInt();ui->organizmCounter->setText(QString::number(count + 1));}// Przerwanie pętli, ponieważ zderzenie z jedzeniem wystąpiło tylko raz dla danego organizmubreak;}}// Zakończenie symulacjiif(ui->organizmCounter->text().toInt() <= 0)endSymulation();}//ustawnienie predkosci organizmutimer->start(30 - ui->organizm_speed->value());// Odświeżenie widokuupdate();
}void MainWindow::moveBadOrganisms(){for(int i=0; i<bad_organisms.size();i++){Organism &bad_organism = bad_organisms[i];// Poruszanie się złego organizmubad_organism.directOrganism(width(), height());// Kolizje z jedzeniemfor (int j = 0; j < foodList.size(); j++) {const QRect &foodRect = foodList[j];if (foodRect.intersects(QRect(bad_organism.position, QSize(bad_organism.size, bad_organism.size)))) {foodList.removeAt(j);}}// Kolizja z głównym organizmemfor (int j = 0; j < organisms.size(); j++) {Organism &organism = organisms[j];if (QRect(organism.position, QSize(organism.size, organism.size)).intersects(QRect(bad_organism.position, QSize(bad_organism.size, bad_organism.size)))) {// Animacja zderzeniahittingAnimation(&organism);// "Odbicie sie" od złego organizmuorganism.direction.setX(-organism.direction.x());organism.direction.setY(-organism.direction.y());// Zmniejszenie licznika jedzieniaorganism.foodCounter -= ui->bad_organism_damage->value();// Zmniejszenie wielkości organizmuorganism.size -= ui->bad_organism_damage->value();if(organism.foodCounter <= 0){// Usunięcie organizmuorganisms.removeAt(j);// Licznik organizmów -1int count = ui->organizmCounter->text().toInt();ui->organizmCounter->setText(QString::number(count - 1));}}// Zakończenie symulacjiif(ui->organizmCounter->text().toInt() <= 0)endSymulation();}}update();
}void MainWindow::hittingAnimation(Organism *organism)
{organism->color = Qt::red;update();QTimer::singleShot(100, this, [organism, this]() {organism->color = Qt::black;update();});
}void MainWindow::spawnFood()
{// Generowanie losowej pozycji jedzeniaint foodX = rand() % (width() - 25);int foodY = rand() % (height() - 25);// Tworzenie prostokąta reprezentującego jedzenie i dodawanie go do listyQRect foodRect(foodX, foodY, 25, 25);foodList.append(foodRect);// Ograniczenie liczby elementów w liście jedzeniaif (foodList.size() > ui->food_slider2->value()) {foodList.removeLast();}// Odświeżenie widokuupdate();
}//funkcja do wyśrodkowywanmia widgetów w oknie
void MainWindow::resizeEvent(QResizeEvent *event)
{// widget_2ui->widget_2->setGeometry((width()/2) -200, (height()/2) -175, 400, 350);// widget_menuui->widget_menu->setGeometry((width()/2) -200, (height()/2) -200, 400, 400);// widget_3ui->widget_3->setGeometry((width()/2) -200, (height()/2) -175, 400, 350);// widget_settingsui->widget_settings->setGeometry((width()/2) -400, (height()/2) -250, 800, 500);
}void MainWindow::endSymulation()
{ui->widget_3->show();timer->stop();timer_bad->stop();foodTimer->stop();
}void MainWindow::on_settingsButton_clicked()
{ui->widget_settings->show();}void MainWindow::on_menu_backButton_clicked()
{ui->widget_settings->hide();
}void MainWindow::on_infoButton_clicked(){}void MainWindow::on_exitButton_clicked()
{close();
}void MainWindow::keyPressEvent(QKeyEvent *event){if(game_on){if (event->key() == Qt::Key_Escape && show_widget){on_pauseButton_clicked();}else{on_continueButton_clicked();}}
}void MainWindow::on_pauseButton_clicked()
{ui->widget_2->show(); // pokazanie opcji pausetimer->stop();timer_bad->stop();foodTimer->stop();show_widget = false;
}void MainWindow::on_continueButton_clicked()
{ui->widget_2->hide(); // ukrycie opcji pause// wznowienie symulacjitimer->start();timer_bad->start();foodTimer->start();show_widget = true;
}void MainWindow::on_restartButton_clicked()
{ui->widget_2->hide(); // ukrycie opcji pauseui->widget_3->hide();// Zatrzymanie timera symulacji, i timeru jedzeniatimer->stop();timer_bad->stop();foodTimer->stop();// Usunięcie organizmów i jedzeniaorganisms.clear();foodList.clear();bad_organisms.clear();// Reset licznika organizmówui->organizmCounter->setText("1");// Powrót do fukncji startButtonon_startButton_clicked();
}void MainWindow::on_menu_exitButton_clicked()
{//wyłączenie symulacjigame_on = false;// czyszczenie ekranuorganisms.clear();foodList.clear();bad_organisms.clear();//odświerzenie ekranuupdate();ui->organizmCounter->setText("1");// schowanie niepotrzebnych widgetów i wyświetlenie menuui->widget->hide();ui->widget_2->hide();ui->widget_3->hide();ui->widget_menu->show();// zatrzymanie timeratimer->stop();timer_bad->stop();foodTimer->stop();}// Obsługa sliderów w ustawieniach
void MainWindow::on_organizm_speed_valueChanged(int value)
{ui->org_speed->setText(QString::number(value));
}void MainWindow::on_food_slider2_valueChanged(int value)
{ui->f_slider2->setText(QString::number(value));
}void MainWindow::on_food_slider1_valueChanged(int value)
{ui->f_slider1->setText(QString::number(value));
}void MainWindow::on_bad_organizm_speed_valueChanged(int value)
{ui->bad_org_speed->setText(QString::number(value/10));
}void MainWindow::on_checkBox_stateChanged(int arg1)
{// obsługa przyciskuif(!arg1){ui->food_show_time->hide();// Niepokazuje obiekty z wyborem czasu gdy jest wciśniety przyciskui->s_label->hide();}else{ui->food_show_time->show();// Pokazuje obiekty z wyborem czasu gdy jest wciśniety przyciskui->s_label->show();}
}void MainWindow::on_default_settings_clicked()
{//potwierdzenie o przywróceniu ustawień domyślnychQMessageBox::StandardButton reply;reply = QMessageBox::question(this, "Przywracanie ustawień domyślnych", "Czy na pewno chcesz przywrócić ustawienia domyślne?",QMessageBox::Yes | QMessageBox::No);if (reply == QMessageBox::Yes) {// Ustawienia domyślneui->organizm_speed->setValue(25);  // Prędkość organizmuui->food_slider1->setValue(5);     // Ilość potrzebna do rozmnażaniaui->food_slider2->setValue(20);    // Ilość jedzenia na mapieui->food_show_time->setValue(0.00);ui->checkBox->setChecked(false);ui->organism_time->setValue(1.00);ui->bad_organisms_number->setValue(3); // ilośc złych organizmówui->bad_organizm_speed->setValue(50);  // Prędkość złego organizmuui->bad_organism_damage->setValue(2); // damage złego organizmu}}void MainWindow::on_restartButton_2_clicked()
{on_restartButton_clicked();
}void MainWindow::on_menu_exitButton_2_clicked()
{on_menu_exitButton_clicked();
}

三、下载链接

https://download.csdn.net/download/u013083044/88861691?spm=1001.2014.3001.5503

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2799318.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C++ Primer 笔记(总结,摘要,概括)——第4章 表达式

目录 4.1 基础 4.1.1 基本概念 4.1.2 优先级与结合律 4.1.3 求值顺序 4.2 算术运算符 4.3 逻辑和关系运算符 4.4 赋值运算符 4.5 递增和递减运算符 4.6 成员访问运算符 4.7 条件运算符 4.8 位运算符 4.9 sizeof运算符 4.10 逗号运算符 4.11 类型转换 4.11.1 算数转换…

宝塔面板-安装与卸载

宝塔面板&#xff08;BT Panel&#xff09;是一款在互联网上广泛使用的服务器管理软件&#xff0c;它以其简洁的界面和强大的功能受到了许多站长的喜爱。通过宝塔面板&#xff0c;用户可以轻松地管理服务器上的网站、数据库、FTP、邮箱等服务。本文将详细介绍宝塔面板的安装与卸…

flink cdc原理与使用

flink cdc原理与使用 1 cdc 介绍1.1 cdc简介与对比1.2 基于日志的 CDC 方案介绍 2 基于 Flink SQL CDC 的数据同步方案实践2.1 案例 1 : Flink SQL CDC JDBC Connector2.2 案例 2 : CDC Streaming ETL2.3 案例 3 : Streaming Changes to Kafka 3 Flink SQL CDC 的更多应用场景…

OpenCvSharp随机数与绘制文本用法

目的 RNG函数使用 PutText函数使用 GetTextSize函数使用 RNG随机数生成 生成伪随机数。注意&#xff0c;当初始的state一样时&#xff0c;每次生成的随机数序列是一样的。 PutText绘制文本 函数说明&#xff1a;将文本绘制到图像上(不支持中文)。无绘制的文本用问号代替。 …

[PDF编辑精选] 适用于 Windows 10/11 的PDF 编辑器列表

PDF 是 Portable Document Format 的缩写&#xff0c;是 Adob​​e 创建的一种文件格式&#xff0c;用于在保留格式的情况下轻松查看和共享——无论查看文档的任何人使用的软件或操作系统如何。然而&#xff0c;与PDF文档相关的一个主要问题出现了&#xff0c;那就是编辑文档内…

SpringSecurity安全框架

我们使用这个springSecurity安全框架,作用是认证,授权,将用户的权限和对应的资源进行绑定,默认的是在内存中保存的,实际开发中,是需要根据项目业务的需求对某些方法进行重写,使数据库中权限对应的资源进行绑定,就是查看当前登录的用户所扮演的角色,该角色有哪些权限 授权 1内…

什么是HTTP代理,socks5代理?它们的区别是什么?

什么是HTTP代理&#xff1f; HTTP代理是一种常见的网络代理方式&#xff0c;它通过在客户端和服务器之间建立一个中间层&#xff0c;将客户端的请求转发给服务器&#xff0c;并将服务器的响应返回给客户端。HTTP代理通常用于访问受限制的网站&#xff0c;或者在网络中隐藏客户…

【2.3深度学习开发任务实例】(1)神经网络模型的特点【大厂AI课学习笔记】

从本章开始&#xff0c;我把标题的顺序变了一下&#xff0c;大厂AI课笔记&#xff0c;放到后面。因为我发现App上&#xff0c;标题无法显示完全。 从本章开始&#xff0c;要学习深度学习开发任务的全部过程了。 我们将通过小汽车识别赛道上的标志牌&#xff0c;给出检测框&am…

UE5 摄像机晃动

1.新建camerashake蓝图类 命名为 晃动 2.调节相关参数 3.打开关卡序列 给摄像机添加 晃动 动画 4.播放

uniapp微信小程序-项目实战修改密码

图标是使用uview里面的图标&#xff0c;icfont也可以 以下是所有代码 <template><view><!-- 密码三个 --><view class"password" v-for"(item,index) in userList"><view class"contentuser"><view class&qu…

从源码解析Kruise(K8S)原地升级原理

从源码解析Kruise原地升级原理 本文从源码的角度分析 Kruise 原地升级相关功能的实现。 本篇Kruise版本为v1.5.2。 Kruise项目地址: https://github.com/openkruise/kruise 更多云原生、K8S相关文章请点击【专栏】查看&#xff01; 原地升级的概念 当我们使用deployment等Wor…

区块链游戏解说:什么是 Planet IX

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;Planet IX Dashboard 什么是 Planet IX Planet IX&#xff0c;一个由原生 IX TOKEN 推动的 Web3 玩赚平台。作为一款 GameFi 策略游戏&#xff0c; Planet IX 上的每项资…

抠人像可抠头发丝的模型-软语义分割(Semantic Human Matting)

软语义分割&#xff08;Semantic Human Matting&#xff09; 一、Semantic Human Matting原理二、Semantic Human Matting 项目文件介绍三、数据集介绍及下载地址四、训练流程五、项目代码下载地址 哔哩哔哩详细解说&#xff08;进主页看全集&#xff09;&#xff1a; https://…

极狐GitLab 如何重置管理员密码

在之前安装极狐GitLab 的文章中提到&#xff0c;极狐GitLab 安装成功后&#xff0c;初始登录密码会放在 /etc/gitlab/initial_root_password 文件下&#xff0c;用户可以使用初始用户名 root 及文件内的初始密码即可登录极狐GitLab 实例。 但是有些情况下&#xff0c;可能会发…

Sui主网升级至V1.18.1版本

Sui主网现已升级至V1.18.1版本&#xff0c;同时Sui协议升级至36版本。其他升级要点如下所示&#xff1a; #15794 解析错误不再停止编译&#xff0c;并且后续编译阶段的诊断信息也可能包含在编译结果中&#xff0c;所以开发者可能会看到比以前更多的编译器诊断信息。 #12337 …

基于springboot + vue实现的前后端分离-酒店管理系统

项目介绍 基于springboot vue实现的酒店管理系统一共有酒店管理员和用户这两种角色。 管理员功能 登录&#xff1a;管理员可以通过登录功能进入系统&#xff0c;确保只有授权人员可以访问系统。用户管理&#xff1a;管理员可以添加、编辑和删除酒店的用户&#xff0c;包括前…

线性代数:向量组及其线性相关性

目录 向量组 向量组的线性表示 向量组等价 相关定理 向量组的线性相关性 定理 向量组 向量组的线性表示 向量组等价 相关定理 向量组的线性相关性 定理

物联网在智慧景区中的应用:提升游客体验与运营效率

目录 一、物联网技术概述 二、物联网在智慧景区中的应用 1、智能门票系统 2、智能导览系统 3、智能安全监控系统 4、智能环保系统 三、物联网在智慧景区中提升游客体验 1、提高游览便捷性 2、个性化服务体验 3、提升游客安全感 四、物联网在智慧景区中提升运营效率 …

职业技能鉴定服务中心前端静态页面(官网+证书查询)

有个朋友想做职业技能培训&#xff0c;会发证书&#xff0c;证书可以在自己网站可查。想做一个这样的网站&#xff0c;而且要特别土&#xff0c;一眼看上去像xxx官方网站&#xff0c;像jsp .net技术开发的网站。用htmlcssjquery还原了这样子一个前端页面&#xff0c;这里分享给…

【嵌入式学习】QT-Day2-Qt基础

1> 思维导图 https://lingjun.life/wiki/EmbeddedNote/20QT 2>登录界面优化 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff…