Skip to content

Commit a9051f9

Browse files
committed
更新tetris.cpp
1 parent 0d193fb commit a9051f9

File tree

1 file changed

+69
-8
lines changed

1 file changed

+69
-8
lines changed

tetris.cpp

Lines changed: 69 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,33 @@
66
///=============================================================================
77
/// C++基础知识:
88
/// 1. 预处理(注释、头文件引入、定义宏)
9-
/// 2. 基本数据类型
9+
/// 2. 数据类型
10+
/// 1. 基本数据类型与数组
11+
/// 2. 指针(特殊的基本数据类型)
12+
/// 3. 引用(特殊的语法糖与语法含义)
1013
/// 3. 定义类型
1114
/// 1. 成员变量
1215
/// 4. 定义变量
1316
/// 1. 定义基本数据类型变量
1417
/// 2. 定义结构体类型变量
1518
/// 2. 定义数组变量
1619
/// 5. 定义函数
17-
/// 6. 访问变量
18-
/// 7. 调用函数
19-
/// 8. (自定义)类型的内存结构
20-
/// 9. 函数的调用过程
20+
/// 6. 表达式
21+
/// 1. 访问变量
22+
/// 2. 调用函数
23+
/// 7. 逻辑语句
24+
/// 1. 条件语句 if switch(case default break)
25+
/// 2. 循环语句 for while do..while -- continue break
26+
/// 3. 跳转语句 goto
27+
/// 8. 入口函数
28+
/// 9. (自定义)类型的内存结构
29+
/// 10. 函数的调用过程
2130
///=============================================================================
2231
/// 理解或思想:
2332
/// 👉 预处理:💡简单的文本替换,提高代码复用
24-
/// 👉 数据类型的作用:💡赋予内存格子含义,或者说💡标注内存的处理方式
33+
/// 👉 数据类型的作用:💡赋予格子(内存)含义,或者说💡标注内存的处理方式
34+
/// 👉 指针:💡整数,💡代表格子的地址(编号)
35+
/// 👉 引用:💡从底层角度看:引用是指针的语法糖,💡从语义角度看:引用是变量别名
2536
/// 👉 定义(自定义)类型:
2637
/// 💡确定该类型变量占用的格子数(通过成员变量自动计算大小)
2738
/// 💡以及每个格子的含义(通过成员变量自动确定每个格子的含义)
@@ -30,19 +41,22 @@
3041
/// 👉 定义函数:💡描述一个过程:输入->处理->输出,即参数->函数体->返回值
3142
/// 👉 访问变量:💡找到对应格子,按类型含义访问和处理格子内的数据
3243
/// 👉 调用函数:💡很好理解
44+
/// 👉 逻辑语句:💡比较+跳转
3345
/// 👉 (自定义)类型的内存结构:
3446
/// 💡从避免CPU多次存取内存的角度出发,自动空出格子以提高内存访问效率
3547
/// 👉 函数的调用过程:
3648
/// 💡递归!
3749
/// 💡栈!
38-
/// 💡输入(参数)输出(返回值)通过函数调用栈传递
50+
/// 💡输入(参数)输出(返回值)通过在函数调用栈上创建变量传递
51+
/// 💡参数和返回值必须通过复制值的方式传递,指针和引用的特殊之处在于复制(传递)的是地址
3952
///=============================================================================
4053
/// 思想!:
4154
/// 👉 程序的基本作用:💡内存读写与指令执行
4255
/// 👉 面向对象-理解方式1:💡数据+算法(过程)
4356
/// 👉 面向对象-理解方式2:💡变量+函数
4457
///=============================================================================
4558

59+
// 🏷 头文件引入
4660
// 引入标准库.算法.函数std::clamp
4761
#include <algorithm>
4862
// 引入标准库.函数setlocale
@@ -59,40 +73,52 @@
5973
// * ...
6074
#include <ncurses.h>
6175

76+
// 🏷 定义(全局)变量
6277
WINDOW *game_window;
6378
WINDOW *info_window;
6479

80+
// 🏷 定义函数
6581
void CreateWindow() {
6682
game_window = newwin(20, 10, 0, 0);
6783
info_window = newwin(20, 70, 0, 10);
6884
}
6985

86+
// 🏷 定义函数
7087
void DestroyWindow() { endwin(); }
7188

89+
// 🏷 定义(自定义)类型
7290
// 定义格子类型
7391
struct Cell {
7492
bool has_tetro{};
7593
};
7694

95+
// 🏷 定义(自定义)类型
7796
// 定义棋盘类型
7897
struct Board {
7998
Cell cell[20][10]{};
8099
};
81100

82-
// I O T J L S Z
101+
// 🏷 定义(自定义)类型
102+
// 定义四连骨牌类型
103+
// 四连骨牌有7种形式:I O T J L S Z
83104
struct Mino {
84105
// Mi mi[4];
85106
Cell cell[4][4]{};
86107
};
87108

109+
// 🏷 定义(全局)变量
88110
// 定义棋盘变量
89111
Board board;
90112

113+
// 🏷 定义(全局)变量
91114
// 定义四连骨牌
92115
Mino mino;
116+
// 🏷 定义(全局)变量
117+
// 定义四连骨牌的位置
93118
int x;
94119
int y;
95120

