From 2d51db1367ac57ddc4545f4de118e119a6afd146 Mon Sep 17 00:00:00 2001 From: ZGT23 <3458926299@qq.com> Date: Tue, 23 Sep 2025 20:43:58 +1000 Subject: [PATCH 1/2] Tetriz update --- games/tetriz/.gitignore | 6 + games/tetriz/.vscode/settings.json | 89 +++++++++ games/tetriz/CMakeLists.txt | 21 +++ games/tetriz/color.h | 16 ++ games/tetriz/control.cpp | 117 ++++++++++++ games/tetriz/control.h | 24 +++ games/tetriz/define.h | 65 +++++++ games/tetriz/draw.cpp | 204 ++++++++++++++++++++ games/tetriz/draw.h | 21 +++ games/tetriz/game.cpp | 290 +++++++++++++++++++++++++++++ games/tetriz/game.h | 84 +++++++++ games/tetriz/main.cpp | 44 +++++ games/tetriz/piece.cpp | 119 ++++++++++++ games/tetriz/piece.h | 34 ++++ games/tetriz/readme.md | 3 + games/tetriz/terminal.cpp | 76 ++++++++ games/tetriz/terminal.h | 23 +++ games/tetriz/tetriz.map | 20 ++ games/tetriz/tetromino.cpp | 76 ++++++++ games/tetriz/tetromino.h | 9 + games/tetriz/utils.cpp | 42 +++++ games/tetriz/utils.h | 14 ++ games/tetriz/window.cpp | 152 +++++++++++++++ games/tetriz/window.h | 13 ++ 24 files changed, 1562 insertions(+) create mode 100644 games/tetriz/.gitignore create mode 100644 games/tetriz/.vscode/settings.json create mode 100644 games/tetriz/CMakeLists.txt create mode 100644 games/tetriz/color.h create mode 100644 games/tetriz/control.cpp create mode 100644 games/tetriz/control.h create mode 100644 games/tetriz/define.h create mode 100644 games/tetriz/draw.cpp create mode 100644 games/tetriz/draw.h create mode 100644 games/tetriz/game.cpp create mode 100644 games/tetriz/game.h create mode 100644 games/tetriz/main.cpp create mode 100644 games/tetriz/piece.cpp create mode 100644 games/tetriz/piece.h create mode 100644 games/tetriz/readme.md create mode 100644 games/tetriz/terminal.cpp create mode 100644 games/tetriz/terminal.h create mode 100644 games/tetriz/tetriz.map create mode 100644 games/tetriz/tetromino.cpp create mode 100644 games/tetriz/tetromino.h create mode 100644 games/tetriz/utils.cpp create mode 100644 games/tetriz/utils.h create mode 100644 games/tetriz/window.cpp create mode 100644 games/tetriz/window.h diff --git a/games/tetriz/.gitignore b/games/tetriz/.gitignore new file mode 100644 index 00000000..17b3a8c7 --- /dev/null +++ b/games/tetriz/.gitignore @@ -0,0 +1,6 @@ +build/ +*.obj +*.pdb +*.exe +*.o +*.log diff --git a/games/tetriz/.vscode/settings.json b/games/tetriz/.vscode/settings.json new file mode 100644 index 00000000..aaaa7d78 --- /dev/null +++ b/games/tetriz/.vscode/settings.json @@ -0,0 +1,89 @@ +{ + "cmake.generator": "Ninja", + "cmake.outputLogEncoding": "auto", + "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", + "files.associations": { + "iostream": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "charconv": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "semaphore": "cpp", + "span": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "typeinfo": "cpp", + "variant": "cpp", + "codecvt": "cpp", + "map": "cpp", + "ranges": "cpp", + "fstream": "cpp", + "cstring": "cpp", + "format": "cpp", + "forward_list": "cpp", + "ios": "cpp", + "list": "cpp", + "locale": "cpp", + "queue": "cpp", + "xfacet": "cpp", + "xhash": "cpp", + "xiosbase": "cpp", + "xlocale": "cpp", + "xlocbuf": "cpp", + "xlocinfo": "cpp", + "xlocmes": "cpp", + "xlocmon": "cpp", + "xlocnum": "cpp", + "xloctime": "cpp", + "xmemory": "cpp", + "xstring": "cpp", + "xtr1common": "cpp", + "xtree": "cpp", + "xutility": "cpp" + } +} \ No newline at end of file diff --git a/games/tetriz/CMakeLists.txt b/games/tetriz/CMakeLists.txt new file mode 100644 index 00000000..8b1761de --- /dev/null +++ b/games/tetriz/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.16) +project(tetriz CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +file(GLOB TETRIZ_SRC + "${CMAKE_CURRENT_LIST_DIR}/*.cpp" + "${CMAKE_CURRENT_LIST_DIR}/*.cxx" +) + +if(NOT TETRIZ_SRC) + message(FATAL_ERROR "No source files found in games/tetriz") +endif() + +add_executable(tetriz ${TETRIZ_SRC}) + +# find_package(Curses REQUIRED) # Uncomment if ncurses is used +# target_link_libraries(tetriz PRIVATE ${CURSES_LIBRARIES}) + +install(TARGETS tetriz RUNTIME DESTINATION games/bin) diff --git a/games/tetriz/color.h b/games/tetriz/color.h new file mode 100644 index 00000000..9f39153d --- /dev/null +++ b/games/tetriz/color.h @@ -0,0 +1,16 @@ + +#pragma once + +enum class Color +{ + Cyan = 14, + Red = 9, + Orange = 214, + Yellow = 11, + Green = 2, + Blue = 12, + Purple = 5, + White = 15, + Black = 0, + Gray = 8 +}; \ No newline at end of file diff --git a/games/tetriz/control.cpp b/games/tetriz/control.cpp new file mode 100644 index 00000000..012d0a36 --- /dev/null +++ b/games/tetriz/control.cpp @@ -0,0 +1,117 @@ + +#include "control.h" +#include "define.h" +#include "game.h" +namespace gm +{ + char command; + + std::map> comm_func{ + {KEY_Q, command_quit}, + {KEY_ESCAPE, command_quit}, + {KEY_W, command_rotate_R}, + {KEY_UP, command_rotate_R}, + {KEY_Z, command_rotate_L}, + {KEY_X, command_rotate_2}, + {KEY_S, command_down}, + {KEY_DOWN, command_down}, + {KEY_A, command_left}, + {KEY_LEFT, command_left}, + {KEY_D, command_right}, + {KEY_RIGHT, command_right}, + {KEY_C, command_hold}, + {KEY_R, command_reset}, + {KEY_H, command_help}, + {KEY_SPACE, command_drop}, + {KEY_P, command_pause}, + + }; +#ifdef __linux__ + char getch() + { + char c; + struct termios old, cur; + tcgetattr(0, &cur); + old = cur; + cfmakeraw(&cur); + tcsetattr(0, 0, &cur); + c = getchar(); + tcsetattr(0, 0, &old); + return c; + } +#endif + + void key_event() + { + while (running) + { + command = getch(); + if (comm_func.find(command) != comm_func.end()) + comm_func[command](); + } + } + + void start_listener() + { + static std::jthread t(key_event); + } + + void command_quit() + { + quit(); + } + + void command_rotate_R() + { + rotate(1); + } + void command_rotate_L() + { + rotate(3); + } + void command_rotate_2() + { + rotate(2); + } + + void command_left() + { + left(); + } + + void command_right() + { + right(); + } + + void command_down() + { + down(); + } + + void command_drop() + { + drop(); + } + + void command_hold() + { + hold(); + } + + void command_reset() + { + reset(); + } + + void command_help() + { + help(); + } + + void command_pause() + { + pause(); + } + +} // namespace gm \ No newline at end of file diff --git a/games/tetriz/control.h b/games/tetriz/control.h new file mode 100644 index 00000000..ff9d3961 --- /dev/null +++ b/games/tetriz/control.h @@ -0,0 +1,24 @@ + +#pragma once + +namespace gm +{ + extern char command; + void key_event(); + void start_listener(); + + // 键盘命令函数 + void command_quit(); + void command_rotate_R(); + void command_rotate_L(); + void command_rotate_2(); + void command_left(); + void command_right(); + void command_down(); + void command_drop(); + void command_hold(); + void command_reset(); + void command_help(); + void command_pause(); + +} // namespace gm diff --git a/games/tetriz/define.h b/games/tetriz/define.h new file mode 100644 index 00000000..0d8661c3 --- /dev/null +++ b/games/tetriz/define.h @@ -0,0 +1,65 @@ + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __linux__ +#include +#include +#elif _WIN32 +#include +#include +#endif + +using namespace std::chrono_literals; + +#define KEY_Q 'q' +#define KEY_W 'w' +#define KEY_S 's' +#define KEY_A 'a' +#define KEY_D 'd' +#define KEY_Z 'z' +#define KEY_X 'x' +#define KEY_C 'c' +#define KEY_R 'r' +#define KEY_H 'h' +#define KEY_P 'p' + + +#ifdef __linux__ +#define KEY_UP 65 +#define KEY_DOWN 66 +#define KEY_LEFT 68 +#define KEY_RIGHT 67 +#elif _WIN32 +#define KEY_UP 72 +#define KEY_DOWN 80 +#define KEY_LEFT 75 +#define KEY_RIGHT 77 +#endif + +#define KEY_ENTER 13 +#define KEY_BACKSPACE 127 +#define KEY_ESCAPE 27 +#define KEY_SPACE 32 + +using Matrix = std::vector>; +using Tetromino = std::vector>>; +using Offset = std::vector>>; +using std::ranges::views::iota; diff --git a/games/tetriz/draw.cpp b/games/tetriz/draw.cpp new file mode 100644 index 00000000..cc03beb8 --- /dev/null +++ b/games/tetriz/draw.cpp @@ -0,0 +1,204 @@ + +#include "draw.h" +#include "terminal.h" +#include +#include "utils.h" +#include "piece.h" +#include "game.h" +/** + * 0 1 2 3 4 5 6 7 8 9 A B C D E F +U+250x ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏ +U+251x ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟ +U+252x ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯ +U+253x ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿ +U+254x ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏ +U+255x ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟ +U+256x ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯ +U+257x ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿ + * +*/ + +namespace dw +{ + // 0123456 + const std::u32string style1 = U" ┌┐└┘│─"; + const std::u32string style2 = U" ╔╗╚╝║═"; + const std::u32string style3 = U" ┏┓┗┛┃━"; + const std::u32string style4 = U" ╭╮╰╯│─"; + std::u32string cur_style = style4; + + std::map map_style{ + {1, style1}, + {2, style2}, + {3, style3}, + {4, style4}, + }; + + // 1,10,12,22 + void window(int top, int left, int width, int height, std::string title, int style, int color, std::ostream &os) + { + if (style) + cur_style = map_style[style]; + + tc::set_fore_color(color, os); + for (int r = 0; r < height; ++r) + { + tc::move_to(top + r, ut::b2c(left), os); + for (int c = 0; c < width; ++c) + { + if (r == 0) // 第一行 + { + if (c == 0) // 第一列 + { + os << ut::utf32_to_utf8({cur_style[0], cur_style[1]}); + } + else if (c == width - 1) // 最后一列 + { + os << ut::utf32_to_utf8({cur_style[2]}); + } + else + { + os << ut::utf32_to_utf8({cur_style[6], cur_style[6]}); // 2个— + } + } + else if (r == height - 1) // 最后一行 + { + if (c == 0) // 第一列 + { + os << ut::utf32_to_utf8({cur_style[0], cur_style[3]}); + } + else if (c == width - 1) // 最后一列 + { + os << ut::utf32_to_utf8({cur_style[4]}); + } + else + { + os << ut::utf32_to_utf8({cur_style[6], cur_style[6]}); // 2个— + } + } + else + { + if (c == 0) // 第一列 + { + os << ut::utf32_to_utf8({cur_style[0], cur_style[5]}); + } + else if (c == width - 1) // 最后一列 + { + os << ut::utf32_to_utf8({cur_style[5]}); + } + else + { + os << " "; + } + } + } + } + + // title + tc::move_to(top, ut::b2c(left) + (width * 2 - title.length()) / 2, os); + os << title; + } + + void frame(Matrix &frame, int top, int left) + { + static Matrix buffer(frame.size(), std::vector(frame[0].size(), -1)); + static Matrix buffer_top2(2, std::vector(frame[0].size(), -1)); + + if (gm::reseting) + { + buffer = Matrix(frame.size(), std::vector(frame[0].size(), -1)); + buffer_top2 = Matrix(2, std::vector(frame[0].size(), -1)); + } + + Matrix f(frame.begin(), frame.begin() + 20); + matrix(f, top + 2, left, &buffer, 1); + + Matrix v(frame.begin() + 20, frame.end()); + matrix(v, top, left, &buffer_top2, 2); + } + + void next(std::queue next5, int top, int left) + { + static Matrix buffer(15, std::vector(6, -1)); + if (gm::reseting) + { + buffer = Matrix(15, std::vector(6, -1)); + } + Matrix next_field(15, std::vector(6, 0)); + for (int y = 12; next5.size() > 0; y -= 3) + { + gm::Piece p(next5.front(), 2, y, 0); + gm::merge(next_field, p); + next5.pop(); + } + + matrix(next_field, top, left, &buffer); + } + + void hold(Tetromino &h, int top, int left) + { + static Matrix buffer(4, std::vector(7, -1)); + if (gm::reseting) + { + buffer = Matrix(4, std::vector(7, -1)); + } + Matrix hold_field(4, std::vector(7, 0)); + if (!h.empty()) + { + gm::Piece p(h, 3, 1, 0); + if (gm::holding) + { + p.set_disable(); + } + gm::merge(hold_field, p); + matrix(hold_field, top, left, &buffer); + } + } + + void matrix(Matrix &m, int top, int left, Matrix *buffer, int style) + { + std::string blank = " "; + if (style == 1) + blank = "\u30fb"; + std::ostringstream oss; + // frame xy ----> row/col + int row, col; + for (int y = 0; y < m.size(); ++y) + { + for (int x = 0; x < m[0].size(); ++x) + { + if (buffer != nullptr) + { + if ((*buffer)[y][x] == m[y][x]) + continue; + (*buffer)[y][x] = m[y][x]; + } + + row = top + m.size() - y - 1; + col = left + x; + tc::move_to(row, ut::b2c(col), oss); + if (m[y][x] > 0) // 正常块 + { + tc::reset_color(oss); + tc::set_back_color(m[y][x], oss); + oss << " "; + } + else if (m[y][x] < 0) // 阴影块 + { + tc::reset_color(oss); + tc::set_fore_color(0 - m[y][x], oss); + oss << "\u25e3\u25e5"; + } + else // 空白区 + { + tc::reset_color(oss); + if (style == 2 && y == 0) + tc::set_underline(oss); + oss << blank; // "\u30FB"; + } + } + } + std::cout << oss.str(); + } + +} // namespace dw \ No newline at end of file diff --git a/games/tetriz/draw.h b/games/tetriz/draw.h new file mode 100644 index 00000000..12e68262 --- /dev/null +++ b/games/tetriz/draw.h @@ -0,0 +1,21 @@ +#pragma once +#include "define.h" +#include "tetromino.h" + +namespace dw +{ + void window(int top, int left, int width, int height, std::string title="",int style=0,int color=(int)Color::White,std::ostream& os=std::cout); + void frame(Matrix& frame,int top,int left); + void next(std::queue next5,int top,int left); + void hold(Tetromino &h, int top, int left); + //----------------------------------------------------------- + /** + * style: 风格标签: + * 0. 默认风格,无风格 + * 1. 白点打底 + * 2. 下划线 + * + */ + void matrix(Matrix& m,int top,int left,Matrix* buffer=nullptr,int style=0); + +} // namespace dw diff --git a/games/tetriz/game.cpp b/games/tetriz/game.cpp new file mode 100644 index 00000000..a8f4e382 --- /dev/null +++ b/games/tetriz/game.cpp @@ -0,0 +1,290 @@ +#include "game.h" +#include "tetromino.h" +#include "utils.h" +#include "control.h" +namespace gm +{ + //---------------变量定义区--------------- + bool locking; + bool running; + bool holding; + bool ending; + bool reseting; + bool helping; + bool pausing; + Piece one_piece; + Matrix playfield; + std::chrono::microseconds duration; + Matrix frame; + std::queue next; + std::vector bag; + Tetromino hold_piece; + int score, level, lines; + std::chrono::microseconds time; + //----------------------------------- + void init() + { + srand(std::time(0)); + locking = false; + running = true; + holding = false; + ending = false; + reseting = false; + helping = false; + pausing = false; + score = lines = 0; + levelup(); + playfield = Matrix(22, std::vector(10, 0)); + load(); + bag.clear(); + preview(); + one_piece = pick(); + frame = playfield; + hold_piece.clear(); + time = 0ms; + } + + void process() + { + if (ending || pausing) + return; + + render(); + if (ut::timer(duration)) + { + // 如果无法继续下落,就锁定在游戏区 + if (one_piece.down()) + return; + + if (locking) + { + // 锁定 + lock(); + // 消行 + clear(); + levelup(); + one_piece = pick(); + locking = false; + holding = false; + reseting = false; + } + else + { + locking = true; + } + } + } + + void render() + { + frame = playfield; + // 正常块 + merge(frame, one_piece); + // 阴影块 + Piece ghost = one_piece; + ghost.set_ghost(); + while (ghost.down()) + ; + + merge(frame, ghost); + } + Piece pick() + { + assert(next.size() > 0); + Piece p(next.front(), 4, 20, 0); + next.pop(); + + if (!p.test(4, 20)) + { + // game over! + ending = true; + } + + preview(); + + return std::move(p); + } + void lock() + { + merge(playfield, one_piece); + } + void clear() + { + int count = 0; + for (auto it = playfield.begin(); it != playfield.end();) + { + bool full = true; + for (auto cell : *it) + { + if (cell == 0) + { + full = false; + break; + } + } + if (full) + { + // 消行 [1,2,3,4] -->[1,3,4] + it = playfield.erase(it); + playfield.push_back(std::vector(it->size(), 0)); + count++; + } + else + ++it; + } + /** + Single 100 x level 100 x level + Double 300 x level 300 x level + Triple 500 x level 500 x level + Tetris 800 x level 800 x level + Soft drop 1 point per cell 1 point per cell + Hard drop 2 points per cell 2 point per cell + */ + if (count == 1) + score += 100 * level; + if (count == 2) + score += 300 * level; + if (count == 3) + score += 500 * level; + if (count == 4) + score += 800 * level; + lines += count; + } + void quit() + { + running = false; + } + void rotate(int i) + { + if (pausing) + return; + one_piece.rotate(i); + } + + void left() + { + if (pausing) + return; + one_piece.left(); + } + + void right() + { + if (pausing) + return; + one_piece.right(); + } + + void down() + { + if (pausing) + return; + if (one_piece.down()) + score += 1; + } + + void drop() + { + if (pausing) + return; + while (one_piece.down()) + score += 2; + locking = true; + // 直落后马上生效 + duration = 0s; + } + + void preview() + { + int index; + while (next.size() < 5) + { + if (bag.size() == 0) + bag = {I, J, L, O, S, T, Z}; + index = rand() % bag.size(); + next.push(bag[index]); + bag.erase(bag.begin() + index); + } + } + + void load() + { + std::ifstream fs("tetriz.map"); + assert(fs.is_open()); + std::string line; + // 22*10 + for (auto &row : playfield | std::ranges::views::take(20) | std::ranges::views::reverse) + { + getline(fs, line); + for (auto i : iota(0, 10)) + { + if (line[i] == '1') + { + row[i] = (int)Color::Gray; + } + } + } + fs.close(); + } + + void hold() + { + if (pausing) + return; + if (holding) + return; + + if (hold_piece.empty()) + { + hold_piece = one_piece.get_tetromino(); + one_piece = pick(); + } + else + { + auto tmp = hold_piece; + hold_piece = one_piece.get_tetromino(); + one_piece = Piece(tmp, 4, 20, 0); + } + + holding = true; + } + + void levelup() + { + // 每消除10行 升1级 + level = lines / 10 + 1; + // Time = (0.8-((Level-1)*0.007))^(Level-1) + duration = std::chrono::milliseconds(int(pow((0.8 - ((level - 1) * 0.007)), level - 1) * 1000)); + } + + void reset() + { + init(); + reseting = true; + } + + void help() + { + helping = !helping; + reseting = !helping; + pausing = helping; + } + + void pause() + { + pausing = !pausing; + reseting = !pausing; + } + + void merge(Matrix &m, const Piece &p) + { + auto [x, y] = p.get_xy(); + for (auto i : iota(0, 4)) + { + auto [dx, dy] = p.get_mino(i); + if (m[y + dy][x + dx] == 0) + m[y + dy][x + dx] = p.get_color(); + } + } + +} // namespace gm \ No newline at end of file diff --git a/games/tetriz/game.h b/games/tetriz/game.h new file mode 100644 index 00000000..e6887743 --- /dev/null +++ b/games/tetriz/game.h @@ -0,0 +1,84 @@ +#pragma once +#include "tetromino.h" +#include "piece.h" +namespace gm +{ + + //======================================= + // 游戏变量定义 + //======================================= + // 游戏运行状态 + extern bool running; + // 锁定标志 + extern bool locking; + // 暂存标志 + extern bool holding; + // 重置标志 + extern bool reseting; + // 终结标志 + extern bool ending; + // 帮助标志 + extern bool helping; + // 暂停标志 + extern bool pausing; + // 当前掉落的块 + extern Piece one_piece; + // 游戏场地 + extern Matrix playfield; + // 每帧时间间隔 + extern std::chrono::microseconds duration; + // 当前渲染帧 + extern Matrix frame; + // 5格预览队列 + extern std::queue next; + // 方块口袋 + extern std::vector bag; + // 暂存块 + extern Tetromino hold_piece; + // 计分、等级、消行 + extern int score, level, lines; + // 总耗时 + extern std::chrono::microseconds time; + //======================================= + // 游戏逻辑 + //======================================= + // 游戏主逻辑 + void process(); + // 游戏初始化 + void init(); + // 渲染当前帧 + void render(); + // 获取一个块 + Piece pick(); + // 锁定 + void lock(); + // 消行 + void clear(); + // 退出 + void quit(); + void rotate(int i); + void left(); + void right(); + void down(); + // 直落 + void drop(); + // 生成预览队列 + void preview(); + // 载入预设地图 + void load(); + // 暂存 + void hold(); + // 升级 + void levelup(); + // 重置游戏 + void reset(); + // 帮助 + void help(); + // 暂停 + void pause(); + // 回显命令 + std::string echo(); + //----------------------- + void merge(Matrix &m, const Piece &p); + +} // namespace gm diff --git a/games/tetriz/main.cpp b/games/tetriz/main.cpp new file mode 100644 index 00000000..4871f5d2 --- /dev/null +++ b/games/tetriz/main.cpp @@ -0,0 +1,44 @@ +#include "define.h" +#include "terminal.h" +#include "utils.h" +#include "draw.h" +#include "control.h" +#include "game.h" +#include "window.h" + +void init() +{ + + ui::window_init(); + ui::show_windows(); + ui::show_help(); + gm::init(); + gm::start_listener(); +} + +void loop() +{ + while (gm::running) + { + gm::process(); + ui::show_info(); + ui::show_game(); + ui::window_resize(); + std::this_thread::sleep_for(10ms); + } +} + +void exit() +{ + ui::show_exit(); + ui::window_exit(); +} + +int main() +{ + init(); + loop(); + exit(); + + return 0; +} \ No newline at end of file diff --git a/games/tetriz/piece.cpp b/games/tetriz/piece.cpp new file mode 100644 index 00000000..0ab2b2ef --- /dev/null +++ b/games/tetriz/piece.cpp @@ -0,0 +1,119 @@ +#include "piece.h" +#include "game.h" +namespace gm +{ + Piece::Piece(Tetromino &t, int x0, int y0, int i) + : tetro_set(t), + x(x0), y(y0), + index(i), + sp_playfield(std::make_shared(playfield)), + status(1) + { + if (get_type() == 'I') + { + offset = gm::offset_i; + } + else if (get_type() == 'O') + { + offset = gm::offset_o; + } + else + { + offset = gm::offset; + } + } + bool Piece::down() + { + return move(0, -1); + } + bool Piece::left() + { + return move(-1, 0); + } + bool Piece::right() + { + return move(1, 0); + } + bool Piece::rotate(int i) + { + assert(i >= 1 && i <= 3); + int new_index = (index + i) % 4; + for (auto i : iota(0, (int)offset[0].size())) + { + auto [dx_0, dy_0] = offset[index][i]; + auto [dx_1, dy_1] = offset[new_index][i]; + + auto dx = dx_0 - dx_1; + auto dy = dy_0 - dy_1; + Piece new_piece(tetro_set, x, y, new_index); + if (new_piece.test(x + dx, y + dy)) + { + index = new_index; + x += dx; + y += dy; + return true; + } + } + + return false; + } + + bool Piece::test(int ox, int oy) const + { + assert(sp_playfield != nullptr); + for (int i = 0; i < 4; ++i) + { + auto [dx, dy] = get_mino(i); + // 1. 越界 + if (ox + dx < 0 || ox + dx > (*sp_playfield)[0].size() - 1 || oy + dy < 0 || oy + dy > (*sp_playfield).size() - 1) + return false; + // 2. 有块 + if ((*sp_playfield)[oy + dy][ox + dx] > 0) + return false; + } + return true; + } + void Piece::set_ghost() + { + status = 0; + } + void Piece::set_disable() + { + status = 2; + } + Tetromino Piece::get_tetromino() const + { + return tetro_set; + } + bool Piece::move(int dx, int dy) + { + if (test(x + dx, y + dy)) + { + x += dx; + y += dy; + return true; + } + return false; + } + char Piece::get_type() const + { + return tetro_set[index][0].first; + } + std::pair Piece::get_mino(int i) const + { + assert(i >= 0 && i <= 3); + + if (i == 0) + return {0, 0}; + return tetro_set[index][i]; + } + std::pair Piece::get_xy() const + { + return {x, y}; + } + int Piece::get_color() const + { + if(status==2) return (int)Color::White; + return status ? tetro_set[index][0].second : 0 - tetro_set[index][0].second; + } +} // namespace gm diff --git a/games/tetriz/piece.h b/games/tetriz/piece.h new file mode 100644 index 00000000..ce9349fd --- /dev/null +++ b/games/tetriz/piece.h @@ -0,0 +1,34 @@ +#pragma once +#include "tetromino.h" +#include "define.h" + +namespace gm +{ + class Piece + { + public: + Piece(Tetromino &t, int x0, int y0, int i); + Piece() = default; + bool down(); + bool left(); + bool right(); + bool rotate(int i);//1:R 2:180 3:L + std::pair get_mino(int i) const; + std::pair get_xy() const; + int get_color() const; + bool test(int x, int y) const; + void set_ghost(); + void set_disable(); + Tetromino get_tetromino() const; + private: + bool move(int dx,int dy); + char get_type() const; + + Tetromino tetro_set; + int index; // [0 R 2 L] + int x, y; // 正交直角坐标系 + std::shared_ptr sp_playfield; + int status; //0:阴影, 1:正常 2:不可用 + Offset offset;//踢墙表 + }; +} // namespace gm diff --git a/games/tetriz/readme.md b/games/tetriz/readme.md new file mode 100644 index 00000000..5a17cc56 --- /dev/null +++ b/games/tetriz/readme.md @@ -0,0 +1,3 @@ +# Tetriz + +a tetris game in terminal. \ No newline at end of file diff --git a/games/tetriz/terminal.cpp b/games/tetriz/terminal.cpp new file mode 100644 index 00000000..c61fef0f --- /dev/null +++ b/games/tetriz/terminal.cpp @@ -0,0 +1,76 @@ +#include "terminal.h" +#include "define.h" + +#define CSI "\033[" + +namespace tc +{ + + int cols, rows; + int top, left; + + void move_to(int row, int col, std::ostream &os) + { + os << CSI << top + row << ';' << left + col << 'H'; + } + + void set_fore_color(int id, std::ostream &os) + { + os << CSI << "38;5;" << id << 'm'; + } + + void set_back_color(int id, std::ostream &os) + { + os << CSI << "48;5;" << id << 'm'; + } + + void clean_screen(std::ostream &os) + { + os << CSI << "2J"; + } + + void reset_color(std::ostream &os) + { + os << CSI << "0m"; + } + + void hide_cursor(std::ostream &os) + { + os << CSI << "?25l"; + } + + void show_cursor(std::ostream &os) + { + os << CSI << "?25h"; + } + + void set_blod(std::ostream &os) + { + os << CSI << "1m"; + } + + void set_underline(std::ostream &os) + { + os << CSI << "4m"; + } + + std::pair get_size() + { + int columns = 0, rows = 0; +#ifdef _WIN32 + CONSOLE_SCREEN_BUFFER_INFO csbi; + + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); + columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; + rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; +#elif __linux__ + struct winsize w; + ioctl(fileno(stdout), TIOCGWINSZ, &w); + columns = (int)(w.ws_col); + rows = (int)(w.ws_row); +#endif + + return {rows, columns}; + } + +} // namespace tc \ No newline at end of file diff --git a/games/tetriz/terminal.h b/games/tetriz/terminal.h new file mode 100644 index 00000000..36374b45 --- /dev/null +++ b/games/tetriz/terminal.h @@ -0,0 +1,23 @@ +#pragma once +#include "define.h" + +namespace tc +{ // terminal control + + //==================================== + // 屏幕长宽rows,cols + extern int cols, rows; + // 起点坐标top,left + extern int top, left; + //==================================== + void move_to(int row, int col, std::ostream &os = std::cout); + void set_fore_color(int id, std::ostream &os = std::cout); + void set_back_color(int id, std::ostream &os = std::cout); + void clean_screen(std::ostream &os = std::cout); + void reset_color(std::ostream &os = std::cout); + void hide_cursor(std::ostream &os = std::cout); + void show_cursor(std::ostream &os = std::cout); + void set_blod(std::ostream &os = std::cout); + void set_underline(std::ostream &os = std::cout); + std::pair get_size(); +} \ No newline at end of file diff --git a/games/tetriz/tetriz.map b/games/tetriz/tetriz.map new file mode 100644 index 00000000..40d0b9ab --- /dev/null +++ b/games/tetriz/tetriz.map @@ -0,0 +1,20 @@ +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 +0000000000 \ No newline at end of file diff --git a/games/tetriz/tetromino.cpp b/games/tetriz/tetromino.cpp new file mode 100644 index 00000000..e2deee21 --- /dev/null +++ b/games/tetriz/tetromino.cpp @@ -0,0 +1,76 @@ +#include "tetromino.h" + +namespace gm +{ + //------------------------------------------------------------------ + Tetromino I{{ + {{{'I', (int)Color::Cyan}, {-1, 0}, {1, 0}, {2, 0}}}, // 0 + {{{'I', (int)Color::Cyan}, {0, 1}, {0, -1}, {0, -2}}}, // R + {{{'I', (int)Color::Cyan}, {-2, 0}, {-1, 0}, {1, 0}}}, // 2 + {{{'I', (int)Color::Cyan}, {0, 2}, {0, 1}, {0, -1}}}, // L + }}; + Tetromino J{{ + {{{'J', (int)Color::Blue}, {-1, 1}, {-1, 0}, {1, 0}}}, // 0 + {{{'J', (int)Color::Blue}, {1, 1}, {0, 1}, {0, -1}}}, // R + {{{'J', (int)Color::Blue}, {-1, 0}, {1, 0}, {1, -1}}}, // 2 + {{{'J', (int)Color::Blue}, {0, 1}, {-1, -1}, {0, -1}}}, // L + }}; + + Tetromino L{{ + {{{'L', (int)Color::Orange}, {-1, 0}, {1, 0}, {1, 1}}}, // 0 + {{{'L', (int)Color::Orange}, {0, 1}, {0, -1}, {1, -1}}}, // R + {{{'L', (int)Color::Orange}, {-1, -1}, {-1, 0}, {1, 0}}}, // 2 + {{{'L', (int)Color::Orange}, {-1, 1}, {0, 1}, {0, -1}}}, // L + }}; + + Tetromino O{{ + {{{'O', (int)Color::Yellow}, {0, 1}, {1, 1}, {1, 0}}}, // 0 + {{{'O', (int)Color::Yellow}, {0, -1}, {1, 0}, {1, -1}}}, // R + {{{'O', (int)Color::Yellow}, {-1, -1}, {-1, 0}, {0, -1}}}, // 2 + {{{'O', (int)Color::Yellow}, {-1, 1}, {-1, 0}, {0, 1}}}, // L + }}; + + Tetromino S{{ + {{{'S', (int)Color::Green}, {-1, 0}, {0, 1}, {1, 1}}}, // 0 + {{{'S', (int)Color::Green}, {0, 1}, {1, 0}, {1, -1}}}, // R + {{{'S', (int)Color::Green}, {-1, -1}, {0, -1}, {1, 0}}}, // 2 + {{{'S', (int)Color::Green}, {-1, 1}, {-1, 0}, {0, -1}}}, // L + }}; + + Tetromino T{{ + {{{'T', (int)Color::Purple}, {-1, 0}, {0, 1}, {1, 0}}}, // 0 + {{{'T', (int)Color::Purple}, {0, 1}, {1, 0}, {0, -1}}}, // R + {{{'T', (int)Color::Purple}, {-1, 0}, {1, 0}, {0, -1}}}, // 2 + {{{'T', (int)Color::Purple}, {-1, 0}, {0, 1}, {0, -1}}}, // L + }}; + + Tetromino Z{{ + {{{'Z', (int)Color::Red}, {-1, 1}, {0, 1}, {1, 0}}}, // 0 + {{{'Z', (int)Color::Red}, {1, 1}, {1, 0}, {0, -1}}}, // R + {{{'Z', (int)Color::Red}, {-1, 0}, {0, -1}, {1, -1}}}, // 2 + {{{'Z', (int)Color::Red}, {-1, -1}, {-1, 0}, {0, 1}}}, // L + }}; + + + Offset offset{{ + {{{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}}, // 0 + {{{0, 0}, {+1, 0}, {+1, -1}, {0, +2}, {+1, +2}}}, // R + {{{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}}, // 2 + {{{0, 0}, {-1, 0}, {-1, -1}, {0, +2}, {-1, +2}}}, // L + }}; + + Offset offset_i{{ + {{{0, 0}, {-1, 0}, {+2, 0}, {-1, 0}, {+2, 0}}}, // 0 + {{{-1, 0}, {0, 0}, {0, 0}, {0, +1}, {0, -2}}}, // R + {{{-1, +1}, {+1, +1}, {-2, +1}, {+1, 0}, {-2, 0}}}, // 2 + {{{0, +1}, {0, +1}, {0, +1}, {0, -1}, {0, +2}}}, // L + }}; + + Offset offset_o{{ + {{{0, 0}}}, // 0 + {{{0, -1}}}, // R + {{{-1, -1}}}, // 2 + {{{-1, 0}}}, // L + }}; + +} // namespace gm diff --git a/games/tetriz/tetromino.h b/games/tetriz/tetromino.h new file mode 100644 index 00000000..fae62e98 --- /dev/null +++ b/games/tetriz/tetromino.h @@ -0,0 +1,9 @@ +#pragma once +#include "define.h" +#include "color.h" +namespace gm +{ + extern Tetromino I, J, L, O, S, T, Z; + extern Offset offset,offset_i,offset_o; + +} // namespace gm diff --git a/games/tetriz/utils.cpp b/games/tetriz/utils.cpp new file mode 100644 index 00000000..ea688948 --- /dev/null +++ b/games/tetriz/utils.cpp @@ -0,0 +1,42 @@ +#include "utils.h" +#include "define.h" + +namespace ut +{ + int fps() + { + static auto start = std::chrono::steady_clock::now(); + static int frame_count = 0; + static int fps = 0; + + auto end = std::chrono::steady_clock::now(); + frame_count++; + if (end - start > 1s) + { + fps = frame_count; + + frame_count = 0; + start = end; + } + return fps; + } + + std::string utf32_to_utf8(std::u32string str) + { + static std::wstring_convert, char32_t> convert; + return convert.to_bytes(str); + } + + bool timer(std::chrono::microseconds sec) + { + static auto start = std::chrono::steady_clock::now(); + auto end = std::chrono::steady_clock::now(); + if (end - start > sec) + { + start = end; + return true; + } + return false; + } + +} // namespace ut \ No newline at end of file diff --git a/games/tetriz/utils.h b/games/tetriz/utils.h new file mode 100644 index 00000000..00c0635f --- /dev/null +++ b/games/tetriz/utils.h @@ -0,0 +1,14 @@ +#pragma once +#include "define.h" +namespace ut{ + + int fps(); + std::string utf32_to_utf8(std::u32string str); + + inline int b2c(int b) + { + return 2 * b - 1; + } + + bool timer(std::chrono::microseconds sec); +} \ No newline at end of file diff --git a/games/tetriz/window.cpp b/games/tetriz/window.cpp new file mode 100644 index 00000000..d3346d7e --- /dev/null +++ b/games/tetriz/window.cpp @@ -0,0 +1,152 @@ +#include "define.h" +#include "window.h" +#include "draw.h" +#include "game.h" +#include "terminal.h" +#include "utils.h" +#include "control.h" + +namespace ui +{ + + void window_init() + { +#ifdef _WIN32 + system("chcp 65001"); +#endif + + tc::hide_cursor(); + tc::clean_screen(); + + auto [r, c] = tc::get_size(); + tc::cols = c; + tc::rows = r; + tc::top = (tc::rows - 24) / 2; + tc::left = (tc::cols - 29 * 2) / 2; + } + + void window_exit() + { + tc::show_cursor(); + tc::reset_color(); + } + + void show_windows() + { + dw::window(1, 1, 9, 6, "Hold"); + dw::window(1, 10, 12, 24, "Tetriz"); + dw::window(7, 1, 9, 16, "Status"); + dw::window(19, 22, 8, 4, "Info"); + dw::window(1, 22, 8, 18, "Next"); + } + void show_info() + { + std::ostringstream oss; + tc::reset_color(oss); + + tc::move_to(10, 4, oss); + oss << "Level:" < Date: Tue, 23 Sep 2025 22:44:54 +1000 Subject: [PATCH 2/2] WEI ZHANG - Tetriz --- games/tetriz/.gitignore | 7 +- games/tetriz/CMakeLists.txt | 25 ++--- games/tetriz/Tetriz.png | Bin 0 -> 124836 bytes games/tetriz/config.txt | 50 ++++++++++ games/tetriz/control.cpp | 18 +--- games/tetriz/define.h | 9 +- games/tetriz/readme.md | 190 +++++++++++++++++++++++++++++++++++- games/tetriz/window.cpp | 26 +++-- 8 files changed, 269 insertions(+), 56 deletions(-) create mode 100644 games/tetriz/Tetriz.png create mode 100644 games/tetriz/config.txt diff --git a/games/tetriz/.gitignore b/games/tetriz/.gitignore index 17b3a8c7..378eac25 100644 --- a/games/tetriz/.gitignore +++ b/games/tetriz/.gitignore @@ -1,6 +1 @@ -build/ -*.obj -*.pdb -*.exe -*.o -*.log +build diff --git a/games/tetriz/CMakeLists.txt b/games/tetriz/CMakeLists.txt index 8b1761de..bca1eae5 100644 --- a/games/tetriz/CMakeLists.txt +++ b/games/tetriz/CMakeLists.txt @@ -1,21 +1,14 @@ -cmake_minimum_required(VERSION 3.16) -project(tetriz CXX) +cmake_minimum_required(VERSION 3.22) +project(tetriz) set(CMAKE_CXX_STANDARD 20) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -file(GLOB TETRIZ_SRC - "${CMAKE_CURRENT_LIST_DIR}/*.cpp" - "${CMAKE_CURRENT_LIST_DIR}/*.cxx" -) +configure_file( ${PROJECT_SOURCE_DIR}/tetriz.map ${PROJECT_BINARY_DIR}) -if(NOT TETRIZ_SRC) - message(FATAL_ERROR "No source files found in games/tetriz") -endif() - -add_executable(tetriz ${TETRIZ_SRC}) +aux_source_directory(. src) +add_executable(tetriz ${src}) -# find_package(Curses REQUIRED) # Uncomment if ncurses is used -# target_link_libraries(tetriz PRIVATE ${CURSES_LIBRARIES}) - -install(TARGETS tetriz RUNTIME DESTINATION games/bin) +if(MSVC) + target_compile_options(tetriz PRIVATE "/utf-8") + set_property(TARGET tetriz PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +endif() diff --git a/games/tetriz/Tetriz.png b/games/tetriz/Tetriz.png new file mode 100644 index 0000000000000000000000000000000000000000..f6dadf31a081ad59754156039e9cfe574e034d43 GIT binary patch literal 124836 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 literal 0 HcmV?d00001 diff --git a/games/tetriz/config.txt b/games/tetriz/config.txt new file mode 100644 index 00000000..1bd69496 --- /dev/null +++ b/games/tetriz/config.txt @@ -0,0 +1,50 @@ +#-- ARCADE MACHINE GAME CONFIG FILE --# +#-- For THOTH TECH - Splashkit Crew - Applications Team +#-------------------------------------------------------------------- +#-- File: config.txt +#-- Description: Configuration data for Arcade Machine games +#-------------------------------------------------------------------- +#-- Maintenance Log -- +#-------------------------------------------------------------------- +# Task | Who | Date | Comments +#-----------+---------+----------+----------------------------------- +# Sprint 1 | AGEORGE | 20220326 | Created +#-----------+---------+----------+----------------------------------- +# Sprint 2 | AGEORGE | 20220511 | Added Description +#-----------+---------+----------+----------------------------------- +# Sprint 3 | AGEORGE | 20220828 | Added win, linux and macos params +#-----------+---------+----------+----------------------------------- + +#-------------------------------------------------------------------- +# PLEASE ONLY EDIT CONTENT AFTER THE "=" SIGN FOR EACH CONFIGURATION SETTING +#-------------------------------------------------------------------- + +# The title of your game (eg. Super Mario) +title=Tetriz + +# The name of the author (eg. Jane Doe) +author=WEI ZHANG + +# The genre of your game (eg. Platformer) +genre=Puzzle + +# A Description of your game +description=A modern terminal-based Tetris game built with C++20. Features classic Tetris gameplay with hold system, next piece preview, pause/resume functionality, and responsive arcade-style controls. Cross-platform support for Linux and Windows. + +# A classification rating to advise the nature of the content (eg. MA 15+) +rating=E + +# Programming language the game is written in (eg. C++) +language=C++ + +# Path to your game thumbnail image (eg. images/icon.png) +image=Tetriz.png + +# Location of git repo (eg. https://github.com/thoth-tech/arcade-games) +repository=https://github.com/ZGT23/arcade-games + +# [Optional] Uncomment to include path to the game executable (game.exe) + + +# [Optional] Uncomment to include specific compile commands - if you have a specific compile command (eg. 'make', 'skm g++ *.cpp -lstd++') +#compile-command=skm g++ *.cpp \ No newline at end of file diff --git a/games/tetriz/control.cpp b/games/tetriz/control.cpp index 012d0a36..79d1ee3e 100644 --- a/games/tetriz/control.cpp +++ b/games/tetriz/control.cpp @@ -1,4 +1,3 @@ - #include "control.h" #include "define.h" #include "game.h" @@ -7,24 +6,17 @@ namespace gm char command; std::map> comm_func{ - {KEY_Q, command_quit}, {KEY_ESCAPE, command_quit}, - {KEY_W, command_rotate_R}, - {KEY_UP, command_rotate_R}, - {KEY_Z, command_rotate_L}, - {KEY_X, command_rotate_2}, + {KEY_W, command_pause}, {KEY_S, command_down}, - {KEY_DOWN, command_down}, {KEY_A, command_left}, - {KEY_LEFT, command_left}, {KEY_D, command_right}, - {KEY_RIGHT, command_right}, - {KEY_C, command_hold}, {KEY_R, command_reset}, + {KEY_F, command_drop}, + {KEY_T, command_rotate_L}, + {KEY_G, command_rotate_2}, + {KEY_Y, command_hold}, {KEY_H, command_help}, - {KEY_SPACE, command_drop}, - {KEY_P, command_pause}, - }; #ifdef __linux__ char getch() diff --git a/games/tetriz/define.h b/games/tetriz/define.h index 0d8661c3..dc08914d 100644 --- a/games/tetriz/define.h +++ b/games/tetriz/define.h @@ -29,17 +29,16 @@ using namespace std::chrono_literals; -#define KEY_Q 'q' #define KEY_W 'w' #define KEY_S 's' #define KEY_A 'a' #define KEY_D 'd' -#define KEY_Z 'z' -#define KEY_X 'x' -#define KEY_C 'c' #define KEY_R 'r' +#define KEY_F 'f' +#define KEY_T 't' +#define KEY_G 'g' +#define KEY_Y 'y' #define KEY_H 'h' -#define KEY_P 'p' #ifdef __linux__ diff --git a/games/tetriz/readme.md b/games/tetriz/readme.md index 5a17cc56..64318423 100644 --- a/games/tetriz/readme.md +++ b/games/tetriz/readme.md @@ -1,3 +1,189 @@ -# Tetriz +# Tetriz -a tetris game in terminal. \ No newline at end of file +A modern terminal-based Tetris game written in C++20 with cross-platform support. + +## 🎮 Features + +- **Classic Tetris Gameplay**: Complete with all standard Tetris mechanics +- **Cross-Platform**: Runs on both Linux and Windows +- **Terminal UI**: Beautiful terminal-based interface with colors and animations +- **Modern C++**: Built with C++20 features and best practices +- **Real-time Controls**: Responsive keyboard controls +- **Game Statistics**: Score, level, and line tracking +- **Hold System**: Store pieces for later use +- **Next Piece Preview**: See upcoming pieces +- **Pause/Resume**: Full game state management +- **Help System**: Built-in controls reference + +## 🎯 Game Controls + +| Action | Key(s) | +|--------|--------| +| Pause/Resume | `W` | +| Rotate Left | `T` | +| Rotate 180° | `G` | +| Move Left | `A` | +| Move Right | `D` | +| Soft Drop | `S` | +| Hard Drop | `F` | +| Hold Piece | `Y` | +| Reset Game | `R` | +| Help | `H` | +| Quit | `ESC` | + +## 🚀 Quick Start + +### Prerequisites + +- C++20 compatible compiler (GCC 10+, Clang 12+, or MSVC 2019+) +- CMake 3.22 or later + +### Linux + +```bash +# Install dependencies (Ubuntu/Debian) +sudo apt install cmake g++ + +# Clone and build +git clone +cd tetriz +mkdir build && cd build +cmake .. +make + +# Run the game +./tetriz +``` + +### Windows + +```bash +# Using Visual Studio Developer Command Prompt +git clone +cd tetriz +mkdir build && cd build +cmake .. +cmake --build . --config Release + +# Run the game +.\Release\tetriz.exe +``` + +## 🏗️ Building from Source + +1. **Clone the repository**: + ```bash + git clone + cd tetriz + ``` + +2. **Create build directory**: + ```bash + mkdir build + cd build + ``` + +3. **Configure with CMake**: + ```bash + cmake .. + ``` + +4. **Build the project**: + ```bash + # Linux/macOS + make + + # Windows (Visual Studio) + cmake --build . --config Release + ``` + +5. **Run the executable**: + ```bash + # Linux/macOS + ./tetriz + + # Windows + .\Release\tetriz.exe + ``` + +## 📁 Project Structure + +``` +tetriz/ +├── CMakeLists.txt # Build configuration +├── main.cpp # Entry point +├── game.h/cpp # Core game logic +├── piece.h/cpp # Piece management +├── tetromino.h/cpp # Tetromino definitions +├── control.h/cpp # Input handling +├── terminal.h/cpp # Terminal control +├── window.h/cpp # UI rendering +├── draw.h/cpp # Drawing utilities +├── utils.h/cpp # Utility functions +├── color.h # Color definitions +├── define.h # Global definitions +└── tetriz.map # Game map data +``` + +## 🎨 Game Features + +- **7 Standard Tetrominoes**: I, O, T, S, Z, J, L pieces +- **Line Clearing**: Complete lines disappear and award points +- **Level Progression**: Game speed increases with level +- **Scoring System**: Points for line clears and drops +- **Hold Mechanism**: Store one piece for later use +- **Next Queue**: Preview upcoming pieces +- **Game States**: Pause, help, and game over screens +- **Responsive UI**: Adapts to terminal size changes + +## 🔧 Technical Details + +- **Language**: C++20 +- **Build System**: CMake +- **Dependencies**: Standard library only +- **Platform Support**: Linux, Windows +- **Terminal Support**: ANSI escape sequences +- **Threading**: C++20 std::jthread for input handling + +## 📋 Requirements + +### Minimum System Requirements +- **OS**: Linux (any modern distribution) or Windows 10+ +- **RAM**: 64 MB +- **Storage**: 1 MB +- **Terminal**: ANSI-compatible terminal emulator + +### Development Requirements +- **Compiler**: C++20 compatible (GCC 10+, Clang 12+, MSVC 2019+) +- **CMake**: 3.22 or later +- **Build Tools**: Make or Visual Studio Build Tools + +## 🎯 Game Rules + +- **Objective**: Clear horizontal lines by filling them with tetromino pieces +- **Scoring**: + - Single line: 100 × level + - Double lines: 300 × level + - Triple lines: 500 × level + - Tetris (4 lines): 800 × level +- **Level Up**: Every 10 lines cleared increases the level +- **Game Over**: When pieces reach the top of the playfield + +## 🐛 Troubleshooting + +### Common Issues + +1. **Terminal not responding**: Ensure your terminal supports ANSI escape sequences +2. **Build errors**: Check that you have C++20 compatible compiler +3. **Input not working**: Make sure terminal is in focus and supports raw input + +### Getting Help + +If you encounter issues: +1. Check the terminal compatibility +2. Verify build requirements +3. Open an issue with system details + +--- + +**Enjoy playing Tetriz!** 🎮 \ No newline at end of file diff --git a/games/tetriz/window.cpp b/games/tetriz/window.cpp index d3346d7e..5b5af98a 100644 --- a/games/tetriz/window.cpp +++ b/games/tetriz/window.cpp @@ -79,29 +79,27 @@ namespace ui tc::move_to(6, ut::b2c(12), oss); oss << " "; tc::move_to(7, ut::b2c(12), oss); - oss << " Rotate-R [r,↑] "; + oss << " Pause [w] "; tc::move_to(8, ut::b2c(12), oss); - oss << " Rotate-L [z] "; + oss << " Rotate-L [t] "; tc::move_to(9, ut::b2c(12), oss); - oss << " Rotate-2 [x] "; + oss << " Rotate-2 [g] "; tc::move_to(10, ut::b2c(12), oss); - oss << " Left [a,←] "; + oss << " Left [a] "; tc::move_to(11, ut::b2c(12), oss); - oss << " Right [d,→] "; + oss << " Right [d] "; tc::move_to(12, ut::b2c(12), oss); - oss << " Down [s,↓] "; + oss << " Down [s] "; tc::move_to(13, ut::b2c(12), oss); - oss << " Drop [SPACE] "; + oss << " Drop [f] "; tc::move_to(14, ut::b2c(12), oss); - oss << " Hold [c] "; + oss << " Hold [y] "; tc::move_to(15, ut::b2c(12), oss); - oss << " Reset [r] "; + oss << " Reset [r] "; tc::move_to(16, ut::b2c(12), oss); - oss << " Pause [p] "; + oss << " Help [h] "; tc::move_to(17, ut::b2c(12), oss); - oss << " Quit [q,ESC] "; - tc::move_to(15, ut::b2c(12), oss); - oss << " Help [h] "; + oss << " Quit [ESC] "; } std::cout << oss.str(); } @@ -149,4 +147,4 @@ namespace ui ui::show_help(); gm::reseting = true; } -} // namespace ui +} // namespace ui \ No newline at end of file