用俄罗斯方块入门EasyX库

从知乎的童老师那里看到这个库,感觉很好玩的样子,但对于一个入门小白来说,踩了很多的坑,所以我写下这篇文章,希望可以帮到你。

首先你需要完成以下事:
①基础c/c++语法知识
②了解Visual Studio基本使用方法(安装好easyx库,网上有教程,会建项目,会编译程序,把常用的功能都装上)
③会查EasyX官方手册(把官网上简易教程照着写一遍,很关键,知道如何使用库函数)
④一点windows编程知识(不知道也没事,边用边查)

这里的编译环境是win10+vs2015,代码我是根据官网的那个俄罗斯方块改的,他那个写的比较早了,有的我改了改更易读些,如果你觉得代码哪里写的不好,自己动手改一改理解的会更深一些。

先把任务分解一下,一个俄罗斯方块最基本的功能应该有生成方块,旋转方块,移动方块。
再进一步,应该有获取控制命令,检测是否放得下,满一行消除功能。
再进一步,可以有对沉底的方块变色,开始新的游戏。这下就可以算一个俄罗斯方块了。
还可以在加上得分功能,分数高了下落速度加快,消除时加音效等等附加功能,有兴趣的话可以玩一玩。

我把文件及代码附在下面,有问题或者觉得我写的不好的,请多多指教。

https://code.csdn.net/ZHangFFYY/tetris/tree/master
(如果打不开 可以在csdn的项目里搜也能搜到)

好的,下面是一个简单的 C++ 俄罗斯方块游戏,使用 EasyX 图形实现。在代码中,我使用EasyX绘图函数来绘制方块和游戏界面,使用EasyX 的键盘事件处理函数来响应玩家的操作。具体实现细节请看注释。 ```cpp #include <graphics.h> #include <conio.h> #include <time.h> #define ROWS 20 // 游戏界面行数 #define COLS 10 // 游戏界面列数 #define BLOCK_SIZE 20 // 方块大小 int score = 0; // 分数 // 游戏界面 int map[ROWS][COLS] = {0}; // 方块类型 enum BlockType { I_BLOCK, // I型方块 J_BLOCK, // J型方块 L_BLOCK, // L型方块 O_BLOCK, // O型方块 S_BLOCK, // S型方块 T_BLOCK, // T型方块 Z_BLOCK // Z型方块 }; // 方块结构体 struct Block { int x, y; // 方块左上角的坐标 BlockType type; // 方块类型 int state; // 方块状态 }; // 方块数组,每种方块有4种状态 int block[7][4][5] = { // I型方块 { {1, 1, 1, 1, I_BLOCK}, {1, 1, 1, 1, I_BLOCK}, {1, 1, 1, 1, I_BLOCK}, {1, 1, 1, 1, I_BLOCK} }, // J型方块 { {1, 0, 0, 0, J_BLOCK}, {1, 1, 1, 0, J_BLOCK}, {0, 0, 0, 0, J_BLOCK}, {0, 0, 0, 0, J_BLOCK} }, // L型方块 { {0, 0, 1, 0, L_BLOCK}, {1, 1, 1, 0, L_BLOCK}, {0, 0, 0, 0, L_BLOCK}, {0, 0, 0, 0, L_BLOCK} }, // O型方块 { {1, 1, 0, 0, O_BLOCK}, {1, 1, 0, 0, O_BLOCK}, {0, 0, 0, 0, O_BLOCK}, {0, 0, 0, 0, O_BLOCK} }, // S型方块 { {0, 1, 1, 0, S_BLOCK}, {1, 1, 0, 0, S_BLOCK}, {0, 0, 0, 0, S_BLOCK}, {0, 0, 0, 0, S_BLOCK} }, // T型方块 { {0, 1, 0, 0, T_BLOCK}, {1, 1, 1, 0, T_BLOCK}, {0, 0, 0, 0, T_BLOCK}, {0, 0, 0, 0, T_BLOCK} }, // Z型方块 { {1, 1, 0, 0, Z_BLOCK}, {0, 1, 1, 0, Z_BLOCK}, {0, 0, 0, 0, Z_BLOCK}, {0, 0, 0, 0, Z_BLOCK} } }; // 绘制单个方块 void drawBlock(int x, int y, COLORREF color) { setfillcolor(color); setlinecolor(RGB(0, 0, 0)); rectangle(x, y, x + BLOCK_SIZE, y + BLOCK_SIZE); floodfill(x + 1, y + 1, RGB(0, 0, 0)); } // 绘制游戏界面 void drawMap() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (map[i][j] != 0) { drawBlock(j * BLOCK_SIZE, i * BLOCK_SIZE, RGB(255, 255, 255)); } } } } // 绘制方块 void drawBlock(Block b) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (block[b.type][b.state][i * 4 + j] == 1) { drawBlock((b.x + j) * BLOCK_SIZE, (b.y + i) * BLOCK_SIZE, RGB(255, 255, 255)); } } } } // 检查方块是否能够放置在指定位置 bool check(Block b) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (block[b.type][b.state][i * 4 + j] == 1) { int x = b.x + j; int y = b.y + i; if (x < 0 || x >= COLS || y < 0 || y >= ROWS || map[y][x] != 0) { return false; } } } } return true; } // 添加方块到游戏界面 void add(Block b) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (block[b.type][b.state][i * 4 + j] == 1) { int x = b.x + j; int y = b.y + i; map[y][x] = b.type + 1; } } } } // 移除方块从游戏界面 void remove(Block b) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (block[b.type][b.state][i * 4 + j] == 1) { int x = b.x + j; int y = b.y + i; map[y][x] = 0; } } } } // 随机生成一个方块 Block generateBlock() { Block b; b.x = 3; b.y = 0; b.type = rand() % 7; b.state = 0; return b; } // 方块下落 void down(Block &b) { remove(b); b.y++; if (check(b)) { add(b); } else { b.y--; add(b); // 判断游戏是否结束 if (b.y <= 0) { settextstyle(40, 0, "黑体"); outtextxy(200, 200, "Game Over!"); getch(); exit(0); } // 消行 int lines = 0; for (int i = ROWS - 1; i >= 0; i--) { bool flag = true; for (int j = 0; j < COLS; j++) { if (map[i][j] == 0) { flag = false; break; } } if (flag) { for (int k = i; k >= 1; k--) { for (int j = 0; j < COLS; j++) { map[k][j] = map[k - 1][j]; } } lines++; i++; } } // 计算分数 score += lines * 100; } } int main() { // 初始化窗口 initgraph(COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE); setbkcolor(RGB(0, 0, 0)); cleardevice(); // 随机生成一个方块 srand(time(0)); Block b = generateBlock(); // 游戏主循环 while (true) { // 绘制游戏界面 drawMap(); // 绘制方块 drawBlock(b); // 显示分数 settextcolor(RGB(255, 255, 255)); settextstyle(20, 0, "黑体"); char buf[16]; sprintf(buf, "Score: %d", score); outtextxy(10, 10, buf); // 方块下落 down(b); // 处理键盘事件 if (kbhit()) { char ch = getch(); switch (ch) { case 'a': // 左移 remove(b); b.x--; if (check(b)) { add(b); } else { b.x++; add(b); } break; case 'd': // 右移 remove(b); b.x++; if (check(b)) { add(b); } else { b.x--; add(b); } break; case 's': // 加速下落 down(b); break; case 'w': // 旋转 remove(b); b.state = (b.state + 1) % 4; if (check(b)) { add(b); } else { b.state = (b.state + 3) % 4; add(b); } break; case 'q': // 退出游戏 exit(0); break; } } Sleep(100); } return 0; } ``` 希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值