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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SPI协议代码

    SPI协议代码软件模拟SPI程序代码概述:   通过两个MCU(STM32F103)来模拟SPI的主从机,完成主机发送从机接收,便于理解SPI协议。SPI协议简介●SPI接口介绍  SCK:时钟信号,由主设备产生,所以主设备SCK信号为输出模式,从设备的SCK信号为输入模式。  CS:使能信号,由主设备控制从设备,,所以主设备CS信号为输出模式,从设备的CS信号为输入模式。  MOSI:主设备数据输出,从设备数据输入,所以主设备MOSI信号为输出模式,从设备的MOSI信号为输入模式。  MISO:主设备数

    2022年10月16日
    2
  • spdlog开源库使用

    spdlog开源库使用spdlogspdlog是一个非常简单快速的日志库。到现在为止仅仅简单尝试了一下,使用体验比较满意。这里推荐一下。下面是开源库的源地址:源地址安装$gitclonehttps://github.com/gabime/spdlog.git$cdspdlog&&mkdirbuild&&cdbuild$cmake..&&make-j安装也非常简单,只有三条命令。支持的系统Linux,FreeBSD,OpenBS

    2022年6月23日
    32
  • go语言的type func()用法

    go语言的type func()用法在 go 语言中 type 可以定义任何自定义的类型比如熟悉的 typedogstruc typemyIntint 等等所以 func 也是可以作为类型自定义的 typemyFuncfu int int 意思是自定义了一个叫 myFunc 的函数类型 这个函数的签名必须符合输入为 int 输出为 int 已知 相同底层类型的变量之间是可以相互转换的 例如从一个取值范围小的 int16 转为取值范围大的 int32 所以 自定义的 myInt 和 int 之间也是可以转换的 typemyIn

    2025年6月8日
    2
  • 链表排序之选择排序法_单链表直接选择排序

    链表排序之选择排序法_单链表直接选择排序选择排序的优点在于它每次选择出最大或者最小的值,将它们进行排序此选择排序的思想在于选择出最小的节点,创建新链表,将原链表的最小节点删除,继续循环TYPE*lain(intl,TYPE*head){TYPE*first,*tail,*p_min,*min,*p;first=NULL;while(head!=NULL){

    2022年10月11日
    3
  • Hacking Diablo II之D2HACKIT技术详解

    Hacking Diablo II之D2HACKIT技术详解趁着圣诞又歇了几天,没博,倒是主动被动的看了不少片子。我发现我的观影口味挺杂,什么都看,还什么都能看的津津有味。这些片中,有肥皂剧型的“AllyMcBeal”(甜心俏佳人),柯恩兄弟的黑帮型的"Miller’sCrossing",闷骚型的“CountryLife”,一直想看的“北京乐与路”,还有成龙大叔的“神话”。前几天有博友留言希望我多谈点儿d2hackit,那我就随便说说。D2中的外挂,…

    2022年5月5日
    107
  • 美化包软件_美化桌面的软件

    美化包软件_美化桌面的软件前言在我们进行自动化测试的时候,用例往往是成百上千,执行的时间是几十分钟或者是小时级别。有时,我们在调试那么多用例的时候,不知道执行到什么程度了,而pytest-sugar插件能很好解决我们的痛点。

    2022年7月31日
    6

发表回复

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

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