#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <cmath>
#include <iomanip>
#include <limits.h>
using namespace std;
class Timer {
private:
bool running;
bool paused;
clock_t start_time;
clock_t pause_time;
double elapsed_time;
public:
Timer() : running(false), paused(false), elapsed_time(0.0) {}
void start() {
if (!running) {
running = true;
paused = false;
start_time = clock();
}
}
void pause() {
if (running && !paused) {
paused = true;
pause_time = clock();
}
}
void resume() {
if (running && paused) {
paused = false;
elapsed_time += (double)(clock() - pause_time) / CLOCKS_PER_SEC;
}
}
void stop() {
if (running) {
running = false;
elapsed_time += (double)(clock() - start_time) / CLOCKS_PER_SEC;
display();
}
}
void display() const {
double total_elapsed = elapsed_time;
if (running && !paused) {
total_elapsed += (double)(clock() - start_time) / CLOCKS_PER_SEC;
}
int hours = int(total_elapsed / 3600);
total_elapsed -= hours * 3600;
int minutes = int(total_elapsed / 60);
total_elapsed -= minutes * 60;
int seconds = int(total_elapsed);
int milliseconds = int((total_elapsed - seconds) * 1000);
cout << "已用时间:"
<< setfill('0') << setw(2) << hours << ":"
<< setw(2) << minutes << ":"
<< setw(2) << seconds << "."
<< setw(3) << milliseconds << endl;
}
void reset() {
running = false;
paused = false;
elapsed_time = 0.0;
}
};
bool getInput(double &answer) {
cin >> answer;
if (cin.fail()) {
cin.clear();
cin.ignore(INT_MAX, '\n'); // 使用INT_MAX代替numeric_limits<streamsize>::max()
cout << "输入无效,请重新输入!" << endl;
return false;
}
return true;
}
int score = 0;
int level = 1;
int wrongnum = 0;
int truenum = 0;
int randomInt(int min, int max) {
return rand() % (max - min + 1) + min;
}
bool checkAnswer(double correct, double input) {
return fabs(correct - input) < 0.001;
}
void additionLevel() {
cout << "\n=== 第" << level << "关:加法挑战 ===" << endl;
for (int i = 0; i < 10; ++i) {
int a = randomInt(10 * level, 50 * level);
int b = randomInt(10 * level, 50 * level);
cout << a << " + " << b << " = ? ";
double answer;
while (!getInput(answer)) {}
if (checkAnswer(a + b, answer)) {
cout << "正确!\n";
score += 10;
truenum++;
} else {
cout << "错误!正确答案是:" << a + b << endl;
wrongnum++;
}
}
}
void fractionLevel() {
cout << "\n=== 第" << level << "关:分数运算 ===" << endl;
for (int i = 0; i < 10; ++i) {
int numerator1 = randomInt(1, 5 * level);
int denominator1 = randomInt(2, 5 * level);
int numerator2 = randomInt(1, 5 * level);
int denominator2 = randomInt(2, 5 * level);
cout << "(" << numerator1 << "/" << denominator1 << ") + ("
<< numerator2 << "/" << denominator2 << ") = ? ";
double correct = (numerator1*1.0/denominator1) + (numerator2*1.0/denominator2);
double answer;
cin >> answer;
if (checkAnswer(correct, answer)) {
cout << "正确!\n";
score += 15;
truenum++;
} else {
cout << "错误!正确答案是:" << correct << endl;
wrongnum++;
}
}
}
void equationLevel() {
cout << "\n=== 第" << level << "关:解方程 ===" << endl;
for (int i = 0; i < 10; ++i) {
int x = randomInt(1, 10); // 随机生成解
int a = randomInt(1, 3 + level);
int b = randomInt(5 * level, 10 * level);
int right_side = a * x + b;
cout << a << "x + " << b << " = " << right_side << ",求x的值:";
double answer;
while (!getInput(answer)) {}
if (checkAnswer(x, answer)) {
cout << "正确!\n";
score += 20;
truenum++;
} else {
cout << "错误!正确答案是:" << x << endl;
wrongnum++;
}
}
}
int main() {
srand(time(0));
Timer timer;
timer.start();
cout << "======== 数学大通关 ========\n";
cout << "规则:\n";
cout << "1. 通过3关即可获胜\n";
cout << "2. 每个关卡有10道题\n";
while (level <= 3) {
cout << "\n当前得分:" << score << " 关卡:" << level << endl;
switch(level) {
case 1:
additionLevel();
break;
case 2:
fractionLevel();
break;
case 3:
equationLevel();
break;
}
cout << "\n对了" << truenum << "题!\n";
cout << "\n错了" << wrongnum << "题!\n";
level++;
}
timer.stop();
if (level > 3) {
cout << " 恭喜你通关!最终得分:" << score << endl;
} else {
cout << "\n游戏结束!最终得分:" << score << endl;
}
timer.reset();
return 0;
}
可以运行,挺好玩的,但是我感觉太长了,求大佬们优化优化