从零实现俄罗斯方块(c语言+思路分析)

您所在的位置:网站首页 俄罗斯方块99机制 从零实现俄罗斯方块(c语言+思路分析)

从零实现俄罗斯方块(c语言+思路分析)

2024-07-09 06:04| 来源: 网络整理| 查看: 265

俄罗斯方块 文章说明:

本文大部分参考至 俄罗斯方块(C语言实现)_c语言俄罗斯方块_2021dragon的博客-CSDN博客,本人经过修改编辑,改变了文章的一些思路顺序,使得新手便于理解(个人想法)。更新后的文章最大的特色就是从零开始的思路顺序,以及如何使用搜索引擎的思路。本人水平有限,文章中间可能还有许多思路的逻辑漏洞。但是看完这篇文章,再经过你们自己按顺序调试运行一遍程序,即可了解一些做项目的过程和思路。学长的总结一定是能让你们少走许多弯路,不用再像当年的我一样抓耳挠腮不知从何下手。看完文章之后自己重新写一遍,鉴于编写文章过程中还会有许多疏漏的细节,请各位同学遇到不会的问题前来询问即可。

俄罗斯方块相信大家都知道,这里就不再介绍什么游戏背景了,我这里对本代码实现的俄罗斯方块作一些说明:

按方向键的左右键可实现方块的左右移动。 按方向键的下键可实现方块的加速下落。 按空格键可实现方块的顺时针旋转。 按Esc键可退出游戏。 按S键可暂停游戏,暂停游戏后按任意键继续游戏。 按R键可重新开始游戏。 除此之外,本游戏还拥有计分系统,可保存玩家的历史最高记录。

以下是完整代码:

#include #include #include #include #include #define ROW 29 //游戏区行数 #define COL 20 //游戏区列数 #define DOWN 80 //方向键:下 #define LEFT 75 //方向键:左 #define RIGHT 77 //方向键:右 #define SPACE 32 //空格键 #define ESC 27 //Esc键 struct Face { int data[ROW][COL + 10]; //用于标记指定位置是否有方块(1为有,0为无) int color[ROW][COL + 10]; //用于记录指定位置的方块颜色编码 }face; struct Block { int space[4][4]; }block[7][4]; //用于存储7种基本形状方块的各自的4种形态的信息,共28种 //隐藏光标 void HideCursor(); //光标跳转 void CursorJump(int x, int y); //初始化界面 void InitInterface(); //初始化方块信息 void InitBlockInfo(); //颜色设置 void color(int num); //画出方块 void DrawBlock(int shape, int form, int x, int y); //空格覆盖 void DrawSpace(int shape, int form, int x, int y); //合法性判断 int IsLegal(int shape, int form, int x, int y); //判断得分与结束 int JudeFunc(); //游戏主体逻辑函数 void StartGame(); //从文件读取最高分 void ReadGrade(); //更新最高分到文件 void WriteGrade(); int max, grade; //全局变量 int main() { #pragma warning (disable:4996) //消除警告 max = 0, grade = 0; //初始化变量 system("title 俄罗斯方块"); //设置cmd窗口的名字 system("mode con lines=29 cols=60"); //设置cmd窗口的大小 HideCursor(); //隐藏光标 ReadGrade(); //从文件读取最高分到max变量 InitInterface(); //初始化界面 InitBlockInfo(); //初始化方块信息 srand((unsigned int)time(NULL)); //设置随机数生成的起点 StartGame(); //开始游戏 return 0; } //隐藏光标 void HideCursor() { CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量 curInfo.dwSize = 1; //如果没赋值的话,隐藏光标无效 curInfo.bVisible = FALSE; //将光标设置为不可见 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄 SetConsoleCursorInfo(handle, &curInfo); //设置光标信息 } //光标跳转 void CursorJump(int x, int y) { COORD pos; //定义光标位置的结构体变量 pos.X = x; //横坐标设置 pos.Y = y; //纵坐标设置 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄 SetConsoleCursorPosition(handle, pos); //设置光标位置 } //初始化界面 void InitInterface() { color(7); //颜色设置为白色 for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL + 10; j++) { if (j == 0 || j == COL - 1 || j == COL + 9) { face.data[i][j] = 1; //标记该位置有方块 CursorJump(2 * j, i); printf("■"); } else if (i == ROW - 1) { face.data[i][j] = 1; //标记该位置有方块 printf("■"); } else face.data[i][j] = 0; //标记该位置无方块 } } for (int i = COL; i < COL + 10; i++) { face.data[8][i] = 1; //标记该位置有方块 CursorJump(2 * i, 8); printf("■"); } CursorJump(2 * COL, 1); printf("下一个方块:"); CursorJump(2 * COL + 4, ROW - 19); printf("左移:←"); CursorJump(2 * COL + 4, ROW - 17); printf("右移:→"); CursorJump(2 * COL + 4, ROW - 15); printf("加速:↓"); CursorJump(2 * COL + 4, ROW - 13); printf("旋转:空格"); CursorJump(2 * COL + 4, ROW - 11); printf("暂停: S"); CursorJump(2 * COL + 4, ROW - 9); printf("退出: Esc"); CursorJump(2 * COL + 4, ROW - 7); printf("重新开始:R"); CursorJump(2 * COL + 4, ROW - 5); printf("最高纪录:%d", max); CursorJump(2 * COL + 4, ROW - 3); printf("当前分数:%d", grade); } //初始化方块信息 void InitBlockInfo() { //“T”形 for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3