在ubuntu上用QT写一个简单的C++小游戏(附源码)

news2024/12/25 17:06:03

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


创建项目

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

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

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

代码如下

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

#ifndef BALLOBJECT_H
#define BALLOBJECT_H
#include <string>
#include <random>

//需要一些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 <QMainWindow>
#include <vector>
#include "ballobject.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QTimer *timer;

    std::vector<BaseBall*> 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<int> 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 <QPainter>
#include <QTimer>
#include "ballobject.h"
#include <QDebug>
#include <QKeyEvent>

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);

    //创建游戏对象1
    int 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);
    }
    //创建游戏对象2
    for(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);
    }
    //创建游戏对象3
    for(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);
    }
    //初始化玩家位置TODO

    playerball = 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 <string>
#include <random>

//需要一些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 <QMainWindow>
#include <vector>
#include "ballobject.h"
#include <random>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QTimer *timer;

    std::vector<BaseBall*> objList1;//障碍物列表
    std::vector<BaseBall*> objList2;//障碍物列表
    std::vector<BaseBall*> 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<int> 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 <QPainter>
#include <QTimer>
#include "ballobject.h"
#include <QDebug>
#include <QKeyEvent>
#include <math.h>
#include <QRandomGenerator>


//添加随机数种子,作用:利用当前系统时间生成随机数,以此来防止每一次的随机数相同
#include <ctime> //添加头文件


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);
    //创建游戏对象1
    int 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()<<bLeft;
        obj->x=bLeft;
        int bRight = QRandomGenerator::global()->bounded(100,1200);
       //qDebug()<<bRight;
        obj->y=bRight;
        obj->r=15;
        objList1.push_back(obj);


    }
    //创建游戏对象2
    for(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);
    }
    //创建游戏对象3
    for(int i = 0;i < objectsNum;i++)
    {
        HuntPlayerBall* obj = new HuntPlayerBall();

        //排放障碍物srand
        obj->x=i*(obj->r*2 + xstep)+obj->r;
        obj->y=H/2 - 20;
        obj->r=10;

        objList3.push_back(obj);
    }
    //初始化玩家位置TODO

    playerball = 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();
}


效果如下

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

在这里插入图片描述

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

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

相关文章

【牛客网刷题】VL8-VL10 generate for语句、比较数大小、function的使用

&#x1f449; 写在前面 &#x1f449; 本系列博客记录牛客网刷题记录 &#x1f449; 日拱一卒&#xff0c;功不唐捐&#xff01; 目录 VL8 使用generate for语句简化代码 题目描述 输入描述 输出描述 RTL 设计 testbench 设计 仿真测试 VL9 使用子模块实现三输入数的大…

【C++ 程序设计入门基础】- Chapter One

目录 一、什么是 C&#xff1f; 1、概念 2、标准库 二、第一个 C 程序 1、下载 C 开发工具 2、开始下载好之后&#xff0c;我们先设置一下编码&#xff0c;解决中文注释不显示的问题。 3、下面我们就可以新建一个源代码 4、 编写完成后&#xff0c;我们就可以运行查看结果…

MyBatis:缓存机制详解

本篇内容包括&#xff1a;MyBatis 缓存机制概述、一级缓存与二级缓存的介绍、配置和具体流程。 一、MyBatis 缓存机制概述 在我们常见的 OLTP&#xff08;on-line transaction processing&#xff0c;联机事务处理&#xff09;类型的 Web 应用中&#xff0c;性能的瓶颈往往来源…

【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

目录前言一、注意力机制&#xff1a;Attention二、自注意力机制&#xff1a;Self-Attention三、多头注意力机制&#xff1a;Multi-Head Self-Attention四、位置编码&#xff1a;Positional EncodingReference前言 最近在学DETR&#xff0c;看源码的时候&#xff0c;发现自己对…

【码上掘金编程挑战赛】- 前端可冲【简历加分项】

【码上掘金编程挑战赛】1.比赛报名2. 比赛介绍赛题一&#xff1a;码上游戏赛题二&#xff1a;码上创意赛题三&#xff1a;码上文言文赛题四&#xff1a;码上10243.报名4.提交作品1.比赛报名 比赛报名链接 https://juejin.cn/challenge/1?utm_source3169 2. 比赛介绍 赛题一…

Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】

Spring5入门到实战------12、使用JdbcTemplate操作数据库&#xff08;增删改查&#xff09;。具体代码讲解 【上篇】 Spring5入门到实战------13、使用JdbcTemplate操作数据库&#xff08;批量增删改&#xff09;。具体代码讲解 【下篇】 以上两篇采用的是注解开发形式xml配置…

自己动手写操作系统系列第3篇,实现时钟和键盘中断

对应labOS版本1.3 程序源码可以私聊我 picirq.h int 0x20~0x2f接收中断信号IRQ0~15&#xff0c;因为int 0x00~0x1f不能用于IRQ。 picirq.c pic0_mask0xfb即1111 1011&#xff1b;PIC1以外全部禁止。pic1_mask0xff即1111 1111&#xff1b;禁止所有中断 pic_enable函数就是将…

