【小游戏】C++控制台版本俄罗斯轮盘赌

制作团队:洛谷813622(Igallta) 989571(_ayaka_)

Mod:_ayaka_

双人模式:Igallta

公告:

原先的9.8改名为 Alpha 1.0,以后每次更新都增加 0.1。
Alpha 1.11 改为 Beta 1.0。
手铐机制:朝自己开枪也算一个回合,例如:

上手铐+朝自己开枪 -> 朝对面开枪 -> 对面回合

Data:

Data 9.3:新增设定:对方死了之后对方的手铐也会解掉。
Data Alpha 1.1 :为防止有人钻牛角尖,大部分改为 string 类型。
Data Alpha 1.2 :为防止有些人数道具是第几号数大脑过载数晕过去了,显示道具时会增加编号。
Data Alpha 1.3 :不能命名为上帝、God…不然就会&%#@&)DHD*#。
Data Alpha 1.4 :游戏结束后并不会立刻窗口结束,而是会等三秒后按任意键结束。
Data Alpha 1.5 :增加等待时间,让你反应过来(原来只有 100ms,现在改为 500ms)。
Data Alpha 1.6 :缩短代码长度,没错,仅此而已。
Data Alpha 1.7 :增加如果射出的是实弹那么窗口就会抖动、每次获得的道具从固定4个改为 1~4 随机。以及优化游玩体验。
Data Alpha 1.8 :经讨论,认为道具设置为 1~5 个/次更为合适。
Data Alpha 1.9 :优化玩家体验。
Data Alpha 1.10 :修复关于输入无限循环的 bug。
Data Beta 1.0 :删除死亡后手铐解除的机制。
Data Beta 1.1 :修复在开发手铐时不小心让p1直接获得12个手铐的bug(汗),优化玩家体验。
Date Beta 1.2:大大缩短代码长度(目前有 bug 无法游玩)

