-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
97 lines (86 loc) · 3.42 KB
/
main.cpp
File metadata and controls
97 lines (86 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <chrono>
#include <thread>
#include <poll.h>
#include <unistd.h>
#include <termios.h>
#include <algorithm>
#include <csignal>
#include <cstdlib>
// Color and formatting macros for terminal output
#define RESET "\033[0m"
#define RED "\033[31m"
#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define BLUE "\033[34m"
#define CLR_SCORE "\033[1;36m"
#define CLR_HARD "\033[1;31m"
#define CLR_NORM "\033[1;32m"
#define CLR_CTRL "\033[1;33m"
#define CLR_RESET "\033[0m"
struct termios oldt;
void restore_terminal(int signum) {
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
// Use write() and _exit() because they are async-signal-safe
const char msg[] = "\033[?25h\033[0m\n\nGame interrupted. Terminal settings restored.\n";
write(STDOUT_FILENO, msg, sizeof(msg) - 1);
_exit(signum);
}
int main() {
struct termios newt;
if (tcgetattr(STDIN_FILENO, &oldt) == -1) {
perror("tcgetattr");
return 1;
}
std::signal(SIGINT, restore_terminal);
std::signal(SIGTERM, restore_terminal);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
if (tcsetattr(STDIN_FILENO, TCSANOW, &newt) == -1) {
perror("tcsetattr");
return 1;
}
long long score = 0; bool hardMode = false; char input;
std::cout << CLR_CTRL << "==========================\n SPEED CLICKER\n==========================\n" << CLR_RESET
<< "Controls:\n " << CLR_CTRL << "[h]" << CLR_RESET << " Toggle Hard Mode (10x Speed!)\n "
<< CLR_CTRL << "[q]" << CLR_RESET << " Quit Game\n " << CLR_CTRL << "[Any key]" << CLR_RESET << " Click!\n\n";
std::cout << "Press any key to start..." << std::flush;
read(STDIN_FILENO, &input, 1);
std::cout << "\r \r";
std::cout << "\033[?25l" << std::flush;
struct pollfd fds[1] = {{STDIN_FILENO, POLLIN, 0}};
auto last_tick = std::chrono::steady_clock::now();
bool updateUI = true;
while (true) {
int timeout_ms = hardMode ? 100 : 1000;
auto now = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - last_tick).count();
int remaining = std::max(0, static_cast<int>(timeout_ms - elapsed));
if (poll(fds, 1, remaining) > 0) {
if (read(STDIN_FILENO, &input, 1) <= 0 || input == 'q') break;
if (input == 'h') hardMode = !hardMode;
else score++;
updateUI = true;
}
now = std::chrono::steady_clock::now();
elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - last_tick).count();
if (elapsed >= timeout_ms) {
score++;
last_tick = now;
updateUI = true;
}
if (updateUI) {
std::cout << GREEN << "Score: " << score << RESET
<< (hardMode ? RED " [FAST] " : BLUE " [NORMAL] ") << RESET
<< " \r" << std::flush;
std::cout << "\r" << CLR_SCORE << "Score: " << score << CLR_RESET << " "
<< (hardMode ? CLR_HARD "[HARD MODE]" : CLR_NORM "[NORMAL MODE]")
<< " " << std::flush;
updateUI = false;
}
}
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
std::cout << "\033[?25h"; // Restore cursor
std::cout << "\n\n" << CLR_SCORE << "Final Score: " << score << CLR_RESET << "\nThanks for playing!\n";
return 0;
}