【Linux下安装jdk】Linux下安装jdk

Linux下安装jdk 1、-RPM安装 1.1、检查系统是否安装过jdk java -version 检查是否有安装包 rpm -qa | grep java 1.2、安装jdk 查看服务器版本: uname -a 下载jdk对应rpm包: https://www.oracle.com/java/technologies/downloads/#java8 上传安装包至任意目录下&…

用户登录权限校验 JWT【详解】

JWT &#xff08;json web token&#xff09;是当前最流行的用户登录权限校验&#xff08;用户认证鉴权&#xff09;方案。 官网 https://jwt.io/ JWT 的工作流程 客户端填写账号密码访问登录接口 login&#xff0c;将账号密码传给服务端服务端验证账号密码是否正确&#xff0c…

职言 | 校招面试有感,一个面试官的几点建议

职言&#xff1a; 最近一直在校招&#xff0c;我&#xff08;作者&#xff09;和同事说等这段时间结束&#xff0c;我不想再参与面试了&#xff0c;快面吐了。从校招开始&#xff0c;我团队前前后后陆续进了500多封学生简历&#xff0c;我经常一整天排满了面试&#xff0c;聊到…

【电子通识】芯片资料(数据手册/规格书)查询常用网站和方法

目录 1.AlldataSheet 网站&#xff08;建议使用&#xff09; 2.ICpdf 网站 3.CIC中国IC网 网站 4.datasheet&#xff08;不建议使用&#xff09; 5.半导小芯 &#xff08;建议使用&#xff09; 6.立创商城 &#xff08;建议使用&#xff09; 在做硬件的芯片选型、产品维修…

生物信息学笔记02 -- 研究的一般方法

生物信息学概述 以基因组DNA序列信息为源头&#xff0c;识别基因组序列中代表蛋白质和RNA基因的编码区&#xff0c;阐明非编码区的信息特征&#xff0c;破译隐藏在DNA序列中的遗传语言规律 生物信息学研究的内容与方法 研究主要内容 ⚫ 生物学数据的收集、存储、管理与提供 …

C++:继承

文章目录前言一、继承的概念及定义1.继承的概念2.继承的定义二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员总结前言 本文介绍C中的继承。 一、继承的概念及定义 1.继承的概念 继承机制是面向对象程序设计使代码可…

厨电智能化趋势下,究竟什么才是真正的“用户思维”?

文|智能相对论 作者|佘凯文 近期2022年前三季度的各项经济数据在陆续发布&#xff0c;大环境依然承压&#xff0c;各个行业都在负重前行。 厨电行业在房地产下滑、疫情反复等因素影响下&#xff0c;前三季度同样一直承受着不小的压力&#xff0c;AVC数据显示&#xff0c;202…

【面试官说实现一个顺序表,但听到要求后我沉默了】

在很多人心里&#xff0c;顺序表是数据结构最基础最简单的东西了&#xff0c;如果面试让我们手撕一道顺序表&#xff0c;相信大家心里早就乐开了花&#xff0c;但是面试官真的会出这么简单的题吗&#xff1f; 答案是&#xff1a;当然会&#xff0c;哈哈。 我们来看看面试官的要…

【精选】ARMv8/ARMv9架构入门到精通-[前言]

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 想不想一夜暴富&#xf…

python基于PHP+MySQL的高校公选课管理信息系统

随着我国教育质量提高,在校大学生的数量也在不断的增长。相对应的如何让学生根据自己的兴趣爱好进行在线选课,从而有目的的对学生进行培养,也是当前很多高校教务人员所关心的问题。能够让更多的大学生进行在线自主选课,选择自己所喜欢的课程和教师,我们开发了高校公选课管理系统…

强化学习论文分析3---蜂窝网络联合频谱和功率分配的深度强化学习--《Deep Reinforcement Learning for ......》

目录一、研究内容概述二、系统目标与约束1.系统描述2.系统目标三、DQN、DDPG网络设计四、性能表征本文是对论文《Deep Reinforcement Learning for Joint Spectrum and Power Allocation in Cellular Networks》的分析&#xff0c;若需下载原文请依据前方标题搜索&#xff0c;第…

深入理解java线程池+源码解读

文章目录一.线程池简介1. 什么是线程池2. 线程池的优点3. 线程池中核心关系继承4.对线程池的理解①框架的两极调度模型②核心线程和非核心线程的本质区别二. 线程池核心概念1. 线程池核心参数2.两种常见的线程池①newCachedThreadPool②newFixedThreadPool③newSingleThreadExc…

基于STM32F469 discovery kit 开发板的开发3

目录基于STM32F469 discovery kit 开发板的开发3软件项目架构1. 应用层&#xff1a;2. Drivers层3. Middlewares层软件工作流程main函数入口LED等初始化配置外部中断基于STM32F469 discovery kit 开发板的开发3 前文我们已经实现了第一个例程在discovery 开发板上的运行&#…