/*
作者:洛谷813622、989571 csdn:luogu_Igallta
严禁搬迁
这个版本是Beta 1.1版本
*/
#include<bits/stdc++.h>
#include<windows.h>
#define clr system("cls")
#define int long long
using namespace std;
string dj[] = {"放大镜", "华子", "小刀", "饮料", "手铐"}, zd[] = {"空弹", "实弹"}, pl1, pl2;
bool is1 = 1, sk, zs; //sk:手铐 zs:打自己
int yu, kb, sd, b1 = 2, win1,win2,b2 = 2, ls = 1, hit = 1, mxb = 2, jl; //jl:记录被挂手铐后局数
vector<int>dj1, dj2;
queue<int>g;//枪械装弹
inline void dist(int atime, int st = 20) {
    int shake_distance = 10, x, y, width, height;
    int counts = atime / st / 2;
    RECT rect;
    HWND window = NULL, oldwindow = NULL;
    for (int i = 1; i <= counts; i++) {
        window = GetForegroundWindow();
        if (window != oldwindow) {
            GetWindowRect(window, &rect);
            x = rect.left;
            y = rect.top;
            width = rect.right - x;
            height = rect.bottom - y;
            oldwindow = window;
        }
        MoveWindow(window, x - shake_distance, y, width, height, TRUE);
        Sleep(st);
        MoveWindow(window, x + shake_distance, y, width, height, TRUE);
        Sleep(st);
    }
}
inline void split() {
    clr;
    int shake_time = 20, shake_distance = 10, x, y, width, height;
    RECT rect;
    HWND window = NULL, oldwindow = NULL;
    clr;
    for (int i = 1; i <= 300; i++) {
        window = GetForegroundWindow();
        if (window != oldwindow) {
            GetWindowRect(window, &rect);
            x = rect.left;
            y = rect.top;
            width = rect.right - x;
            height = rect.bottom - y;
            oldwindow = window;
        }
        MoveWindow(window, x - shake_distance, y, width, height, TRUE);
        Sleep(shake_time);
        MoveWindow(window, x + shake_distance, y, width, height, TRUE);
        Sleep(shake_time);
        if (i == 1)cout << "你";
        else if (i == 20)cout << "怎";
        else if (i == 40)cout << "么";
        else if (i == 60)cout << "这";
        else if (i == 80)cout << "么";
        else if (i == 100)cout << "不";
        else if (i == 120)cout << "听";
        else if (i == 140)cout << "话";
        else if (i == 160)cout << "呢";
        else if (i == 170)cout << "?";
        else if (i == 180)cout << "你";
        else if (i == 200)cout << "让";
        else if (i == 220)cout << "我";
        else if (i == 240)cout << "要";
        else if (i == 260)cout << "消";
        else if (i == 280)cout << "失";
        else if (i == 300)cout << "了";
    }
    int t = 250;
    while (t--) {
        cout << "ERROR ";
        Sleep(3);
    }
    t = 20;
    while (t--)system("start cmd");
    t = 20;
    while (t--) {
        MessageBox(NULL, "ERROR!", "ERROR", MB_OK | MB_ICONWARNING);
    }
    exit(0);
}
inline void dontagain() {
    clr;
    Sleep(500);
    for (int i = 0; i <= 2; i++) {
        cout << '.';
        Sleep(1000);
    }
    cout << "够";
    Sleep(2000);
    cout << "了!!!\n";
    dist(800);
    system("pause");
    cout << "你再这样程序就出 bug 了!\n";
    system("pause");
    clr;
}
inline void drink() {
    int tmpo = g.front();
    g.pop();
    cout << "你选择了饮料!退出的这发子弹是:" << zd[tmpo] << "!\n";
    --yu;
    if (tmpo) {
        --sd;
    } else --kb;
    Sleep(1500);
}
inline void over() {
    Sleep(1000);
    system("pause");
    clr;
    ++ls;
}
inline void fdj() {
    cout << "当前子弹:";
    cout << zd[g.front()] << '\n';
    Sleep(1500);
}
signed main() {
    cout << "玩家1的名字:";
    cin >> pl1;
    int cnt1 = 0, cnt2 = 0;

    while (pl1 == "上帝" || pl1 == "GOD" || pl1 == "GOd" || pl1 == "GoD" || pl1 == "God" || pl1 == "gOD" || pl1 == "goD" || pl1 == "gOd" || pl1 == "god") {
        if (cnt1 == 6) {
            dontagain();
        }
        if (cnt1 == 12) {
            split();
        }
        cout << "ERROR 010101000110100001100101001000000100011101101111011001000010000001101000011000010111001100100000011000100110010101100101011011100010000001100100011001010110000101100100001011000111100101101111011101010010000001100011011000010110111000100111011101000010000001101110011000010110110101100101001000000111100101101111011101010111001000100000011011100110100101100011011010110110111001100001011011010110010100100000001000100100011101101111011001000010001000101110";
        cout << "\n你需要重新输入一个名字......\n";
        ++cnt1;
        cin >> pl1;
    }
    cout << "玩家2的名字:";
    cin >> pl2;

    while (pl2 == "上帝" || pl2 == "GOD" || pl2 == "GOd" || pl2 == "GoD" || pl2 == "God" || pl2 == "gOD" || pl2 == "goD" || pl2 == "gOd" || pl2 == "god") {
        if (cnt2 == 6) {
            dontagain();
        }
        if (cnt2 == 12) {
            split();
        }
        cout << "ERROR 010101000110100001100101001000000100011101101111011001000010000001101000011000010111001100100000011000100110010101100101011011100010000001100100011001010110000101100100001011000111100101101111011101010010000001100011011000010110111000100111011101000010000001101110011000010110110101100101001000000111100101101111011101010111001000100000011011100110100101100011011010110110111001100001011011010110010100100000001000100100011101101111011001000010001000101110";
        cout << "\n你需要重新输入一个名字......\n";
        cin >> pl2;
    }
    clr;
    cout << "现在讲解规则:\n小刀:可以让下一发子弹伤害变成两倍\n华子:可以回一滴血\n放大镜:你可以查看当前子弹\n饮料:可以退一发子弹\n手铐:可以限制对方一回合动不了\n一共有3轮。\n";
    Sleep(1200);
    system("pause");
    clr;
start:
    ;
    if (ls == 4) {
        clr;
        cout << "局数已到,游戏结束。\n";
        if(win1>win2){
			cout<<"p1赢了!";
		}else cout<<"p2赢了!";
        Sleep(2000);
        system("pause");
        exit(0);
    }
    //初始化
    b1 = 2 * ls;
    b2 = 2 * ls;
    hit = 1;
    zs = 0;
    sk = 0;
    yu = 0;
    kb = 0;
    sd = 0;
    jl = 0;
    mxb = b1;
    dj1.clear();
    dj2.clear();
    while (g.size())g.pop();
    cout << "第" << ls << "局\n目前比分(p1 : p2):"<<win1<<" : "<<win2<<'\n';
    Sleep(1200);
    clr;
    while (1) {
        clr;
        srand(time(0));
        if (!yu) {
sc:
            ;
            int k = rand() % 5 + 1;
            cout << "现在开始上道具!\n" << pl1 << "(p1)获得了:";
            for (int i = 1; i <= k; i++) {
                int t = rand() % 5;
                dj1.push_back(t);
                cout << dj[t] << ' ';
                Sleep(500);
            }
            cout << "\n现在" << pl1 << "(p1)拥有道具:\n";
            for (auto v : dj1) {
                cout << dj[v] << ' ';
            }
            cout << '\n';
            Sleep(1200);
            system("pause");
            clr;
            cout << pl2 << "(p2)获得了:";
            for (int i = 1; i <= k; i++) {
                int t = rand() % 5;
                dj2.push_back(t);
                cout << dj[t] << ' ';
                Sleep(500);
            }
            cout << "\n现在" << pl2 << "(p2)拥有道具:\n";
            for (auto v : dj2) {
                cout << dj[v] << ' ';
            }
            cout << '\n';
            Sleep(1200);
            system("pause");
            clr;
            kb = rand() % 6 + 1;
            sd = rand() % 6 + 1;
            yu = (kb + sd);
            int tk = kb, ts = sd;
            cout << "空包弹有:" << kb << " 实弹有:" << sd << '\n';
            cout << "装填子弹中......\n";
            srand(time(0));
            for (int i = 1; i <= yu; i++) {
                bool k = rand() % 2;
                if (k) {
                    if (tk) {
                        g.push(0);
                        --tk;
                    } else {
                        g.push(1);
                        --ts;
                    }
                } else {
                    if (ts) {
                        g.push(1);
                        --ts;
                    } else {
                        g.push(0);
                        --tk;
                    }
                }
            }
            Sleep(1200);
        }
        cout << "\n现在" << pl1 << "(p1)拥有道具:\n";
        for (auto v : dj1) {
            cout << dj[v] << ' ';
        }
        cout << "\n现在" << pl2 << "(p2)拥有道具:\n";
        for (auto v : dj2) {
            cout << dj[v] << ' ';
        }
        cout << "\n生命值(p1,p2):" << b1 << "," << b2 << "\n";
        cout << "空包弹有:" << kb << "发,实弹有:" << sd << "发\n";
        if (is1) {
            cout << "现在是" << pl1 << "(p1)的回合\n";
use1:
            ;
            if (dj1.size()) {
                cout << "\n现在" << pl1 << "(p1)拥有道具:\n";
                int total = 0;
                for (auto v : dj1) {
                    cout << (++total) << "号:" << dj[v] << "   ";
                }
                cout << "你要使用道具吗?(Y/N)\n";
                string t;
ques:
                ;
                cin >> t;
                if (t.size() > 1) {
                    cout << "请重新输入:";
                    goto ques;
                }
                char q = t[0];
                q = toupper(q);
                if (q == 'Y') {
                    cout << "\n请告诉我要使用道具在你拥有的的编号(从1开始;输入0代表不小心输错不使用道具):";
                    int bh;
                    string inp;
quesd1:
                    ;
                    cin >> inp;
                    if (inp.size() > 1) {
                        cout << "不合法!\n请重新输入!";
                        goto quesd1;
                    }
                    if (!isdigit(inp[0])) {
                        cout << "不合法!\n请重新输入!";
                        goto quesd1;
                    }
                    bh = inp[0] - 49;
                    if (bh == -1)goto hit1;
                    if (bh > dj1.size() - 1 || bh < 0) {
                        cout << "不合法!\n请重新输入!";
                        goto quesd1;
                    } else {
                        int tmp = dj1[bh];
                        dj1.erase(dj1.begin() + bh);
                        switch (tmp) {
                            case 0: {
                                fdj();
                                break;
                            }
                            case 1: {
                                if (b1 == mxb) {
                                    cout << "达到上限值,无法回复。";
                                } else {
                                    ++b1;
                                    cout << "你选择了华子!\n" << pl1 << "回复1点血量,现在他有" << b1 << "条生命值!";
                                }
                                Sleep(1500);
                                break;
                            }
                            case 2: {
                                if (hit == 2) {
                                    cout << "你在本回合已经使用了小刀,不能再使用了!将会新加小刀至末尾。\n";
                                    dj1.push_back(2);
                                } else {
                                    hit = 2;
                                    cout << "你选择了小刀!这一回合将造成双倍伤害!\n";
                                }
                                Sleep(1500);
                                break;
                            }
                            case 3: {
                                drink();
                                break;
                            }
                            case 4: {
                                if (sk) {
                                    cout << "别人已经被铐起来了.....将把手铐移至末尾!\n";
                                    dj1.push_back(4);
                                } else {
                                    sk = 1;
                                    jl = 0;
                                    cout << "你选择了手铐!下一回合敌人将无法移动!\n";
                                }
                                Sleep(1500);
                                break;
                            }
                        }
                        if (!yu) {
                            goto sc;
                        }
                        goto use1;
                    }
                } else if (q == 'N') {
                    cout << "好的。";
                } else {
                    cout << "请重新输入:";
                    goto ques;
                }
            }
hit1:
            ;
            cout << "你要打谁?(0:自己 1:另一名玩家):";
            string ht1;
            bool ht;
            cin>>ht1;
            if(ht1.size()>1||!isdigit(ht1[0])){
                cout<<"请重新输入!\n";
                goto hit1; 
            }
            ht=(ht1[0]-48);
            int k = g.front();
            if (ht) {
                if (k) {
                    cout << "当前是实弹!" << pl2 << "受到了" << hit << "点伤害!\n";
                    dist(400);
                    b2 -= hit;
                    --sd;
                } else {
                    cout << "很遗憾,当前是空包弹。\n";
                    --kb;
                }
            } else {
                zs = 1;
                if (k) {
                    cout << "哦豁,当前是实弹!" << pl1 << "受到了" << hit << "点伤害!\n";
                    dist(400);
                    b1 -= hit;
                    --sd;
                } else {
                    cout << "恭喜你,当前是空包弹!\n";
                    --kb;
                }
            }
            g.pop();
            Sleep(1000);
            --yu;
            hit = 1;
        } else {
            cout << "现在是" << pl2 << "(p2)的回合\n";
use2:
            ;
            if (dj2.size()) {
                char q;
                int total = 0;
                cout << "\n现在" << pl2 << "(p2)拥有道具:\n";
                for (auto v : dj2) {
                    cout << (++total) << "号:" << dj[v] << "   ";
                }
ques2:
                ;
                cout << "\n你要使用道具吗?(Y/N)\n";
                string t;
                cin >> t;
                if (t.size() > 1) {
                    cout << "请重新输入:";
                    goto ques2;
                }
                q = t[0];
                q = toupper(q);
                if (q == 'Y') {
                    cout << "\n请告诉我要使用道具在你拥有的的编号(从1开始;输入0代表不小心输错不使用道具):";
                    string inp;
quesd2:
                    ;
                    cin >> inp;
                    if (inp.size() > 1) {
                        cout << "不合法!\n请重新输入!";
                        goto quesd2;
                    }
                    if (!isdigit(inp[0])) {
                        cout << "不合法!\n请重新输入!";
                        goto quesd2;
                    }
                    int bh = inp[0] - 49;
                    if (bh == -1) {
                        goto hit2;
                    }
                    if (bh > dj2.size() - 1 || bh < 0) {
                        cout << "不合法!\n请重新输入!";
                        goto quesd2;
                    } else {
                        int tmp = dj2[bh];
                        dj2.erase(dj2.begin() + bh);
                        switch (tmp) {
                            case 0: {
                                fdj();
                                break;
                            }
                            case 1: {
                                if (b2 == mxb) {
                                    cout << "达到上限值,无法回复。";
                                } else {
                                    ++b2;
                                    cout << "你选择了华子!\n" << pl2 << "回复1点血量,现在他有" << b2 << "条生命值!";
                                }
                                Sleep(1500);
                                break;
                            }
                            case 2: {
                                if (hit == 2) {
                                    cout << "你在本回合已经使用了小刀,不能再使用了!将会新加小刀至末尾。\n";
                                    dj2.push_back(2);
                                } else {
                                    hit = 2;
                                    cout << "你选择了小刀!这一回合将造成双倍伤害!\n";
                                }
                                Sleep(1500);
                                break;
                            }
                            case 3: {
                                drink();
                                break;
                            }
                            case 4: {
                                if (sk) {
                                    cout << "别人已经被铐起来了......将把手铐移至末尾!\n";
                                    dj2.push_back(4);
                                } else {
                                    sk = 1;
                                    jl = 0;
                                    cout << "你选择了手铐!下一回合敌人将无法移动!\n";
                                }
                                Sleep(1500);
                                break;
                            }
                        }
                        if (!yu) {
                            goto sc;
                        }
                        goto use2;
                    }
                } else if (q == 'N') {
                    cout << "好的。";
                } else {
                    cout << "请重新输入:";
                    goto ques2;
                }
            }
hit2:
            ;
            cout << "你要打谁?(0:自己 1:另一名玩家):";
            string ht1;
            bool ht;
            cin >> ht1;
            if(ht1.size()>1 || !isdigit(ht1[0])){
                cout<<"请重新输入!\n";
                goto hit2;
            }
            ht=(ht1[0]-48);
            int k = g.front();
            if (ht) {
                if (k) {
                    cout << "当前是实弹!" << pl1 << "受到了" << hit << "点伤害!\n";
                    dist(400);
                    b1 -= hit;
                    --sd;
                } else {
                    cout << "很遗憾,当前是空包弹。\n";
                    --kb;
                }
            } else {
                zs = 1;
                if (k) {
                    cout << "哦豁,当前是实弹!" << pl2 << "受到了" << hit << "点伤害!\n";
                    dist(400);
                    b2 -= hit;
                    --sd;
                } else {
                    cout << "恭喜你,当前是空包弹!\n";
                    --kb;
                }
            }
            g.pop();
            Sleep(1000);
            --yu;
            hit = 1;
        }
        if (b1 <= 0) {
            clr;
            cout << pl2 << "赢了\n";
            ++win2;
            over();
            goto start;
        }
        if (b2 <= 0) {
            clr;
            cout << pl1 << "赢了\n";
            ++win1;
            over();
            goto start;
        }
        if (sk) {
            ++jl;
            if (jl == 2) {
                sk = 0;
                jl = 0;
            }
        }
        if (!sk && !zs) {
            is1 = 1 - is1;
        }
        zs = 0;
    }
    return 0;
}

