1、函数实现(els.c)

#include"els_h.h"
//背景数组
char g_arrBackGroud[20][10] = {0};
char g_arrSqare[2][4] = {0};

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 (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; 
        
        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; 
        
        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; 
        
        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_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;
        
        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;
        
        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;
        
        break;
    }
    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();//停止下落。
    }
    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();
        //显示方块。
        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);
        //方块左移。
        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);

}
2、头函数(els.main.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 OnReturn(HWND hWnd);
//方块下落。
void SqareDwon();
//方块左移。
void SqareLeft();
//方块左移。
void SqareRight();

//定时器响应的函数。
void OnTimer(HWND hWnd);
//左键处理。
void OnLeft(HWND hWnd);
//右键处理。
void OnRight(HWND hWnd);
//下键处理。
void OnDown(HWND hWnd);

//方块停在最底层 
int CanSqareDown();
//els 方块停在方块上。
int CanSqareDown2();
//判断左移边界是否是边框。
int CanSqareLeft();
//判断左移的边界是否是方块。
int CanSqareLeft2();
//判断右移边界是否是边框。
int CanSqareRight();
//判断右移的边界是否是方块。
int CanSqareRight2();

//将1变成2。
void Change1To2();
//显示2
void ShowSqare2(HDC hMemDC);

#endif

3、主函数(els.h)

#include<Windows.h>
#include"resource.h"
#include"els_h.h"
LRESULT CALLBACK PELouSi(HWND hWnd, UINT oMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR ipCmdLine,int nCmdShow)
{
    //初始化窗口类。
    WNDCLASSEX  db;
    HWND hWnd;
    MSG msg;//结构体变量。

db.cbClsExtra = 0;
    db.cbSize = sizeof(WNDCLASSEX);
    db.cbWndExtra = 0;

db.hbrBackground = (HBRUSH)COLOR_BACKGROUND;//背景颜色。
    
    //返回值:鼠标的句柄。
    // 参数1:如果加载系统光标,NULL、如果加载自定义光标,填写实列句柄,hInstance;参数2:系统光标,直接填写定义好的宏、如果加载自定义光标,就用MAKEINTRESOURCE(240)加载相应的资源ID。
    //db.hCursor = LoadCursor(NULL,IDC_HAND);//加载系统定义的光标。
    db.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE (IDC_NODROP));//自定义的光标。资源文件->添加->资源->Cursor->IDC_NODROP->新建。
    
    //返回值:图标的句柄。
    // 参数1:如果加载系统光标,NULL、如果加载自定义光标,填写实列句柄,hInstance;参数2:系统光标,直接填写定义好的宏、如果加载自定义光标,就用MAKEINTRESOURCE(240)加载相应的资源ID。
    //db.hIcon = LoadIcon(NULL,IDI_ASTERISK);//加载系统定义的光标。
    db.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));//状态栏图标。
    
    //db.hIconSm = NULL;//左上角图标为此定义。如果为空则默认为状态栏图标。
    db.hIconSm = LoadIcon(NULL,IDI_HAND);
    db.hInstance = hInstance;
    db.lpfnWndProc = PELouSi;//回调函数名。
    db.lpszClassName = "els";
    db.lpszMenuName = NULL;
    db.style = CS_HREDRAW | CS_VREDRAW;

if(0==RegisterClassEx(&db))
    {
        int a = GetLastError();
        return 0;
    }

//创建窗口。hWnd窗口句柄 失败返回NULL。 
    //窗口风格:参数4。
    hWnd=CreateWindowEx(WS_EX_TOPMOST,"els","els方块",WS_OVERLAPPEDWINDOW,100,100,500,650,NULL,NULL,hInstance,NULL);
    //1、?
    if (NULL == hWnd)//窗口句柄。 窗口的唯一标识。
    {

return 0;
    }

//显示窗口
    ShowWindow(hWnd, nCmdShow);
    
    //消息循环。队列。
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
    //回调函数
    //返回值:LRESULT,CALLBACK调用约定。
    //参数1:窗口句柄;参数2:消息ID。
LRESULT CALLBACK PELouSi(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)// LRESULT:long类型;UINT:无符号整型,消息的ID。
{
    PAINTSTRUCT pt;//定义结构体。
    HDC hDc;
    //关闭窗口消息
    switch (nMsg)
    {
    case WM_CREATE://窗口信息处理程序接受的第一个消息,也是回调函数处理的第一个消息(为WM_CREATE)。此消息只产生一次,一般是用于初始化一些数据。
        //GetLastError();//优化。
        Oncreate();//游戏数据初始化。
        break;
    case WM_TIMER:
        OnTimer(hWnd);
        break;
    //是回调函数处理的第二个消息(为WM_PAINT)。
    //当窗口显示区域的一部分显示内容或者全部变为(无效),以致于必须(更新画面)时,将由这个消息通知程序。
    //窗口结构的最后的那个成员CS_HREDRAW|CS_VREDRAW,目的就是窗口大小发生变化的时候,产生WM_PAINT消息。
    //窗口重叠时,重叠部分渐渐出现时。
    case WM_PAINT:
        //GetLastError();//优化。
        hDc=BeginPaint(hWnd,&pt);//getDC,窗口可操作区域的标识。
        //在此之间画窗口的内容。
        //画方块。
        OnPaint(hDc);//增加代码可读性。
        
        EndPaint(hWnd, &pt);//结束。
        break;
    case WM_KEYDOWN:
        switch (wParam)
        {
        case VK_RETURN:
            OnReturn(hWnd);//3、?
            break;
        case VK_LEFT:
            //左移。
            OnLeft(hWnd);
                break;
        case VK_RIGHT:
            // 右移。
            OnRight(hWnd);
                break;
        case VK_UP:
                break;
        case VK_DOWN:
            //下移动加速。
            OnDown(hWnd);
                break;
        }
        break;
    case WM_DESTROY:
        KillTimer(hWnd, DEF_TIMER1);
            PostQuitMessage(0);//调用PostQuitMessage(0)这个函数发出WM_QUIT消息。//点叉系统依次产生WM_CLOSE,WM_DESTROY,WM_QUIT。
            break;
        
    }//手动处理点叉关闭消息。

return DefWindowProc(hWnd, nMsg, wParam, lParam);
    //LRESULT a=DefWindowProc(hWnd, oMsg, wParam, lParam);//功能
    //return a;
}

