当前位置:网站首页>els 长条方块变形条件、边界碰撞判定
els 长条方块变形条件、边界碰撞判定
2022-08-02 13:32:00 【joker_0030】
1、头函数(els.h)
#ifndef N_d
#define N_d
#include<Windows.h>
#include<time.h>
#define DEF_TIMER1 1234
void OnPaint(HDC hDc);
//显示方块。
void PaintSqare(HDC hMemDC);
//产生随机块。
int CreateRandomSqare();
//随机块贴近背景。
void CopySqareToBack();
void Oncreate();
//方块加速。
void SqareDwon();
//方块左移。
void SqareLeft();
//方块左移。
void SqareRight();
//处理按键消息
//回车键。
void OnReturn(HWND hWnd);
//定时器响应的函数。
void OnTimer(HWND hWnd);
//左键处理。
void OnLeft(HWND hWnd);
//右键处理。
void OnRight(HWND hWnd);
//下键处理。
void OnDown(HWND hWnd);
//上键处理。
void OnChangeSqare(HWND hWnd);
//方块停在最底层
int CanSqareDown();
//els 方块停在方块上。
int CanSqareDown2();
//判断左移边界是否是边框。
int CanSqareLeft();
//判断左移的边界是否是方块。
int CanSqareLeft2();
//判断右移边界是否是边框。
int CanSqareRight();
//判断右移的边界是否是方块。
int CanSqareRight2();
//判断方块是否变形。
int CanSqareChangeShape();
//长条边界变化。
int CanLineSqareChange();
//将1变成2。
void Change1To2();
//改变形状。
void ChangeSqare();
//长条变化。
void ChangeLineSqare();
//显示2
void ShowSqare2(HDC hMemDC);
#endif
2、函数实现(els.c)
#include"els_h.h"
//背景数组
char g_arrBackGroud[20][10] = {0};
char g_arrSqare[2][4] = {0};
int g_nSqareID = -1;
// g_Line与g_nList记录当前模块左上角位置。
int g_nLine = -1;
int g_nList = -1;
int CanLineSqareChange()//长方块边界变形判断。
{
int i = 0,
j = 0;
for ( i = 1; i < 4; i++)//右
{
if (2 == g_arrBackGroud[g_nLine][g_nList + i] || g_nList + i > 9)
{
break;
}
}
for ( j = 1; j <4 ; j++)
{
if (2 == g_arrBackGroud[g_nLine][g_nList - j] || g_nList - j < 0)
{
break;
}
}
if ((i-1+j-1)<3)
{
return 0;
}
return 1;
}
void ChangeLineSqare()//长方块变形。
{
if (1 == g_arrBackGroud[g_nLine][g_nList - 1])//横着的。
{
//清零。
g_arrBackGroud[g_nLine][g_nList - 1] = 0;
g_arrBackGroud[g_nLine][g_nList + 1] = 0;
g_arrBackGroud[g_nLine][g_nList + 2] = 0;
if (2 == g_arrBackGroud[g_nLine + 1][g_nList])
{
g_arrBackGroud[g_nLine - 1][g_nList] = 1;
g_arrBackGroud[g_nLine - 2][g_nList] = 1;
g_arrBackGroud[g_nLine - 3][g_nList] = 1;
}
else if (2 == g_arrBackGroud[g_nLine + 2][g_nList])
{
g_arrBackGroud[g_nLine + 1][g_nList] = 1;
g_arrBackGroud[g_nLine - 1][g_nList] = 1;
g_arrBackGroud[g_nLine - 2][g_nList] = 1;
}
else
{
//元素赋值。
g_arrBackGroud[g_nLine - 1][g_nList] = 1;
g_arrBackGroud[g_nLine + 1][g_nList] = 1;
g_arrBackGroud[g_nLine + 2][g_nList] = 1;
}
}
else//竖着的。
{
//清零。
g_arrBackGroud[g_nLine - 1][g_nList] = 0;
g_arrBackGroud[g_nLine + 1][g_nList] = 0;
g_arrBackGroud[g_nLine + 2][g_nList] = 0;
if (2 == g_arrBackGroud[g_nLine][g_nList + 1]||9==g_nList)//长条右边界线碰撞
{
//赋值。
g_arrBackGroud[g_nLine][g_nList - 1] = 1;
g_arrBackGroud[g_nLine][g_nList - 2] = 1;
g_arrBackGroud[g_nLine][g_nList - 3] = 1;
//标记。
g_nList = g_nList - 2;
}
else if (2 == g_arrBackGroud[g_nLine][g_nList + 2]||8==g_nList)//长条右边界线向左一位碰撞
{
g_arrBackGroud[g_nLine][g_nList + 1] = 1;
g_arrBackGroud[g_nLine][g_nList - 1] = 1;
g_arrBackGroud[g_nLine][g_nList - 2] = 1;
g_nList = g_nList - 1;
}
else if (2 == g_arrBackGroud[g_nLine][g_nList - 1]||0==g_nList)//长条左边界碰撞。
{
//赋值。
g_arrBackGroud[g_nLine][g_nList + 1] = 1;
g_arrBackGroud[g_nLine][g_nList + 2] = 1;
g_arrBackGroud[g_nLine][g_nList + 3] = 1;
//标记。
g_nList = g_nList + 1;
}
else
{
//元素赋值。
g_arrBackGroud[g_nLine][g_nList - 1] = 1;
g_arrBackGroud[g_nLine][g_nList + 1] = 1;
g_arrBackGroud[g_nLine][g_nList + 2] = 1;
}
}
}
void OnPaint(HDC hDc)
{
//创建兼容性DC。
HDC hMemDC = CreateCompatibleDC(hDc);//内存id为:HMemDc,窗口id hDc。
//创建兼容性位图。
HBITMAP hBitmapBack= CreateCompatibleBitmap(hDc, 500, 600);
//关联起来。
SelectObject(hMemDC, hBitmapBack);
PaintSqare(hMemDC);
ShowSqare2(hMemDC);
//传递:
//返回值:失败返回0,成功返回非零。
//参数1:目标DC,窗口DC
//参数2,3:目标的起始位置,注意是基于我们的窗口。
//参数4,5:区域的大小。
//参数6:源DC,也就是我们的内存DC。
//参数7,8:内存图片的起始位置。
//参数9:传递方式。
//
BitBlt(hDc, 0, 0, 300, 600, hMemDC, 0, 0, SRCCOPY);
//释放DC
DeleteObject(hBitmapBack);
DeleteDC(hMemDC);
}
void Oncreate()
{
srand((unsigned int)time(NULL));//只执行一次。
CreateRandomSqare();
CopySqareToBack();
}
void PaintSqare(HDC hMemDC)
{
int i = 0,
j = 0;
//画大方块。
//创建的是窗口背景颜色。
HBRUSH hOldBrush1;
//创建一个颜色的画刷。
HBRUSH hNewBrush1 = CreateSolidBrush(RGB(63, 27, 18));
//绑定当前DC与画刷,返回系统默认画刷。
hOldBrush1 = SelectObject(hMemDC, hNewBrush1);
//释放画刷句柄。
//遍历
Rectangle(hMemDC, 0, 0, 300, 600);//矩形框距离运行窗口的开始位置坐标和截至位置坐标。
//指定一个方块。
/*g_arrBackGroud[2][4] = 1;
g_arrBackGroud[3][3] = 1;
g_arrBackGroud[3][4] = 1;
g_arrBackGroud[3][5] = 1;*/
//创建的是还未掉下的方块的颜色
HBRUSH hOldBrush;
//创建一个颜色的画刷。
HBRUSH hNewBrush = CreateSolidBrush(RGB(63, 27, 182));
//绑定当前DC与画刷,返回系统默认画刷。
hOldBrush = SelectObject(hMemDC, hNewBrush);
//释放画刷句柄。
//遍历
for (i=0 ; i < 20; i++)//2、?
{
for (j=0 ; j < 10; j++)
{
if (1 == g_arrBackGroud[i][j])
{
//画方块。
Rectangle(hMemDC, j*30, i*30, j*30 + 30, i*30 + 30);//矩形框距离运行窗口的开始位置坐标和截至位置坐标。
}
}
}
//使用完新画刷,把系统默认画刷选出来,返回创建的画刷。
hNewBrush = SelectObject(hMemDC, hOldBrush);
//释放画刷句柄。
DeleteObject(hNewBrush);
//使用完新画刷,把系统默认画刷选出来,返回创建的画刷。
hNewBrush1 = SelectObject(hMemDC, hOldBrush1);
//释放画刷句柄。
DeleteObject(hNewBrush1);
}
//创建随机块。
int CreateRandomSqare()
{
int nIndex=rand()%7;
switch (6)//switch(nIndex)
{
case 0:
g_arrSqare[0][0] = 1, g_arrSqare[0][1] = 1, g_arrSqare[0][2] = 0, g_arrSqare[0][3] = 0;
g_arrSqare[1][0] = 0, g_arrSqare[1][1] = 1, g_arrSqare[1][2] = 1, g_arrSqare[1][3] = 0;
g_nLine = 0;
g_nList = 3;
break;
case 1:
g_arrSqare[0][0] = 0, g_arrSqare[0][1] = 1, g_arrSqare[0][2] = 1, g_arrSqare[0][3] = 0;
g_arrSqare[1][0] = 1, g_arrSqare[1][1] = 1, g_arrSqare[1][2] = 0, g_arrSqare[1][3] = 0;
g_nLine = 0;
g_nList = 3;
break;
case 2:
g_arrSqare[0][0] = 0, g_arrSqare[0][1] = 1, g_arrSqare[0][2] = 0, g_arrSqare[0][3] = 0;
g_arrSqare[1][0] = 1, g_arrSqare[1][1] = 1, g_arrSqare[1][2] = 1, g_arrSqare[1][3] = 0;
g_nLine = 0;
g_nList = 3;
break;
case 3:
g_arrSqare[0][0] = 1, g_arrSqare[0][1] = 0, g_arrSqare[0][2] = 0, g_arrSqare[0][3] = 0;
g_arrSqare[1][0] = 1, g_arrSqare[1][1] = 1, g_arrSqare[1][2] = 1, g_arrSqare[1][3] = 0;
g_nLine = 0;
g_nList = 3;
break;
case 4:
g_arrSqare[0][0] = 0, g_arrSqare[0][1] = 0, g_arrSqare[0][2] = 1, g_arrSqare[0][3]= 0;
g_arrSqare[1][0] = 1, g_arrSqare[1][1] = 1, g_arrSqare[1][2] = 1, g_arrSqare[1][3] = 0;
g_nLine = 0;
g_nList = 3;
break;
case 5:
g_arrSqare[0][0] = 0, g_arrSqare[0][1] = 1, g_arrSqare[0][2] = 1, g_arrSqare[0][3] = 0;
g_arrSqare[1][0] = 0, g_arrSqare[1][1] = 1, g_arrSqare[1][2] = 1, g_arrSqare[1][3] = 0;
g_nLine = 0;
g_nList = 4;
break;
case 6:
g_arrSqare[0][0] = 1, g_arrSqare[0][1] = 1, g_arrSqare[0][2] = 1, g_arrSqare[0][3] = 1;
g_arrSqare[1][0] = 0, g_arrSqare[1][1] = 0, g_arrSqare[1][2] = 0, g_arrSqare[1][3] = 0;
g_nLine = 0;
g_nList = 4;
break;
}
g_nSqareID = nIndex;
return nIndex;
}
void CopySqareToBack()
{
int i = 0,
j = 0;
for ( i = 0; i <2 ; i++)
{
for ( j = 0; j < 4; j++)
{
g_arrBackGroud[i][j + 3] = g_arrSqare[i][j];
}
}
}
void OnReturn(HWND hWnd)
{
//启动定时器
//返回值:成功返回非零。
//参数1:窗口句柄hWnd,NUL
//参数2:定时器ID 不理会
//参数3:间隔时间,毫秒 1000ms=1s。
//参数4:设置为NULL 处理函数的地址。
SetTimer(hWnd, DEF_TIMER1, 200, NULL);
}
void SqareDwon()
{
int i = 0,
j = 0;
for (i = 19; i >=0; i--)
{
for (j = 0; j < 10; j++)
{
if (1==g_arrBackGroud[i][j])
{
g_arrBackGroud[i + 1][j] = g_arrBackGroud[i][j];
g_arrBackGroud[i][j]=0;
}
}
}
}
void OnTimer(HWND hWnd)
{
HDC hDc=GetDC(hWnd);//内核对象。
if (1 == CanSqareDown()&&1== CanSqareDown2())
{
SqareDwon();//停止下落。
g_nLine++;
}
else
{
//1到2
Change1To2();
//产生随机块。
CreateRandomSqare();
//复制到背景上。
CopySqareToBack();
}
//SqareDwon();
//显示方块:
//PaintSqare(hDc);
OnPaint(hDc);
ReleaseDC(hWnd, hDc);
}
int CanSqareDown()
{
int i = 0;
for ( i = 0; i < 10; i++)
{
if (1 == g_arrBackGroud[19][i])
{
return 0;
}
}
return 1;
}
void Change1To2()
{
int i = 0,
j = 0;
for ( i = 0; i < 20; i++)
{
for ( j = 0; j < 10; j++)
{
if (1==g_arrBackGroud[i][j])
{
g_arrBackGroud[i][j] = 2;
}
}
}
}
void ShowSqare2(HDC hMemDC)
{
int i = 0,
j = 0;
HBRUSH hOldBrush;
//创建一个颜色的画刷。
HBRUSH hNewBrush = CreateSolidBrush(RGB(233, 27, 182));
//绑定当前DC与画刷,返回系统默认画刷。
hOldBrush = SelectObject(hMemDC, hNewBrush);
for ( i = 0; i < 20; i++)
{
for ( j = 0; j < 10; j++)
{
if (2 == g_arrBackGroud[i][j])
{
Rectangle(hMemDC, j * 30, i * 30, j * 30 + 30, i * 30 + 30);//矩形框距离运行窗口的开始位置坐标和截至位置坐标。
}
}
}
//使用完新画刷,把系统默认画刷选出来,返回创建的画刷。
hNewBrush = SelectObject(hMemDC, hOldBrush);
//释放画刷句柄。
DeleteObject(hNewBrush);
}
int CanSqareDown2()
{
int i = 0,
j = 0;
for ( i = 19; i >= 0; i--)
{
for ( j = 0; j < 10; j++)
{
if (1== g_arrBackGroud[i][j])
{
if (2==g_arrBackGroud[i+1][j])
{
return 0;
}
}
}
}
return 1;
}
void OnLeft(HWND hWnd)
{
if (1== CanSqareLeft()&& 1==CanSqareLeft2())
{
HDC hDc = GetDC(hWnd);
//方块左移。
SqareLeft();
g_nList--;
//显示方块。
OnPaint(hDc);
ReleaseDC(hWnd, hDc);
}
}
void SqareLeft()
{
int i = 0,
j = 0;
for ( i = 0; i < 20; i++)
{
for ( j = 0; j < 10; j++)
{
if (1 == g_arrBackGroud[i][j])
{
g_arrBackGroud[i][j - 1] = g_arrBackGroud[i][j];
g_arrBackGroud[i][j] = 0;
}
}
}
}
int CanSqareLeft()
{
int i = 0;
for ( i = 0; i < 20; i++)
{
if (1==g_arrBackGroud[i][0])
{
return 0;
}
}
return 1;
}
int CanSqareLeft2()
{
int i,
j;
for ( i = 0; i < 20; i++)
{
for ( j = 0; j < 10; j++)
{
if (1 == g_arrBackGroud[i][j])
{
if (2==g_arrBackGroud[i][j-1])
{
return 0;
}
}
}
}
return 1;
}
void OnRight(HWND hWnd)
{
//HDC hDc = GetDC(hWnd);
方块右移。
//SqareRight();
//OnPaint(hDc);
释放。
//ReleaseDC(hWnd,hDc);
if (1 == CanSqareRight() && 1 == CanSqareRight2())
{
HDC hDc = GetDC(hWnd);
g_nList++;
//方块右移。
SqareRight();
//显示方块。
OnPaint(hDc);
ReleaseDC(hWnd, hDc);
}
}
void SqareRight()
{
int i,
j;
for ( i = 0; i < 20; i++)
{
for ( j = 9; j >=0 ; j--)
{
if (1 == g_arrBackGroud[i][j])
{
g_arrBackGroud[i][j+1] = g_arrBackGroud[i][j];
g_arrBackGroud[i][j] = 0;
}
}
}
}
int CanSqareRight()
{
int i = 0;
for (i = 0; i < 20; i++)
{
if (1 == g_arrBackGroud[i][9])
{
return 0;
}
}
return 1;
}
int CanSqareRight2()
{
int i,
j;
for (i = 0; i < 20; i++)
{
for (j = 0; j < 10; j++)
{
if (1 == g_arrBackGroud[i][j])
{
if (2 == g_arrBackGroud[i][j+1])
{
return 0;
}
}
}
}
return 1;
}
void OnDown(HWND hWnd)
{
OnTimer(hWnd);
}
void OnChangeSqare(HWND hWnd)
{
HDC hDc= GetDC(hWnd);
switch(6)//switch (g_nSqareID)
{
case 0:
case 1:
case 2:
case 3:
case 4:
if (1== CanSqareChangeShape())
{
ChangeSqare();//普通变形
}
else
{
return;
}
break;
case 5://方形
return;
case 6://长条变形。
if (1 == CanLineSqareChange())
{
ChangeLineSqare();
}
break;
}
OnPaint(hDc);
ReleaseDC(hWnd, hDc);
}
void ChangeSqare()
{
int i = 0,
j = 0,
nTemp=2;
char arrSqare[3][3] = { 0 };
//将背景块复制出来。
for ( i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
arrSqare[i][j] = g_arrBackGroud[g_nLine+i][g_nList+j];
}
}
//变形后复制回去。
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
g_arrBackGroud[g_nLine + i][g_nList + j]= arrSqare[nTemp][i];
nTemp--;
}
nTemp = 2;
}
}
int CanSqareChangeShape()
{
int i=0,
j=0;
for ( i = 0; i < 3; i++)
{
for ( j = 0; j < 3; j++)
{
if (2 == g_arrBackGroud[g_nLine + i][g_nList + j])
{
return 0;
}
}
}
//if (g_nList < 0 || g_nList + 2>9)//解决方案1。
//{
// return 0;
//}
if (g_nList < 0)
{
g_nList = 0;
}
if (g_nLine+2>9)
{
g_nList = 7;
}
return 1;
}
边栏推荐
- 攻防世界----unfinish
- Enterprise Network Planning Based on Huawei eNSP
- How to do short video food from the media?5 steps to teach you to get started quickly
- PHP+MYSQL [Student Information Management System] (Minimalist Edition)
- “多源异构”和“异构同源”定义区分详解「建议收藏」
- 二进制中1的个数
- "Second Uncle" is popular, do you know the basic elements of "exploding" short videos from the media?
- 目前想通过提取本地excel文件创建数据表,在sql语句这出了一些问题
- 【C语言】虐打循环练习题(2)
- 二叉树的类型、构建、遍历、操作
猜你喜欢
随机推荐
你知道图论的spfa吗?
[b01lers2020]Welcome to Earth-1
节省50%成本!京东云重磅发布新一代混合CDN产品
[C language] Explicit array solution (1)
RISC-V instruction format and 6 basic integer instructions
Wireless vibrating wire acquisition instrument remote modification method
【C语言】细品分支结构——switch语句
百日刷题计划 ———— DAY1
"Second Uncle" is popular, do you know the basic elements of "exploding" short videos from the media?
【C语言】手撕循环结构 ——do...while语句及循环练习题(1)
腾讯安全发布Tencent Cloud EdgeOne,为企业出海打造安全加速一体化服务
动态组件-component
矩阵中的路径
【C语言】手把手带你写游戏 —— 猜数字
Mysql视图
“二舅”火了,自媒体短视频“爆火”的基本要素,你知道吗?
基于 WeihanLi.Npoi 实现excel导入时纯汉字的日期转换
图论之Floyd,多源图最短路如何暴力美学?
Object.entries()
永远退出机器学习界!