如果你的 Dev 说这个代码 CE,解决方案如下:

最顶上一栏的“工具” -> “编译选项” -> “编译时加入以下参数”

-std=c++14 -O2 -lm -static

如果还是 CE,并且提示的里面含有 -std=c++14 -O2 -lm -static,那么代表你的 Dev 版本过低,你需要下载 DevC++5.11 或 DevC++6.5(推荐下载 DevC++6.5)。

其他编译器(诸如 VSCode Codeblock)我不知道,反正你使用的是 c++14 及以上版本即可。

历代版本:

Alpha 1.2

Alpha 1.3

Alpha 1.4

Alpha 1.5

Alpha 1.6

Alpha 1.7

Alpha 1.8

Alpha 1.9

Alpha 1.10

Beta 1.0

Beta 1.1

Beta 1.2 很严重bug,修复中,请勿游玩

另外,我们也提供 Mod 玩法:

三国杀版本

  • 如果原版复刻出现了 bug,请私信 Igallta 或者给这个博客回复。

  • 如果Mod出现了 bug,请私信 _ayaka_ 或者给ta的博客回复。

  • 有 bug 一定要说!而且一定要说明确,比如某些同学只说手铐有问题,我也不知道你出现了什么问题,只知道手铐有问题,导致我 de 了半天一点问题都没看出来,也一头雾水。如果你自己非要钻牛角尖,输入个什么转义字符啊,ctrl啊…那些我们也没办法。就不要发出来了真要求改的话,你可以去找找 C/C++ 作者,和ta谈谈…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式八股文(四)计算机网络篇

