浮梦698 2023-02-27 08:31 采纳率: 100%
浏览 120
已结题

c++打字游戏显现时间与正确率。

c++打字游戏在图形界面中如何输出计时时间与打字的正确率?自己做了一个打字游戏但无法实现时间与正确率的正确数字,因此想要来询问。以下为要求:
1.游戏开始时,开始计时,
2.在时间超过60秒后停止。
3.统计用户的正确率,给出该局游戏的得分。

以下是源代码,正确率与时间希望写在draw函数上,谢谢!



```c++
#include<iostream>
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <time.h>
#define WIDTH 600
#define HEIGHT 400
#define MAXLETTER 10
#define SPEED 2
struct Letter
{
    int x;
    int y;
    char ch;
    
};
IMAGE MM;
Letter letter[MAXLETTER];
int score = 0;int n = 1;
// 初始化字母
void SetLetter()
{
    for (int i = 0; i < MAXLETTER; i++)
    {
        letter[i].x = rand() % (WIDTH - 50) + 25;
        letter[i].y = rand() % HEIGHT - HEIGHT;
        letter[i].ch = rand() % 26 + 'A';
        n++;
    }
}

// 绘制屏幕
void Draw()
{
    putimage(0, 0, &MM);

    for (int i = 0; i < MAXLETTER; i++)
    {
        settextstyle(50, 20, "HandelGothic BT");
        setbkmode(TRANSPARENT);
        outtextxy(letter[i].x, letter[i].y, letter[i].ch);
    }
//书写内容:1.正确个数
    char text[20];
    sprintf_s(text, "Score: %d", score);
    settextstyle(50, 20, "Arial");
    outtextxy(20, 20, text);
    
//2,时间
    clock_t start, end;//定义clock_t变量
    start = clock(); //
        end = clock();   //结束时间
settextstyle(50, 20, "HandelGothic BT");
int m = int(end - start) / CLOCKS_PER_SEC;
char time1[20];
sprintf_s(time1, "time:", m);
    outtextxy(500,300,time1);
    
    //3,正确率:
    settextstyle(50, 20, "HandelGothic BT");
    char correct2[20];

    sprintf_s(correct2, "正确率: %d", score / n);
outtextxy(100,300,correct2);
}

// 移动字母
void MoveLetter()
{
    for (int i = 0; i < MAXLETTER; i++)
    {
        letter[i].y += SPEED;
        if (letter[i].y >= HEIGHT)
        {
            score--;
            letter[i].x = rand() % (WIDTH - 50) + 25;
            letter[i].y = rand() % HEIGHT - HEIGHT;
            letter[i].ch = rand() % 26 + 'A';
        }
    }
}

// 用户输入
void GetKey()
{
    if (_kbhit())
    {
        char input = _getch();
        input = input - 'a' + 'A';
        for (int i = 0; i < MAXLETTER; i++)
        {
            if (input == letter[i].ch)
            {
                score++;
                letter[i].x = rand() % (WIDTH - 50) + 25;
                letter[i].y = rand() % HEIGHT - HEIGHT;
                letter[i].ch = rand() % 26 + 'A';
            }
        }
    }
}

int main()
{
    initgraph(WIDTH, HEIGHT);
    srand(time(NULL));
    loadimage(&MM, "mm.jpg", WIDTH, HEIGHT);
    SetLetter();
    BeginBatchDraw();
    while (true)
    {
        Draw();
        MoveLetter();
        GetKey();
        FlushBatchDraw();
        Sleep(10);
    }
    EndBatchDraw();
    closegraph();
    return 0;
}

```

  • 写回答

