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

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

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



```c++
#include
#include 
#include 
#include 
#include 
#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;
}

```

参考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;
}


该回答引用ChatGPT

如有疑问可以回复我
你可以在 Draw() 函数中添加计时器和正确率的绘制。同时,需要注意时间超过60秒时要停止游戏。

下面是修改后的代码:


#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;
clock_t start_time = clock(); // 记录开始时间
// 初始化字母
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 text[20];
    sprintf_s(text, "Score: %d", score);
    settextstyle(50, 20, "Arial");
    outtextxy(20, 20, text);
    
    // 绘制时间
    clock_t current_time = clock(); // 获取当前时间
    int elapsed_time = (int)(current_time - start_time) / CLOCKS_PER_SEC;
    if (elapsed_time > 60) {
        // 时间超过60秒时停止游戏
        outtextxy(500, 300, "Time: 60");
        outtextxy(100, 300, "Correct Rate: 100%");
        return;
    }
    char time1[20];
    sprintf_s(time1, "Time: %d", elapsed_time);
    settextstyle(50, 20, "HandelGothic BT");
    outtextxy(500,300,time1);
    
    // 绘制正确率
    settextstyle(50, 20, "HandelGothic BT");
    char correct2[20];
    int correct_count = score / n;
    int correct_rate = correct_count * 100;
    sprintf_s(correct2, "Correct Rate: %d%%", correct_rate);
    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';
        }
    }
}



可以使用C++的time库来实现时间的计时。在游戏开始时,您可以使用time()函数获取当前时间,然后在游戏结束时再次调用该函数,计算两个时间点之间的差值即可得到游戏的总时间。例如:

time_t startTime, endTime;
double totalTime;
time(&startTime); // 获取开始时间
// 游戏代码
time(&endTime); // 获取结束时间
totalTime = difftime(endTime, startTime); // 计算总时间

要统计正确率,可以使用一个变量来记录用户输入的总字符数和正确字符数,然后计算正确率。例如:

int totalChars = 0, correctChars = 0;
// 用户输入代码
totalChars++; // 统计总字符数
if (userInput == correctInput) {
    correctChars++; // 统计正确字符数
}
double accuracy = (double)correctChars / totalChars * 100; // 计算正确率

draw函数中,可以将计时时间和正确率显示在创建的文本控件中,例如:

void draw() {
    // 显示计时时间
    ui->timerLabel->setText(QString("Time: %1").arg(totalTime));
    // 显示正确率
    ui->accuracyLabel->setText(QString("Accuracy: %1%").arg(accuracy));
}