第一章 基础概念 1. 服务 指网络中各层为紧邻的上层提供的功能调用,是垂直的。包括面向连接服务、无连接服务、可靠服务、不可靠服务。 2. 协议 是计算机⽹络相互通信的对等层实体之间交换信息时必须遵守的规则或约定的集合。⽹络协议的三个基本要素:语法、…

数据结构——单向循环链表、双链表、双向循环链表

目录 一、单向循环链表 1.1 单向循环链表的概念 1.2 单向循环链表的操作 1.2.1 单向循环链表的创建 1.2.2 单向循环链表的头插 1.2.3 单向循环链表的遍历 1.2.4 单向循环链表的头删 1.2.5 单向循环链表的尾插 1.2.6 单向循环链表的尾删 1.2.7 约瑟夫环 1.3 单向循环列表所有程…

dify安装

官网教程 https://github.com/langgenius/dify/blob/main/README_CN.md 1、下载源码 git clone https://github.com/langgenius/dify.git 2、进入docker目录 cd dify cd docker cp .env.example .env修改nginx对外端口配置 修改为9000 最后执行&#xff1a;docker compo…

使用Termux将安卓手机变成随身AI服务器(page assist连接)

通过以下方法在安卓手机上运行 Ollama 及大模型&#xff0c;无需 Root 权限&#xff0c;具体方案如下&#xff1a; 通过 Termux 模拟 Linux 环境运行 核心工具&#xff1a; 安装 &#xff08;安卓终端模拟器&#xff09;()]。借助 proot-distro 工具安装 Linux 发行版&#xf…

