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));
}