【Qt】贪吃蛇

news2024/9/21 2:38:46

目录

贪吃蛇小游戏

一.项目介绍及演示

1. 项目介绍

2. 项目演示

3. 窗口介绍

3.1 游戏大厅窗口

3.2 游戏关卡选择窗口

3.3 游戏房间窗口

二、创建项目及资源配置

1. 创建项目(QWidget)

​编辑

2. 资源配置(图片声音素材)

三、项目实现

1. 游戏大厅

1.1 重写绘图事件

1.2 设置窗口大小、图标、标题

1.3 设置开始按钮样式

2. 游戏关卡选择

2.1 创建GameSelect类

2.2 连接按钮和窗口跳转

3. 游戏房间

3.1 创建GameRoom类

3.2 对游戏房间数据结构进行封装

3.3 初始化游戏房间界面

3.4 绘制界面窗口

3.5 蛇的移动

3.6 绘制蛇头身体尾巴

3.6 绘制食物与分数

3.7 判定游戏结束

3.8 随机生成食物节点

3.9 创建游戏开始和暂停按钮

3.10 实现定时器的超时槽函数

3.11 设置游戏退出按钮

3.12 获取历史战绩

四.贪吃蛇移动的逻辑讲解

 1.贪吃蛇的一次普通移动:

2.贪吃蛇吃到食物的一次移动:

3.贪吃蛇的持续移动:


贪吃蛇小游戏

一.项目介绍及演示


1. 项目介绍

贪吃蛇游戏规则:简单来说,贪吃蛇游戏规则是玩家通过四个方向键来控制蛇的移动控制其在地图上吃豆子。蛇运动过程中撞到蛇身,则立即结束游戏


2. 项目演示


3. 窗口介绍

3.1 游戏大厅窗口


3.2 游戏关卡选择窗口


3.3 游戏房间窗口

二、创建项目及资源配置


1. 创建项目(QWidget)

在桌面上创建一个名为Snake的文件夹,用于存放项目代码

新建一个项目

2. 资源配置(图片声音素材)

在上述创建完成后,新建一个qrc文件,步骤如下:

此时资源文件,如图示:


三、项目实现


1. 游戏大厅
1.1 重写绘图事件

在gamehall.h文件中,进行重写绘图事件函数的声明

鼠标当到painEvent函数上点击Alt+Enter(回车),为painEvent函数添加定义

在这里插入图片描述

在上述过程后,开始编辑painEvent函数。
第一步:

先实例化画家,使用QPainter painter(this)实例化一个画家,this是让画家在当前窗口(gamehall)进行绘制。注意在使用QPainter需要包含头文件#include<QPainter>
第二步:

再实例化绘图设备,将图片加载到绘图设备中。注意在使用QPixmap需要包含头文件#include<QPixmap>
第三步:

再进行绘画,使用drawPixmap()方法,参数1和参数2,表示绘制开始的坐标;参数3,表示绘制的宽度;参数4,表示绘制的高度;参数5,表示绘制的图片。

void GameHall::paintEvent(QPaintEvent *event)
{
    //实例化画家,this:让画家在当前窗口进行绘制
    QPainter painter(this);
    //实例化绘图设备
    QPixmap pix(":/res/game_hall.png");
    //绘画 0,0从界面左上角开始绘画根据窗口的宽和高进行绘制
    painter.drawPixmap(0,0,this->width(),this->height(),pix);
}

1.2 设置窗口大小、图标、标题

第一步,先修改窗口的大小通过setFixedSize()方法将窗口的宽度设置为1000,高度设置为800。
第二步,设置窗口的图标先通过QIcon()将图片加载到项目中,再通过setWindowIcon()方法设置到窗口中。
第三步,设置窗口的标题通过setWindowTitle()方法将文字设置到窗口标题中。

GameHall::GameHall(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::GameHall)
{
    ui->setupUi(this);
    //设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("游戏大厅");
}

1.3 设置开始按钮样式

第一步,通过QPushButton创建一个游戏开始按钮,按钮文本设置为"开始游戏",this在父窗口中显示。
第二步,通过move移动按钮再窗口中的位置,消除按钮的边框。
第三步,修改按钮中的文本样式,需要先创建一个字体样式(字体为黑体,大小为20像素),最后通过setFont方法将字体样式加载到按钮中