C++ STL中的reverse/unique/sort/lower_bound/upper_bound函数使用

本文主要涉及以下几个函数&#xff1a; reverse&#xff1a;反转序列。unique&#xff1a;移除相邻重复元素。sort&#xff1a;对序列进行排序。lower_bound 和 upper_bound&#xff1a;查找目标值的边界位置。头文件均为<algorithm> 1. reverse 功能&#xff1a;反转指…

QT QLabel加载图片等比全屏自适应屏幕大小显示

最近在工作项目中,遇到一个需求: 1.使用QLabel显示一张图片; 2.当点击这个QLabel时,需要全屏显示;但不能改变原来的尺寸; 3.当点击放大后的QLabel时,恢复原有大小. 于是乎,就有了本篇博客,介绍如何实现这样的功能. 一、演示效果 在一个水平布局中&#xff0c;添加两个Lable用…

C# 背景 透明 抗锯齿 (效果完美)

主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll&#xff0c;同时定义了一些结构体来配合这些 API 函数的使用&#xff0c;常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大&#xff0c;抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…

Windows10 将Docker虚拟磁盘文件ext4.vhdx迁移至D盘

今天打开电脑发现之前迁移到D盘的ext4.vdx居然占有80多个G不得不重新清理一下了 于是先删除了d盘的ext4.vdx文件 注销了原来的 wsl --unregister docker-desktopwsl --unregister docker-desktop-data 确认 WSL 发行版状态&#xff1a; 运行以下命令以确认当前的 WSL 发行版…

