C++从零开始实现俄罗斯方块,vc6.0就可以实现

C++从零开始实现俄罗斯方块,vc6.0就可以实现

C++从零开始实现俄罗斯方块,vc6.0就可以实现

老规矩,废话不多说,直接上效果图
在这里插入图片描述
1首先我们需要知道游戏一共有多少种俄罗斯方块。并且需要定义这些方块

const int sharp[15][8]=	 //组成图形的各个点的各个坐标,先纵后横
{
   
{
   0,0,1,0,2,0,3,0},{
   0,0,0,1,0,2,0,3},//条形(一个打横,一个打竖)
{
   0,0,1,0,0,1,1,1},// 方块
{
   0,0,1,0,1,1,1,2},{
   0,1,1,1,2,0,2,1},{
   0,0,0,1,0,2,1,2},{
   0,0,0,1,1,0,2,0},//L形
{
   1,0,1,1,1,2,0,2},{
   0,0,0,1,1,1,2,1},{
   0,0,0,1,0,2,1,0},{
   0,0,1,0,2,0,2,1},//T形
{
   0,0,0,1,1,1,1,2},{
   0,1,1,0,1,1,2,0},//z1形
{
   0,1,0,2,1,0,1,1},{
   0,0,1,0,1,1,2,1}//z2形
};

2旋转,也就是按上下,图形变换而已。
按照上面的规则,条形只能变成下一个条形,方形不能变,L形只能变成L形。

3游戏update,下落更新

void Games::Updata()					//更新函数
{
   
	int i, flag;
	int nx, ny;
	for(i = 0; i < 4; i++)
	{
   
		nx = pt[0] + sharp[id][i * 2];
		ny = pt[1] + sharp[id][i * 2 + 1];
		SetPos((ny + 1) * 2, nx + 1);
		SetColor(0);
		cout << "■";
		map[nx][ny] = 1;					
	}

	if(pt[0] < top)
		top = pt[0];					//最高点的更新

	for(i = pt[0]; i < pt[0] + high[id]; i++)			//消除行
	{
   
		flag = 1;
		for(int j = 0; j < 13; j++)					//判定某一行是否满, 用flag来标记
			if(map[i][j] == 0)
				flag = 0;
		if(flag == 1)
		{
   
			for(int z = i; z >= top; z--)
			{
   
				for(int p = 0; p < 13; p++)
				{
   
					map[z][p] = map[z - 1][p];
					SetPos((p + 1) * 2, z + 1);
					if(map[z][p] == 1)
						cout << "■";
					else cout << " ";

				}
			}

		}
	}
}

//擦图形和画图形。如果下落过程中,本来有”■”需要变成“ ”。而原来为“ ”的需要画出”■”

void Games::Draw(int x, int y, int num)				//画图形
{
   
	int nx, ny;

	for(int i = 0; i < 4; i++)
	{
   
		nx = x + sharp[num][2 * i];
		ny = y + sharp[num][2 * i + 1];
		SetPos((ny + 1) * 2, nx + 1);
		SetColor(i + 1);
		cout << "■";
	}
}

void Games::ClearDraw(int x, int y, int num)				//为更新图形的位置清除图形
{
   
	int nx, ny;

	for(int i = 0; i < 4; i++)
	{
   
		nx = x + sharp[num][2 * i];
		ny = y + sharp[num][2 * i + 1];
		SetPos((ny + 1) * 2, nx + 1);
		cout << " ";
	}
}

其实原理很简单,用数组控制图形画出来,和擦除。然后再判断是否在一行中满格就可以消除得分。

需要完整代码的小伙伴可以联系我q:2316773638

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2858.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图形的光栅化_简述图像的采样和量化过程

    图形的光栅化_简述图像的采样和量化过程在前面的学习中,我们已经可以通过MVP变换,把摄像机观测的物体都压缩成了一个标准立方体,接下来我们要做的是把这个标准立方体绘制到屏幕(Screen)上何为屏幕?一个二维数组,每个元素称之为像素(pixel,pictureelement的缩写),例如我们常说的屏幕分辨率1920*1080,就是说有这么些个像素。屏幕是一个典型的光栅成像设备。光栅(Raster)在德语中就是屏幕的意思,光栅化(Rasterize,名变动)就是把东西画在屏幕上。像素,最小单位,像素内的颜色可以用rgba来定义,一

    2022年8月30日
    7
  • linux 解压rar密码,linux下rar包的压缩与解压方案

    linux 解压rar密码,linux下rar包的压缩与解压方案方法一:yuminstallunrar方法二:下载地址:以最新的为准。对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:1:对于.ziplinux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,举例说明一下其用法:#zipall.zip*.jpg(这条命令是将所有.jpg的文件压缩成一个z…

    2022年7月11日
    33
  • APK反编译之smali[通俗易懂]

    APK反编译之smali[通俗易懂]APK、Dalvik字节码和smali文件大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(GooglePlay下载的完整版版本):   Where’sMyWater.zip\asset\            &lt;资源目录1:asse…

    2026年1月18日
    4
  • idea2022.01 激活码【中文破解版】2022.03.07

    (idea2022.01 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月2日
    77
  • java的单例模式代码_单例模式例子

    java的单例模式代码_单例模式例子题目:请设计AppConfig类,并在AppConfig类中用main函数测试判断是否只有一个实例对象。(提示:基于static、private、构造函数使用单例模式)代码:publicclassAppConfig{privateinta;//检验是否为同一实例privatestaticAppConfigapp=newAppConfig();//设置私有静态的初始化对象,使得通过getApp生成的对象是同

    2022年8月11日
    10
  • mysql 客户端_推荐一个好用的mysql的客户端工具?

    MySQL作为一个非常流行的关系型数据库,客户端软件其实非常多,下面我简单介绍几个,感兴趣的朋友可以尝试一下:Navicat这是一个比较常用的MySQL客户端软件,界面简洁、功能强大,可以直接查看数据库目录结构,建库建表也非常容易,支持SQL脚本导入导出、数据备份恢复及建模设计等,对于日常管理和维护MySQL数据库来说,是一个非常不错的工具:DBeaver这是一个非常有名的通用数据库管理…

    2022年4月4日
    66

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号