*GetxxxDC由releaseDC释放。

 CreatexxxDC由deleteDC释放。

els 方块向右移动边界判断、向下加速相关推荐

  1. linux shell判断当前目录下的文件或目录

    linux shell判断当前目录下的文件或目录 #!bin/sh for file in ./* doif test -f $filethenecho $file 是文件elseecho $file ...

  2. 源代码可以从应用提取码_大规模下加速源代码分析

    引用:Upadhyaya G , Rajan H . On Accelerating Source Code Analysis At Massive Scale[J]. IEEE Transactio ...

  3. 刷脸支付在新零售行业线上线下加速融合

    以线上线下融合为特点的新零售一定是未来的趋势.而时至今日,马云的新零售概念俨然是当下资本市场最热门的风口,无论是电商大鳄,还是传统商超.创业公司,都在抢先布局这块市场.新零售的概念即企业以互联网为依托 ...

  4. Javascript如何判断按下的是鼠标左键还是右键

    Javascript如何判断按下的是鼠标左键还是右键 一.需求:在页面上某个元素上点击鼠标右键,弹出二级悬窗(右键菜单). 二.解决技术问题:如何监听鼠标右键事件 三.解决方案:  1.使用jquer ...

  5. Python Numba CPU下加速

    Python代码加速 主要考虑代码优化加速,而非代码逻辑优化. Python代码直接运行GPU是不行的,需要一定的改变,Numba是一个接口,不过本文主要针对CPU下的Python代码加速. Pyth ...

  6. php如何检测键盘按键,js键盘事件,判断按下的是哪个键

    在写页面的时候,尤其是桌面端的时候,我们有时候要知道用户按下了那个按键,对于这个问题我们可以使用js提供的keyCode属性来操作,如: document.onkeydown = function ( ...

  7. 方块 游戏界面java_JAva 判断方块游戏清除方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在一块画布上放类似俄罗斯方块的格子. 若是每一行或是每一列填满了,自动清除. 分三种情况,行满了:清除行 列满了:清除列 同时满了,同时清除: 如果分开写 ...

  8. jquery 判断元素下是不是有子元素

    jquery判断子元素是否存在一.判断子元素是否存在//一级子元素if($("#specialId>img").length==0) if($("#specialI ...

  9. 鼠标滚动时判断向下滚动还是向上滚动

    有时候需要用到,判断页面是向上还是向下滚动了,兼容比较低版本的浏览器如IE6.7等. 原理:拿当前的scrollTop和之前的scrollTop对比  如果变大了,表示向下滚动(scrollTop值变 ...

最新文章

  1. Spring编程式和声明式事务实例讲解
  2. 5G RRC——为NAS层提供连接管理,消息传递等服务; 对接入网的底层协议实体提供参数配置的功能; 负责UE移动性管理相关的测量、控制等功能...
  3. python常用单词汇总_在.txt文件中找到最常用单词的Python程序必须打印word及其连接...
  4. redis sentinel 主从切换(failover)解决方案,详细配置
  5. ImportError: cannot import name HTTPSHandler
  6. UE4学习-场景介绍、基本操作、快捷键
  7. intel服务器最新主板芯片组,intel主板芯片组的介绍
  8. 宁夏警官学院计算机专业,宁夏警官职业学院毕业设计模板.docx
  9. 【Python3爬虫】破解时光网登录加密参数并实现模拟登录
  10. linux变量存储命令,如何将命令存储在shell脚本中的变量中?
  11. 火狐中怎么把xml转换为html,创建兼容IE、火狐、chrome、oprea浏览器的xmlDom对象方法...
  12. C++学习笔记(九)——引用
  13. php怎么访问到外部变量,从外部javascript fi访问PHP var
  14. mysql数据库下载和创建
  15. 金融银行业机器学习—机遇、风险、案例
  16. 小乌龟Git工具使用
  17. Google谷歌搜索引擎镜像入口网址大全导航,谷歌搜索引擎镜像站
  18. 第三次个人作业——关于K米(Andorid)的案例分析
  19. MayaDay1:历史记录和删除历史记录
  20. 10019---CSS Grouping Selectors(分组和嵌套)

热门文章

  1. 问题 S: 【字符串】寻宝之旅
  2. 向任意平面的投影矩阵的推导
  3. 最简单易懂,什么是Node.js
  4. 深入浅出Node.js(上)
  5. 临沂中考计算机试题,初中信息技术教师基本功比赛测试题
  6. 利齿C sharp代替C++(转)
  7. 物联网助推中国农业现代化进程
  8. EMM service request有哪些触发场景和作用?
  9. 新年新形象,2022年试试这么穿
  10. python画五角星没有填色_pycharm运行画五角星程序后,出不来图形