OpenCV二值化处理

1.1. 为什么需要二值化操作 二值化操作将灰度图像转换为黑白图像&#xff0c;即将图像中的像素值分为两类&#xff1a;前景&#xff08;通常为白色&#xff0c;值为 255&#xff09;和背景&#xff08;通常为黑色&#xff0c;值为 0&#xff09;。二值化的主要目的是简化图像&…

深入了解 DevOps 基础架构:可追溯性的关键作用

在当今竞争激烈的软件环境中&#xff0c;快速交付强大的应用程序至关重要。尽管如此&#xff0c;在不影响质量的情况下保持速度可能是一项艰巨的任务&#xff0c;这就是 DevOps 中的可追溯性发挥作用的地方。通过提供软件开发生命周期 &#xff08;SDLC&#xff09; 的透明视图…

由浅入深学习大语言模型RLHF(PPO强化学习- v1浅浅的)

最近&#xff0c;随着DeepSeek的爆火&#xff0c;GRPO也走进了视野中。为了更好的学习GRPO&#xff0c;需要对PPO的强化学习有一个深入的理解&#xff0c;那么写一篇文章加深理解吧。纵观网上的文章&#xff0c;要么说PPO原理&#xff0c;各种复杂的公式看了就晕&#xff0c;要…

【Java八股文】08-计算机网络面试篇

