IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 自主学习用C语言写俄罗斯方块笔记 -> 正文阅读

[C++知识库]自主学习用C语言写俄罗斯方块笔记

原文链接(点击原文链接获取更多学习干货):

自主学习用C语言写俄罗斯方块笔记 – 布尔博客

参考博客:(23条消息) 俄罗斯方块(C语言实现)_2021dragon的博客-CSDN博客_俄罗斯方块https://blog.csdn.net/chenlong_cxy/article/details/119680671

1.新的结构体和函数

?自己从参考的博客学习俄罗斯方块代码,在学习过程中,遇到了新的函数和结构体,那就是光标信息结构体和光标位置结构体。还有光标信息函数、光标位置函数和颜色函数。

光标信息结构体:

在这里插入图片描述

?光标位置结构体:

在这里插入图片描述

光标信息函数:

在这里插入图片描述

?光标位置函数:

在这里插入图片描述

颜色函数:

在这里插入图片描述

其中,光标信息函数、光标位置函数和颜色函数都需要用到获取控制台句柄。

?? ?HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄

2.遇到的困难

在学习当中,遇到了第一困难就是理解结构体block,block就是用来存放方块的七种基本形状的各自的四种形态的信息。七种方块需要4*4个格子才能完全存放。在理解的过程中,容易忽略一个格子需要横坐标,一个纵坐标。横坐标纵坐标和行列这两个,他们的位置是相反的,横坐标对应列,纵坐标对应行,在光标跳转的时候,用横纵坐标来跳转,但在判断是否有方块的时候,要用行列来用。

//画出方块
void DrawBlock(int shape, int form, int x, int y)
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (block[shape][form].space[i][j] == 1) //如果该位置有方块
			{
				CursorJump(2 * (x + j), y + i); //光标跳转到指定位置
				printf("■"); //输出方块
			}
		}
	}
}

在代码当中,有一个重要的环节,判断得分与结束,当得分时,需要将得分的格子置空,然后将上面全部的格子都移到下一行。每一个判断后面的返回值都有含义,返回1时就需要继续调用函数,返回0就不需要调用函数,返回-1或者直接exit(0)就要退出代码运行

//判断得分与结束
int JudeFunc()
{
	//判断是否得分
	for (int i = ROW - 2; i > 4; i--)
	{
		int sum = 0; //记录第i行的方块个数
		for (int j = 1; j < COL - 1; j++)
		{
			sum += face.data[i][j]; //统计第i行的方块个数
		}
		if (sum == 0) //该行没有方块,无需再判断其上的层次(无需再继续判断是否得分)
			break; //跳出循环
		if (sum == COL - 2) //该行全是方块,可得分
		{
			grade += 10; //满一行加10分
			color(7); //颜色设置为白色
			CursorJump(2 * COL + 4, ROW - 3); //光标跳转到显示当前分数的位置
			printf("当前分数:%d", grade); //更新当前分数
			for (int j = 1; j < COL - 1; j++) //清除得分行的方块信息
			{
				face.data[i][j] = 0; //该位置得分后被清除,标记为无方块
				CursorJump(2 * j, i); //光标跳转到该位置
				printf("  "); //打印空格覆盖(两个空格)
			}
			//把被清除行上面的行整体向下挪一格
			for (int m = i; m >1; m--)
			{
				sum = 0; //记录上一行的方块个数
				for (int n = 1; n < COL - 1; n++)
				{
					sum += face.data[m - 1][n]; //统计上一行的方块个数
					face.data[m][n] = face.data[m - 1][n]; //将上一行方块的标识移到下一行
					face.color[m][n] = face.color[m - 1][n]; //将上一行方块的颜色编号移到下一行
					if (face.data[m][n] == 1) //上一行移下来的是方块,打印方块
					{
						CursorJump(2 * n, m); //光标跳转到该位置
						color(face.color[m][n]); //颜色设置为还方块的颜色
						printf("■"); //打印方块
					}
					else //上一行移下来的是空格,打印空格
					{
						CursorJump(2 * n, m); //光标跳转到该位置
						printf("  "); //打印空格(两个空格)
					}
				}
				if (sum == 0) //上一行移下来的全是空格,无需再将上层的方块向下移动(移动结束)
					return 1; //返回1,表示还需调用该函数进行判断(移动下来的可能还有满行)
			}
		}
	}
	//判断游戏是否结束
	for (int j = 1; j < COL - 1; j++)
	{
		if (face.data[1][j] == 1) //顶层有方块存在(以第1行为顶层,不是第0行)
		{
			Sleep(1000); //留给玩家反应时间
			system("cls"); //清空屏幕
			color(7); //颜色设置为白色
			CursorJump(2 * (COL / 3), ROW / 2 - 3);
			if (grade>max)
			{
				printf("恭喜你打破最高记录,最高记录更新为%d", grade);
				WriteGrade();
			}
			else if (grade == max)
			{
				printf("与最高记录持平,加油再创佳绩", grade);
			}
			else
			{
				printf("请继续加油,当前与最高记录相差%d", max - grade);
			}
			CursorJump(2 * (COL / 3), ROW / 2);
			printf("GAME OVER");
			while (1)
			{
				char ch;
				CursorJump(2 * (COL / 3), ROW / 2 + 3);
				printf("再来一局?(y/n):");
				scanf("%c", &ch);
				if (ch == 'y' || ch == 'Y')
				{
					system("cls");
					main();
				}
				else if (ch == 'n' || ch == 'N')
				{
					CursorJump(2 * (COL / 3), ROW / 2 + 5);
					exit(0);
				}
				else
				{
					CursorJump(2 * (COL / 3), ROW / 2 + 4);
					printf("选择错误,请再次选择");
				}
			}
		}
	}
	return 0; //判断结束,无需再调用该函数进行判断
}

整个判断函数要考虑的情况不少,还要考虑留给玩家的反应时间。

学到游戏主题函数,才知道敲键盘是怎么实现的。

游戏主题函数是整个函数中最主要也是最难理解的部分,清楚每一个操作按键的发生,还要知道代码的实现,考虑按键按了之后方块是否能合法下落或旋转。概括主题函数的主逻辑。

函数用了t来定义键盘是否被敲击,只是用来标志而已,并不是用t来做反馈。

3.根据自身更改

源代码是将所有的代码用一个文件来写的,而自己本身正在学习用多文件编辑,所以,自己尝试写的时候,会将每一个函数都用一个文件来编写,来锻炼多文件编程的能力,而在不懂的时候也有像博主讨教过自己的看法,问了以下是否可行,所以也会将自己的一些看法写进代码做相应的修改。从博主的代码当中,学习思路,对于大文件编辑,自己还没那个实力,所以,先从大佬的代码中学习,慢慢的积累,来尝试写比之前自己写过更大的代码,慢慢的走,踏实地学。

在这里插入图片描述

?


?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 12:59:34  更:2021-09-12 12:59:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:57:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码