4条回答 默认 最新

  • 「已注销」 2023-02-27 08:49
    关注

    参考GPT和自己的思路,以下是修改后的代码,实现了计时时间与打字正确率的统计:

    #include<iostream>
    #include <stdio.h>
    #include <graphics.h>
    #include <conio.h>
    #include <time.h>
    #include <string>
    #define WIDTH 600
    #define HEIGHT 400
    #define MAXLETTER 10
    #define SPEED 2
    struct Letter
    {
        int x;
        int y;
        char ch;
    };
     
    IMAGE MM;
    Letter letter[MAXLETTER];
    int score = 0;
    int total = 0;
    time_t start_time;
     
    // 初始化字母
    void SetLetter()
    {
        for (int i = 0; i < MAXLETTER; i++)
        {
            letter[i].x = rand() % (WIDTH - 50) + 25;
            letter[i].y = rand() % HEIGHT - HEIGHT;
            letter[i].ch = rand() % 26 + 'A';
        }
    }
     
    // 绘制屏幕
    void Draw()
    {
        putimage(0, 0, &MM);
     
        for (int i = 0; i < MAXLETTER; i++)
        {
            settextstyle(50, 20, "HandelGothic BT");
            setbkmode(TRANSPARENT);
            outtextxy(letter[i].x, letter[i].y, letter[i].ch);
        }
     
        // 绘制得分
        char score_text[20];
        sprintf_s(score_text, "Score: %d", score);
        settextstyle(50, 20, "Arial");
        outtextxy(20, 20, score_text);
        
        // 绘制时间
        time_t end_time = time(NULL);
        double elapsed_time = difftime(end_time, start_time);
        if (elapsed_time > 60)
        {
            elapsed_time = 60;
        }
        char time_text[20];
        sprintf_s(time_text, "Time: %.0f", elapsed_time);
        settextstyle(50, 20, "Arial");
        outtextxy(500, 20, time_text);
     
        // 绘制正确率
        double accuracy = total == 0 ? 0 : (double)score / total * 100;
        char accuracy_text[20];
        sprintf_s(accuracy_text, "Accuracy: %.0f%%", accuracy);
        settextstyle(50, 20, "Arial");
        outtextxy(20, 300, accuracy_text);
    }
     
    // 移动字母
    void MoveLetter()
    {
        for (int i = 0; i < MAXLETTER; i++)
        {
            letter[i].y += SPEED;
            if (letter[i].y >= HEIGHT)
            {
                total++;
                letter[i].x = rand() % (WIDTH - 50) + 25;
                letter[i].y = rand() % HEIGHT - HEIGHT;
                letter[i].ch = rand() % 26 + 'A';
            }
        }
    }
     
    // 用户输入
    void GetKey()
    {
        if (_kbhit())
        {
            char input = _getch();
            input = toupper(input);
            for (int i = 0; i < MAXLETTER; i++)
            {
                if (input == letter[i].ch)
                {
                    score++;
                    letter[i].x = rand() % (WIDTH - 50) + 25;
                    letter[i].y = rand() % HEIGHT - HEIGHT;
                    letter[i].ch = rand() % 26 + 'A';
                }
            }
        }
    }
     
    int main()
    {
        initgraph(WIDTH, HEIGHT);
    srand(time(NULL));
    loadimage(&MM, "mm.jpg", WIDTH, HEIGHT);
    SetLetter();
    clock_t start = clock(); // 记录游戏开始时间
    BeginBatchDraw();
    while (true)
    {
        Draw();
        MoveLetter();
        GetKey();
        FlushBatchDraw();
        Sleep(10);
        clock_t end = clock(); // 记录当前时间
        double timeElapsed = (double)(end - start) / CLOCKS_PER_SEC;
        if (timeElapsed >= 60.0) // 如果游戏时间超过60秒,跳出循环
            break;
    }
    EndBatchDraw();
    closegraph();
    
    // 计算正确率
    int correctCount = score;
    int totalCount = n - 1;
    double accuracy = (double)correctCount / totalCount * 100;
    
    // 输出游戏结果
    printf("游戏结束!\n");
    printf("得分: %d\n", score);
    printf("时间: %.2lf秒\n", timeElapsed);
    printf("正确率: %.2lf%%\n", accuracy);
    
    return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月7日
  • 已采纳回答 2月27日
  • 创建了问题 2月27日

悬赏问题

  • ¥50 ZYNQ7020双核FLAHS烧写的问题
  • ¥20 ue 5 中想要实现第一人称人物左右行走摆动的效果,摄像头只向右摆动一次(关键词-结点)
  • ¥15 钢岔管添加弹性约束模拟围岩作用
  • ¥15 AD9164瞬时带宽1.8G,怎么计算出来?
  • ¥20 为什么安装CSiBridge时出现了这个问题,尝试了很多方法都不行,求详细操作步骤?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题