GameHall::GameHall(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::GameHall)
{
    ui->setupUi(this);
    //设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("游戏大厅");


    //添加开始游戏按钮
    QPushButton * startButton = new QPushButton("开始游戏",this);
    //设置按钮的位置
    startButton->move(450,600);
    //消除按钮边框
    startButton->setStyleSheet("QPushButton{border:0px}");
    //创建字体样式
    QFont font("黑体", 20);
    //将字体样式加入到按钮文本中
    startButton->setFont(font);

}

点击运行,此时游戏大厅绘制成功


2. 游戏关卡选择

2.1 创建GameSelect类

先创建一个新的类,名为为GameSelect,基类选择QWidget
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2.2 连接按钮和窗口跳转

在gamehall.cpp中进行编辑按钮的信号和槽,实现点击按钮跳转至关卡选择窗口
第一步,先创建出一个GameSelect窗口,在创建时要包含头文件#include "gameselect.h"
第二步,进行连接使用connnect()方法进行信号和槽函数之间的连接,使用Lambda表达式进行槽函数的编写。
第三步,编辑Lambda表达式,使用close()方法关闭当前窗口。
第四步,将关卡选择窗口设置为同游戏大厅窗口大小相同。
第五步,打开游戏关卡选择窗口。
第六步,给按钮添加点击音效,首先在.pro文件中添加multimedia,然后使用play()进行添加音效。

#include "gamehall.h"
#include "ui_gamehall.h"
#include "gameselect.h"
#include <QPainter>
#include <QPixmap>
#include <QIcon>
#include <QPushButton>
#include <QFont>
#include <QSound>
GameHall::GameHall(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::GameHall)
{
    ui->setupUi(this);
    //设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("游戏大厅");


    //添加开始游戏按钮
    QPushButton * startButton = new QPushButton("开始游戏",this);
    //设置按钮的位置
    startButton->move(450,600);
    //消除按钮边框
    startButton->setStyleSheet("QPushButton{border:0px}");
    //创建字体样式
    QFont font("黑体", 20);
    //将字体样式加入到按钮文本中
    startButton->setFont(font);
    //新建GameSelect窗口
    GameSelect * gameSelect = new GameSelect;

    //Lambda表达式
    connect(startButton,&QPushButton::clicked,[=](){
        //先关闭当前窗口
        this->close();
        //设置gameSelect窗口大小跟gamehall窗口大小一样
        gameSelect->setGeometry(this->geometry());
        //打开gameselect窗口
        gameSelect->show();
        //添加按钮点击的音效
        QSound::play(":/res/clicked.wav");

    });

}

编写gameselect.h文件,同游戏大厅步骤,这里不重复进行介绍,,详细看下下方代码注释。

在这里插入图片描述

#include "gameselect.h"
#include "gamehall.h"
#include <QPainter>
#include <QPixmap>
#include <QPushButton>
#include <QIcon>
#include <QSound>
GameSelect::GameSelect(QWidget *parent) : QWidget(parent)
{
    //设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("关卡选择");


    //创建返回按钮
    QPushButton * returnbutton = new QPushButton(this);
    returnbutton->resize(50,50);
    returnbutton->setIcon(QIcon(":/res/back.png"));
    returnbutton->setIconSize(returnbutton->size());
    returnbutton->move(900,700);

    //建立信号和槽函数的联系
    connect(returnbutton,&QPushButton::clicked,[=](){
        //创建游戏大厅窗口
        GameHall * gamehall = new GameHall;
        //关闭当前窗口
        this->close();
        //展开游戏大厅窗口
        gamehall->show();
        //添加音效
        QSound::play(":/res/clicked.wav");

    });

    //创建文本样式
    QFont font("黑体",30);

    //创建简单难度按钮
    QPushButton * simplebutton = new QPushButton("简单模式",this);
    //将样式设置到按钮中
    simplebutton->setFont(font);
    //设置按钮在窗口中的位置
    simplebutton->move(400,170);
    //进行信号与槽的连接
    
    //创建普通难度按钮
    QPushButton * commonbutton = new QPushButton("普通模式",this);
    //将样式设置到按钮中
    commonbutton->setFont(font);
    //设置按钮在窗口中的位置
    commonbutton->move(400,270);

    //创建困难难度按钮
    QPushButton * difficultybutton = new QPushButton("困难模式",this);
    //将样式设置到按钮中
    difficultybutton->setFont(font);
    //设置按钮在窗口中的位置
    difficultybutton->move(400,370);

    //创建历史记录按钮
    QPushButton * hisbutton = new QPushButton("历史记录",this);
    //将样式设置到按钮中
    hisbutton->setFont(font);
    //设置按钮在窗口中的位置
    hisbutton->move(400,470);

}