【Java八股文】08-计算机网络面试篇 计算机网络面试篇网络模型网络OSI模型和TCP/IP模型分别介绍一下键入网址到网页显示&#xff0c;期间发生了什么&#xff1f; 应用层- HTTP应用层有哪些协议&#xff1f;HTTP是什么及HTTP报文有哪些部分&#xff1f;HTTP是怎么传输数据的HTTP…

【Linux】Linux 文件系统——有关 inode 不足的案例

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周二了&#xff0c;明天星期三&#xff0c;还有三天就是星期五了&#xff0c;坚持住啊各位&#xff01;&#xff01;&#xff01;&#x1f606; 本文是对之前Linux文件权限中的inode号进行实例讨论&#xff0c;看到博客有错误…

SpringBoot整合Redis和Redision锁

参考文章 1.Redis 1.导入依赖 <!--Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.c…

亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!

作者&#xff1a;程序员 Hollis 之前介绍过在IDEA中使用DeepSeek的方案&#xff0c;但是很多人表示还是用的不够爽&#xff0c;比如用CodeChat的方案&#xff0c;只支持V3版本&#xff0c;不支持带推理的R1。想要配置R1的话有特别的麻烦。 那么&#xff0c;今天&#xff0c;给…

一周学会Flask3 Python Web开发-Debug模式开启

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 默认情况&#xff0c;项目开发是普通模式&#xff0c;也就是你修改了代码&#xff0c;必须重启项目&#xff0c;新代码才生效&…

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…

PyTorch 深度学习框架中 torch.cuda.empty_cache() 的妙用与注意事项

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在使用 PyTorch 进行深度学习模型训练与调优过程中&#xff0c;torch.cuda.empty_cache() 方法作为一种高效工具被广泛采用&#xff1b;但其正确应用要求充分理解该方法的功能及最佳实践。下文将对该方…

巧用GitHub的CICD功能免费打包部署前端项目

近年来&#xff0c;随着前端技术的发展&#xff0c;前端项目的构建和打包过程变得越来越复杂&#xff0c;占用的资源也越来越多。我有一台云服务器&#xff0c;原本打算使用Docker进行部署&#xff0c;以简化操作流程。然而&#xff0c;只要执行sudo docker-compose -f deploy/…

配置Api自动生成

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/TVlJdMgYLoDJrsxAwMgcCE14nxt 使用Springfox Swagger生成API&#xff0c;并导入Postman&#xff0c;完成API单元测试 Swagger: 是一套API定义的规范&#xff0c;按照这套规范的要求去定义接口及接口相关信息&#xff0c;再通过可…