嗨嗨嗨,我又写了一个新游戏;

按照惯例,上代码,别废话!


#include#include 
#include 
#include 
#include#include#include#includeusing namespace std;

int mode; // 游戏模式: 1.经典模式 2.限时模式 3.无尽模式

int getch()
{// 不回显的输入
    struct termios nts, ots;
    // 得到当前终端(0表示标准输入)的设置
    if (tcgetattr(0, &ots) < 0) return EOF;
    // 设置终端为Raw原始模式,该模式下所有的输入数据以字节为单位被处理
    nts = ots;
    cfmakeraw(&nts); 
    // 设置上更改之后的设置
    if (tcsetattr(0, TCSANOW, &nts) < 0) return EOF;
    // 设置还原成老的模式
    int cr;
    cr = getchar();
    if (tcsetattr(0, TCSANOW, &ots) < 0)  return EOF;
    return cr;
}

// 打印1-4数字 num数字颜色标记为color
void print(int num, string color) 
{
    cout << "\033[0;0H";
    if (mode == 1) cout << "    ==== 经典模式 ====" << endl;
    if (mode == 2) cout << "    ==== 限时模式 ====" << endl;
    if (mode == 3) cout << "    ==== 无尽模式 ====" << endl;
    cout << "    ";
    for (int i = 1; i <= 4; i++)
    {
        if (i == num)
        {
            if (color == "black")
                cout << "\033[37;40m " << i << " \033[0m";
            if (color == "green")
                cout << "\033[37;42m " << i << " \033[0m";
            if (color == "red")
                cout << "\033[37;41m " << i << " \033[0m";
        }
        else
        {
            cout << "\033[30;47m " << i << " \033[0m";
        }
    }
    cout << endl;
}

void intro() // 规则介绍
{
    cout << "\033c" << flush;
    cout << "    =============================================" << endl;
    cout << "    测测你的手速!别踩白块!" << endl;
    cout << "    开始后,你需要用最快的速度按下黑色数字按键。" << endl;
    cout << "    游戏共有 3 种模式: 1.经典模式 2.限时模式 3.无尽模式" << endl;
    cout << "    1.经典模式: 在最短时间内完成25次按键任务" << endl;
    cout << "    2.限时模式: 在30s内完成尽可能多的按键任务" << endl;
    cout << "    3.无尽模式: 不限时,按错为止" << endl;
    cout << "    准备好了嘛?" << endl;
    cout << "    按下对应数字(1~3)我们就开始了~" << endl;
    cout << "    *注意:请将输入法改为英文!" << endl;
    cout << "    =============================================" << endl;
}

void game() // 游戏进程
{
    srand(time(0));
    int right = 0; // 按键次数
    int start = time(0); // 开始时间
    int tme = time(0) - start; // 已用时
    cout << "\033c" << flush;
    while (true)
    {
        // 结束游戏 1.经典模式 25次 2.限时模式 30s
        if (mode == 1 && right >= 25) break;
        if (mode == 2 && tme >= 30) break;

        // 生成随机数
        int r = rand() % 4 + 1;
        print(r, "black");

        // 获取按键
        char ch = getch();
        if (r == ch - '0') // 按键正确
        {
            right++;
            print(r, "green");
            usleep(100000);
            tme = time(0) - start;
            cout << "    已用时: " << tme << " s  " << endl;
            cout << "    按键数: " << right << " 次  "<< endl;
        }
        else // 按键错误
        {
            tme = time(0) - start;
            cout << "\033c" << flush;
            print(ch-'0', "red");
            usleep(100000);
            cout << "    ==== GAME OVER! ====" << endl;
            usleep(500000);
            break;
        }
    }
    // 游戏总结
    cout << "\033c" << flush;
    cout << "    ==== 总结 ====" << endl;
    cout << "    总用时: " << tme << " s" << endl;
    cout << "    按键数: " << right << " 次" << endl;
    cout << "    手 速: " << 1.0*right/tme << " 次/s" << endl;
    cout << "    ==============" << endl;
    cout << "    按回车开始新游戏..." << endl;
    getchar();
}

int main()
{
    while (true)
    {
        intro();
        char ch = getch();
        if (ch >= '1' && ch <= '3')
        {
            mode = ch - '0'; // 设定模式
            game();
        }
        else if (ch == 27) // ESC的ascii是27
        {
            cout << "    退出游戏!" << endl;
            break;
        }
        else  cout << "    输入有误,请再次输入!" << endl;
    }
    return 0;
}
OK,下期再见,拜拜!


本站作者已申明原创,禁止转载!

文章内容属作者个人观点,不代表本站立场,如有侵权立删。