void GameSelect::paintEvent(QPaintEvent *event)
{
    //实例化画家,this:让画家在当前窗口进行绘制
    QPainter painter(this);
    //实例化绘图设备
    QPixmap pix(":/res/game_select.png");
    //绘画
    painter.drawPixmap(0,0,this->width(),this->height(),pix);
}

3. 游戏房间

3.1 创建GameRoom类

根据上面步骤后,新建GameRoom类
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


3.2 对游戏房间数据结构进行封装
#ifndef GAMEROOM_H
#define GAMEROOM_H

#include <QWidget>
#include<QSound>
enum class SnakeDirect{
    UP=0,
    DOWN,
    LEFT,
    RIGHT

};
class GameRoom : public QWidget
{
    Q_OBJECT
public:
    explicit GameRoom(QWidget *parent = nullptr);
    //重写绘图事件
    void paintEvent(QPaintEvent *event);
    void moveUp(); //向上移动
    void moveDown();//向下移动
    void moveLeft();//向左移动
    void moveRight();//向右移动
    bool checkFail();//判断游戏结束
    void createNewFood();//创建食物
    void setTimeout(int timeout){moveTimeout =timeout;}

private:
    const int KSnakeNodeWidth = 20;  //蛇节点的宽度
    const int KSnakeNodeHeight = 20; //蛇节点的高度
    const int KDefaultTimeout =200;  //蛇的默认移动速度
    QList<QRectF> snakeList; //表示贪吃蛇链表
    QRectF foodRect;  //表示食物节点
    SnakeDirect moveDirect = SnakeDirect::UP; //设置蛇移动方向默认向上
    QTimer *timer; //定时器

    bool isGameStart =false; //表示是否开始游戏
    QSound *sound;
    int moveTimeout =  KDefaultTimeout;

};

#endif // GAMEROOM_H



3.3 初始化游戏房间界面
//设置窗口大小
    this->setFixedSize(1000,800);
    //设置窗口的图标
    this->setWindowIcon(QIcon(":/res/ico.png"));
    //设置窗口标题
    this->setWindowTitle("游戏房间");

3.4 绘制界面窗口
void GameRoom::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    QPixmap pix;

    pix.load(":/res/game_room.png");

    painter.drawPixmap(0,0,800,800,pix);

    pix.load(":/res/bg1.png");

    painter.drawPixmap(800,0,200,850,pix);
}

3.5 蛇的移动

贪吃蛇的持续动态移动,本质上是定时器不断发出信号,调用moveup等移动函数,更新链表结构,最后重新绘图呈现给我们。

//创建上下左右按钮
    QPushButton * up = new QPushButton("↑",this);
    QPushButton * down = new QPushButton("↓",this);
    QPushButton * left = new QPushButton("←",this);
    QPushButton * right = new QPushButton("→",this);

    up->move(880,400);
    down->move(880,480);
    left->move(840,440);
    right->move(920,440);

    up->setFont(font);
    down->setFont(font);
    left->setFont(font);
    right->setFont(font);

    up->setStyleSheet("QPushButton{border:0px}");
    down->setStyleSheet("QPushButton{border:0px}");
    left->setStyleSheet("QPushButton{border:0px}");
    right->setStyleSheet("QPushButton{border:0px}");

    //按钮控制移动方向,不能直接掉头
    connect(up,&QPushButton::clicked,[=](){
        if(moveDirect != SnakeDirect::DOWN)
            moveDirect = SnakeDirect::UP;
    });
    connect(down,&QPushButton::clicked,[=](){
        if(moveDirect != SnakeDirect::UP)
            moveDirect = SnakeDirect::DOWN;
    });

    connect(left,&QPushButton::clicked,[=](){
        if(moveDirect != SnakeDirect::RIGHT)
            moveDirect = SnakeDirect::LEFT;
    });

    connect(right,&QPushButton::clicked,[=](){
        if(moveDirect != SnakeDirect::LEFT)
            moveDirect = SnakeDirect::RIGHT;
    });