121+
// 🏷 定义函数
96122
// 绘制棋盘
97123
void RenderBoard() {
98124
// 遍历每个格子
@@ -106,6 +132,9 @@ void RenderBoard() {
106132
}
107133
}
108134
}
135+
136+
// 🏷 定义函数
137+
// 清除磁盘
109138
void ClearBoard() {
110139
// 遍历每个格子
111140
for (int row = 0; row < 20; ++row) {
@@ -114,6 +143,8 @@ void ClearBoard() {
114143
}
115144
}
116145
}
146+
147+
// 🏷 定义函数
117148
// 绘制四连骨牌
118149
void RenderMino() {
119150
// 遍历MINO的每个格子
@@ -126,6 +157,8 @@ void RenderMino() {
126157
}
127158
}
128159

160+
// 🏷 定义函数
161+
// 碰撞检测
129162
bool CollisionDetect(Mino &mino, int x, int y) {
130163
// 每个mino的骨牌是否产生碰撞
131164
for (int row = 0; row < 4; ++row) {
@@ -150,6 +183,8 @@ bool CollisionDetect(Mino &mino, int x, int y) {
150183
return false;
151184
}
152185

186+
// 🏷 定义函数
187+
// 创建四连骨牌
153188
bool CreateMino() {
154189
// 随机创建其中一种类型:I O T J L S Z
155190
std::random_device rd;
@@ -233,6 +268,8 @@ bool CreateMino() {
233268
return true;
234269
}
235270

271+
// 🏷 定义函数
272+
// 下落四连骨牌
236273
// 落地之后需要其它逻辑,返回值代表是否下落成功
237274
bool Fall() {
238275
// 判断能不能下落
@@ -244,6 +281,9 @@ bool Fall() {
244281
y = y + 1;
245282
return true;
246283
}
284+
285+
// 🏷 定义函数
286+
// 使四连骨牌落地,即将四连骨牌分解为单个骨牌放置在棋盘上
247287
void Land() {
248288
// 把当前的四连骨牌放在棋盘上
249289
// 绘制在棋盘上
@@ -256,6 +296,8 @@ void Land() {
256296
}
257297
}
258298

299+
// 🏷 定义函数
300+
// 旋转四连骨牌
259301
void Rotate() {
260302
//
261303
// - - - -
@@ -287,12 +329,16 @@ void Rotate() {
287329
}
288330
}
289331

332+
// 🏷 定义函数
333+
// 清除棋盘上的一行
290334
void ClearLine(int y) {
291335
for (int col = 0; col < 10; ++col) {
292336
board.cell[y][col].has_tetro = false;
293337
}
294338
}
295339

340+
// 🏷 定义函数
341+
// 将棋盘上的某一行的上方所有行向下移动一行
296342
void MoveDownAllAboveLine(int y) {
297343
for (int row = y; 0 <= row; --row) {
298344
if (row == 0) {
@@ -305,6 +351,8 @@ void MoveDownAllAboveLine(int y) {
305351
}
306352
}
307353

354+
// 🏷 定义函数
355+
// 判断棋盘上的某一行是否放满骨牌
308356
bool IsLineFull(int y) {
309357
// return std::all_of(&board.cell[y][0], &board.cell[y][10], [](auto
310358
// &cell){return cell.has_tetro;});
@@ -316,6 +364,8 @@ bool IsLineFull(int y) {
316364
return true;
317365
}
318366

367+
// 🏷 定义函数
368+
// 检查棋盘上的某一行是否放满骨牌、清理放满的行、将清理的行的上方所有骨牌向下移动
319369
void CheckAndDeleteLine() {
320370
for (int row = 0; row < 20; ++row) {
321371
if (IsLineFull(row)) {
@@ -325,10 +375,13 @@ void CheckAndDeleteLine() {
325375
}
326376
}
327377

378+
// 🏷 定义宏
328379
#define GAME_OVER 0
329380
#define EXIT 1
330381
#define RESTART 2
331382

383+
// 🏷 定义函数
384+
// 显示欢迎信息
332385
bool Welcome() {
333386
wclear(info_window);
334387
mvwprintw(info_window, 3, 0, "Welcome Tetris!");
@@ -348,6 +401,8 @@ bool Welcome() {
348401
}
349402
}
350403

404+
// 🏷 定义函数
405+
// 显示游戏结束信息
351406
int GameOver() {
352407
wclear(info_window);
353408
mvwprintw(info_window, 5, 0, "Game Over!");
@@ -367,6 +422,8 @@ int GameOver() {
367422
}
368423
}
369424

425+
// 🏷 定义函数
426+
// 显示游戏帮助信息
370427
void HelpInfo() {
371428
wclear(info_window);
372429
mvwprintw(info_window, 3, 0, "Keys:");
@@ -377,6 +434,8 @@ void HelpInfo() {
377434
mvwprintw(info_window, 9, 0, "e exit");
378435
}
379436

437+
// 🏷 定义函数
438+
// 单次游戏循环
380439
int GameLoop() {
381440
HelpInfo();
382441
ClearBoard();
@@ -439,6 +498,8 @@ int GameLoop() {
439498
}
440499
}
441500

501+
// 🏷 定义函数
502+
// 入口函数
442503
int main() {
443504
setlocale(LC_ALL, "");
444505
// 初始化界面系统ncurses

0 commit comments

Comments
 (0)