void GameRoom::moveUp()
{
    QPointF leftTop; //左上角坐标
    QPointF rightBottom; //右下角坐标
    auto snakeNode = snakeList.front();//头
    int headX = snakeNode.x();
    int headY = snakeNode.y();
    if(headY<0)
    {
        leftTop = QPointF(headX, this->height()- KSnakeNodeHeight);
    }else {
        leftTop=QPointF(headX,headY-KSnakeNodeHeight);
    }
    rightBottom = leftTop + QPointF(KSnakeNodeWidth,KSnakeNodeHeight);
    snakeList.push_front(QRectF(leftTop,rightBottom));
}

void GameRoom::moveDown()
{
    QPointF leftTop; //左上角坐标
    QPointF rightBottom; //右下角坐标
    auto snakeNode = snakeList.front();//头
    int headX = snakeNode.x();
    int headY = snakeNode.y();
    if(headY>this->height())
    {
        leftTop = QPointF(headX,0);
    }else {
        leftTop=snakeNode.bottomLeft();
    }
    rightBottom = leftTop + QPointF(KSnakeNodeWidth,KSnakeNodeHeight);
    snakeList.push_front(QRectF(leftTop,rightBottom));
}

void GameRoom::moveLeft()
{
    QPointF leftTop; //左上角坐标
    QPointF rightBottom; //右下角坐标
    auto snakeNode = snakeList.front();//头
    int headX = snakeNode.x();
    int headY = snakeNode.y();
    if(headX<0)
    {
        leftTop=QPointF(800-KSnakeNodeWidth,headY);
    }else{
        leftTop=QPointF(headX-KSnakeNodeWidth,headY);
    }
    rightBottom = leftTop + QPointF(KSnakeNodeWidth,KSnakeNodeHeight);
    snakeList.push_front(QRectF(leftTop,rightBottom));
}

void GameRoom::moveRight()
{
    QPointF leftTop; //左上角坐标
    QPointF rightBottom; //右下角坐标
    auto snakeNode = snakeList.front();//头
    int headX = snakeNode.x();
    int headY = snakeNode.y();
    if(headX>800-2*KSnakeNodeWidth)
    {
        leftTop=QPointF(0,headY);
    }else{
        leftTop=snakeNode.topRight();
    }
    rightBottom = leftTop + QPointF(KSnakeNodeWidth,KSnakeNodeHeight);
    snakeList.push_front(QRectF(leftTop,rightBottom));
}

3.6 绘制蛇头身体尾巴
//绘制蛇
    //蛇头
    if(moveDirect==SnakeDirect::UP)
    {
        pix.load(":/res/up.png");
    }else if (moveDirect==SnakeDirect::DOWN) {
        pix.load(":/res/down.png");
    }else if(moveDirect==SnakeDirect::LEFT){
        pix.load(":/res/left.png");
    }else{
        pix.load(":/res/right.png");
    }
    auto snakeHead = snakeList.front();
    painter.drawPixmap(snakeHead.x(),snakeHead.y(),snakeHead.width(),snakeHead.height(),pix);

    //蛇身
    pix.load(":/res/Bd.png");
    for(int i = 1; i < snakeList.size()-1; i++)
    {
        auto node = snakeList.at(i);
        painter.drawPixmap(node.x(),node.y(),node.width(),node.height(),pix);
    }

    //蛇尾
    auto snakeTail = snakeList.back();
    painter.drawPixmap(snakeTail.x(),snakeTail.y(),snakeTail.width(),snakeTail.height(),pix);


3.6 绘制食物与分数
//绘制食物节点
    //先进行加载食物
    pix.load(":/res/food.bmp");
    painter.drawPixmap(foodRect.x(),foodRect.y(),foodRect.width(),foodRect.height(),pix);
    //绘制分数
    pix.load(":res/sorce_bg.png");
    painter.drawPixmap(this->width()*0.85,this->height()*0.03,100,50,pix);
    QPen pen;
    pen.setColor(Qt::black);
    painter.setPen(pen);
    QFont font("黑体",22);
    painter.setFont(font);
    painter.drawText(this->width()*0.9,this->height()*0.08,QString("%1").arg(snakeList.size()));
    //往文件中写分数
    int c = snakeList.size();
    QFile file("C:/Users/26256/Desktop/his.txt");
    if(file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        QTextStream out(&file);
        int num = c;
        out << num;
        file.close();
    }

3.7 判定游戏结束
bool GameRoom::checkFail()
{
    for(int i=0;i < snakeList.size();i++)
    {
        for(int j=i+1;j < snakeList.size();j++)
        {
            if(snakeList.at(i) == snakeList.at(j))
            {
                return true;
            }
        }
    }
    return false;
}
3.8 随机生成食物节点
void GameRoom::createNewFood()
{
    foodRect=QRectF(qrand() %(800/KSnakeNodeWidth)*KSnakeNodeWidth,
                    qrand() %(this->height()/KSnakeNodeHeight)*KSnakeNodeHeight,
                    KSnakeNodeWidth,
                    KSnakeNodeHeight
                    );

}
3.9 创建游戏开始和暂停按钮
//开始游戏   结束游戏

    QPushButton * startButton = new QPushButton("开始",this);
    QPushButton *failButton = new QPushButton("暂停",this);

    startButton->move(860,100);
    failButton->move(860,150);

    startButton->setFont(font2);
    failButton->setFont(font2);

    connect(startButton,&QPushButton::clicked,[=](){
        isGameStart=true;
        timer->start(moveTimeout);
        sound = new QSound(":res/Trepak.wav");
        sound->play();
        sound->setLoops(-1);
    });

    connect(failButton,&QPushButton::clicked,[=](){
        isGameStart=false;
        timer->stop();
        sound->stop();
3.10 实现定时器的超时槽函数
  timer = new QTimer(this);
    connect(timer,&QTimer::timeout,[=]()
    {
        int cont =1;
        if(snakeList.front().intersects(foodRect))
        {
            createNewFood();
            cont++;
            QSound::play(":/res/eatfood.wav");

        }

        while(cont--)
        {
            switch (moveDirect) {

            case SnakeDirect::UP :
                moveUp();
                break;
            case SnakeDirect::DOWN:
                moveDown();
                break;
            case SnakeDirect::LEFT:
                moveLeft();
                break;
            case SnakeDirect::RIGHT:
                moveRight();
                break;

            }
        }
        snakeList.pop_back();
        update();
    });
3.11 设置游戏退出按钮

    //退出游戏按钮

    QPushButton *backButton = new QPushButton("退出",this);
    backButton->move(860,700);
    backButton->setFont(font2);
    QMessageBox * messbox = new QMessageBox(this);
     QPushButton * ok = new QPushButton("ok");
    QPushButton * no = new QPushButton("no");



    messbox->addButton(ok,QMessageBox::AcceptRole);
    messbox->addButton(no,QMessageBox::ResetRole);

    messbox->setText("确定要退出游戏吗?");

    connect(backButton,&QPushButton::clicked,[=](){
        messbox->show();
        messbox->exec();
        QSound::play("clicked.wav");

        GameSelect* select = new GameSelect;
        if(messbox->clickedButton()==ok)
        {
            this->close();
            select->show();
       }else{
            messbox->close();
        }

    });
3.12 获取历史战绩
//创建历史记录按钮
    QPushButton * hisbutton = new QPushButton("历史记录",this);
    //将样式设置到按钮中
    hisbutton->setFont(font);
    //设置按钮在窗口中的位置
    hisbutton->move(400,470);
    connect(hisbutton,&QPushButton::clicked,[=](){
        QWidget * widget = new QWidget();
        widget->setFixedSize(200,80);
        widget->setWindowTitle("历史战绩");
        QTextEdit * edit = new QTextEdit(widget);
        edit->setFixedSize(200,80);
        edit->setFont(font);
        QFile file("C:/Users/26256/Desktop/his.txt");
        file.open(QIODevice::ReadOnly);

        QTextStream in(&file);
        int data = in.readLine().toInt();
        edit->append("得分为:");
        edit->append(QString::number(data));

        widget->show();

    });

四.贪吃蛇移动的逻辑讲解

 1.贪吃蛇的一次普通移动:

调用moveup等移动函数,创建一个新的头结点,头插到蛇的链表结构中,此时链表多一个节点。

调用链表的pop_back()函数尾删,保持链表整体长度与原来一致。

2.贪吃蛇吃到食物的一次移动:

记录吃到的食物数量cont,调用cont+1次移动函数,使链表头部多cont+1个节点。最后尾删一次,使链表长度比原来长cont。

3.贪吃蛇的持续移动:

创建定时器,将信号与相应逻辑的槽函数关联。定时发送信号,执行槽函数,实现逻辑。

原文链接:

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

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

相关文章

文心快码助力项目实战开发

文章目录 前言支持的编程语言 Language安装方法使用方法 项目实践代码运行流程出行方案查询JSP 指令与标签库指令页面上下文路径设置表单部分查询结果显示部分 使用感受优点改进建议 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 文心快码Baidu Comat…

《黑神话:悟空》爆火,作为普通人,该怎么抓住这波风口赚到钱?

目录 一、游戏视频 1.1、游戏教程视频 1.2、游戏剧情视频 二、游戏直播 三、游戏视频出海 四、AI黑神话悟空 大家好&#xff0c;我是小奇&#xff0c;一名热衷于分享AI副业项目的普通博主。不管你是AI小白还是老手&#xff0c;我都能帮你轻松上手&#xff0c;用AI技术赚钱…

【C++ Primer Plus习题】4.7

问题: 解答: #include <iostream> #include <string> using namespace std;typedef struct _Pizza {string companyName;float diameter;float wieght; }Pizza;int main() {Pizza p;cout << "请输入披萨的公司名: ";getline(cin, p.companyName);…

uniapp+vue3的ifdef实现多端配置客服消息

在微信小程序预览&#xff0c;实现客服消息&#xff0c;因是个人版&#xff0c;不支持 button | uni-app官网 (dcloud.net.cn) 条件编译处理多端差异 | uni-app官网 (dcloud.net.cn) uni.makePhoneCall(OBJECT) | uni-app官网 (dcloud.net.cn) //my.vue <template> &l…

10大国产AI绘画软件,每一款都挺好用 ,你用过吗?

在这个科技与艺术交织的时代,AI绘画软件正以惊人的速度改变着我们的创作方式。今天,就让我们一起探索那些你绝不能错过的10大国产AI绘画神器,它们不仅让创作变得前所未有的简单高效,更让每一位艺术家和爱好者都能享受到创作的无限乐趣! 1️⃣触站A🎨——语音创作,未…

循环结构程序设计-找出指定数量学生的最高分

**7-1-1 #include <stdio.h>int main(){int n,score,max;scanf("%d",&n);max 0;for(int i0;i<n;i){scanf("%d",&score);if(score>max){max score;}}printf("%d",max);return 0; }

一文迅速上手 ESP32 bluedroid 蓝牙从机开发

前言 个人邮箱&#xff1a;zhangyixu02gmail.com该博客主要针对希望迅速上手 ESP32 蓝牙从机开发人员&#xff0c;因此&#xff0c;很多蓝牙技术细节知识并不会进行介绍&#xff0c;仅仅介绍我认为需要了解的 API 函数和回调内容。本文主要是基于gatt_server demo来微调进行进…

# ‘telnet‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

‘telnet’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 一、报错描述&#xff1a; 1、当使用 telnet 命令&#xff0c;连接本地 tomcat 的 8005 端口时报错。 2、报错解释 这个错误表明系统无法识别telnet命令&#xff0c;因为它不是内置命令&#xff0c;也没有…

跳马(华为od机考题)

一、题目 1.原题 马是象棋(包括中国象棋和国际象棋)中的棋子&#xff0c; 走法是每步直一格再斜一格&#xff0c; 即先横着或直着走一格&#xff0c;然后再斜着走一个对角线&#xff0c; 可进可退&#xff0c;可越过河界&#xff0c;俗称“马走‘日’字。 给顶m行n列的棋盘&…

人工智能在专业领域的斗争

介绍 ChatGPT 等大型语言模型 (LLM) 在用自然语言讨论一般话题的能力方面令人印象深刻。然而&#xff0c;他们在医学、金融和法律等专业领域却举步维艰。这是由于缺乏真正的理解&#xff0c;并且注重模仿而不是智力。 大语言模型正处于炒作的顶峰。由于能够用自然语言回答和讨…

“Docker中部署Kibana:步骤与指南“

博主这篇文章是跟Elasticsearch那篇文章是有关系的&#xff0c;建议大家先去看&#xff1a; 轻松上手&#xff1a;Docker部署Elasticsearch&#xff0c;高效构建搜索引擎环境_docker 启动 es-CSDN博客 这篇博文&#xff0c;还有镜像下载不下来的情况&#xff0c;大家可以去看…

攻破:重定向 缓冲区

文章目录 前言&#xff1a;认识读文件read认识重定向&&缓冲区重定向现象及分析&#xff1a;dup2的介绍&#xff1a; 缓冲区的引入&#xff1a;缓冲区的理解&#xff1a; 前言&#xff1a; ​ 从上一章开始&#xff0c;我们进入了文件IO的学习&#xff0c;认识了文件描…

浅谈C# RabbitMQ

一、基本介绍 RabbitMQ——Rabbit Message Queue的简写&#xff0c;但不能仅仅理解其为消息队列&#xff0c;消息代理更合适。 RabbitMQ 是一个由 Erlang 语言开发的AMQP&#xff08;高级消息队列协议&#xff09;的开源实现&#xff0c;其内部结构如下&#xff1a; RabbitMQ作…

今年秋招太吓人了。(20届,在得物做Java开发)

有个学弟来问我诉苦最近好忙好累&#xff0c;说竞争压力特别大&#xff0c;让我给点建议&#xff0c;要不要放弃实习闷头搞秋招&#xff0c;我才意识到时间太快了&#xff0c;想想我都毕业几年了&#xff0c;感慨颇深&#xff0c;整理一下我的求职经验和目前的心得吧&#xff0…

SpingBoot集成kafka-发送读取消息示例

SpingBoot集成kafka开发 kafka的几个常见概念 1、springboot和kafka对应版本&#xff08;重要&#xff09;2、创建springboot项目&#xff0c;引入kafka依赖2.1、生产者EventProducer2.2、消费者EventConsumer2.3、启动生产者的方法SpringBoot01KafkaBaseApplication2.4、appli…

监控电脑屏幕的软件叫什么?6款电脑屏幕监控软件分享!

监控电脑屏幕的软件可以帮助企业和家长监控电脑的使用情况&#xff0c;确保工作和学习的效率与安全。 以下是六款常用的电脑屏幕监控软件及其特点&#xff1a; 1. Keylogger 特点&#xff1a;专注于企业数据安全和员工上网行为管理。 功能&#xff1a;全面的屏幕监控、上网…

Redis持久化(RDB、AOF、混合持久化)

目录 1、持久化机制 &#xff08;1&#xff09;RDB &#xff08;2&#xff09;AOF 2、混合持久化 3、总结 ❓为什么需要持久化&#xff1f; Redis 是一个基于内存的键值存储系统&#xff0c;它提供了非常快的数据访问速度&#xff0c;因为它不需要像传统的磁盘存储那样进…

竞猜足球核心算法源码

需要实现的功能如下&#xff1a; 仅用于学习 竞猜足球核心算法源码 package com.lotterysource.portsadmin.service; import com.aliyun.oss.common.utils.DateUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.lotterysource.portsadmin.dbprovid…

进存销系统

摘 要 伴随着我国全面推动信息化的趋势&#xff0c;我国的很多行业都在朝着互联网的方向进发。商品销售行业也有很多挑战。这次论文介绍的进存销系统就是为了能够解决当前传统商品进存销存在的问题&#xff0c;使得商品进存销能够更加有效率。电商智能化管理必不可少的帮手有进…

功能安全实战系列02-RamTst(RamTest)开发介绍

本文框架 前言1. What(RamTst相关概念)1.1 后台检测1.2 前台检测1.3 RamTst对应状态机2.How?2.1 接口调用2.2 配置开发2.3 测试模式选择前言 在本系列笔者将结合工作中对功能安全实战部分的开发经验进一步介绍常用,包括Memory(Flash,Ram)失效检测,程序运行时序时间检测,及…