/*
* Copyright (c) https://2694048168.github.io
* FileName main.c
* Author 黎为
* Description 主函数作为程序的入口
*/
/*
* 用C语言实现Win32程序,完成俄罗斯方块游戏程序
* 1、窗口创建
* 初始化窗口类
* 注册、创建、显示窗口
* 消息循环、回调函数
*
* 2、游戏业务逻辑实现
* 二维数组布局
*
* 3、游戏结束
*
* 4、音乐媒体播放器
*/
#include <windows.h>
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define DEF_TIMER1 1234 // 定时器
int g_iSqareID = -1;
int g_iLine = -1;
int g_iList = -1;
int g_iScore = 0;
// 回调函数
LRESULT CALLBACK PELouSi(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);
// 绘制函数
void OnPaint(HDC hDc);
// 初始化数据
void onCreate();
// 背景数组
char g_arrBackGroud[20][10] = {0};
// 随机方块
char g_arrSqare[2][4] = {0};
// 显示方块
void PaintSqare(HDC hMemDC);
// 随机方块产生
int CreateRandomSqare();
// 随机方块贴到背景
void CopySqareToBack();
// Enter回车按键处理函数
void OnReturn(HWND hWnd);
// 方块下落
void SqareDown();
// 定时器响应函数
void OnTime(HWND hWnd);
// 方块停止在最底部 0不可以落,1可以落
int CanSqareDown();
// 方块停止在最底部,不覆盖其他方块,而是重叠 0不可以落,1可以落
int CanSqareDown2();
// 方块是否能够左移,边界判断,0不可以左移,1可以左移
int CanSqareLeft();
// 方块是否能够左移,边界左有方块情况判断,0不可以左移,1可以左移
int CanSqareLeft2();
// 方块是否能够右移,边界判断,0不可以左移,1可以左移
int CanSqareRight();
// 方块是否能够右移,边界左有方块情况判断,0不可以左移,1可以左移
int CanSqareRight2();
// 1 to 2 停止标志
void Change1To2();
// 显示2的情况方块,停止时
void ShowSqare2(HDC hMemDC);
// 左移动消息
void OnLeft(HWND hWnd);
// 右移动消息
void OnRight(HWND hWnd);
// 方块左移
void SqareLeft();
// 方块右移
void SqareRight();
// 向下加速消息
void OnDown(HWND hWnd);
// 向上变型
void OnChangeSqare(HWND hWnd);
// 一般形状变型
void ChangeSqare();
// 一般形状方块能否变型条件判断
int CanSqareChangeShape();
// 长方形变型
void ChangeLineSqare();
// 长方形方块能否变型条件判断
int CanLineSqareChangeShape();
// 消除一行方块
void DestroyOneLineSqare();
// 显示积分
void ShowScore(HDC hMemDC);
// TODO 游戏结束失败
int CanGameOver();
// WINAPI 调用约定 _stdcall 参数的入栈顺序,栈空间的清理者
// 参数1,句柄:一个数,是窗口的唯一标识
// 参数2,前一个句柄:同一个窗口同时打开多个
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR IpCmdLine, int nCmdShow)
{
// 初始化窗口类
WNDCLASSEX wc; // WNDCLASS
HWND hWnd; // 窗口句柄
MSG msg; // 消息结构体
wc.cbClsExtra = 0;
wc.cbSize = sizeof(WNDCLASSEX);
wc.cbClsExtra = 0;
wc.hbrBackground = (HBRUSH)COLOR_INFOTEXT; // 背景颜色
wc.hCursor = LoadCursor(NULL,IDC_ARROW); // TODO 加载系统光标,可以自定义光标图片
//wc.hIcon = LoadIcon(hInstance,HAKEINTRESOURCE(IDI_ICON)); // TODO 可以自定义加载图标
wc.hIcon = LoadIcon(NULL,IDI_INFORMATION); // TODO 加载系统图标,可以自定义加载图标
wc.hIconSm = NULL; // NULL 默认与Icon一致
wc.hInstance = hInstance;
wc.lpfnWndProc = PELouSi; // 回调函数地址
wc.lpszClassName = "els"; //窗口类名字,操作系统看的
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
// 注册窗口
if (0 == RegisterClassEx(&wc))
{
// 注册出错
//int a = GetLastError();
//printf("窗口注册出错,出错码为:%d",a);
return 0;
}
// 创建窗口
hWnd = CreateWindowEx(WS_EX_TOPMOST,"els","俄罗斯方块",WS_OVERLAPPEDWINDOW,100,100,500,650,NULL,NULL,hInstance,NULL);
if (NULL == hWnd)// 窗口句柄
{
return 0;
}
// 显示窗口
ShowWindow(hWnd,SW_SHOWNORMAL);// nCmdShow
// 播放音乐
// 需要在编译器中自己连接库文件libwinmm.a,是编译器自带的静态库文件,在链接器中加入
mciSendString((LPCSTR)"open .\\music.mp3 alias mymusic", NULL, 0, NULL);
mciSendString((LPCSTR)"play mymusic", NULL, 0, NULL);
// 消息循环
while (GetMessage(&msg,NULL,0,0))// 循环获取消息队列的消息
{
// 翻译消息
TranslateMessage(&msg);
// 分发消息:标准消息、命令消息、通知消息、自定义消息
DispatchMessage(&msg);
}
return 0;
}
// 回调函数
LRESULT CALLBACK PELouSi(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT pt;
HDC hDc;
switch (nMsg)
{
// 回调函数第一次调用,只产生一次
case WM_CREATE:
// 用于数据初始化,什么都没有,编译器会优化处理
//GetLastError(); // 调试用的,编译器不会优化
onCreate();
break;
case WM_TIMER:
// TODO Enter按键定时器产生消息
// 定时器响应函数
OnTime(hWnd);
break;
// 回调函数第二次调用,窗口更新(重新绘制)
case WM_PAINT:
// 比如窗口拉大缩小变化重绘
hDc = BeginPaint(hWnd,&pt); // getDc,窗口可操作区域标识
// 绘制开始
OnPaint(hDc);
EndPaint(hWnd,&pt);
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_RETURN:
// Enter回车按键处理函数
OnReturn(hWnd);
break;
case VK_LEFT:
// 左移动
OnLeft(hWnd);
break;
case VK_RIGHT:
// 右移动
OnRight(hWnd);
break;
case VK_UP:
// 向上变型
OnChangeSqare(hWnd);
break;
case VK_DOWN:
// 向下加速
OnDown(hWnd);
break;
}
break;
// 退出程序窗口
case WM_DESTROY:
// 关闭定时器
KillTimer(hWnd,DEF_TIMER1);
PostQuitMessage(0); // WM_CLOSE, WM_DESTROY, WM_QUIT
break;
}
return DefWindowProc(hWnd, nMsg, wParam, lParam); //
}
// 绘制函数
void OnPaint(HDC hDc)
{
// 创建兼容性DC-ID编号
HDC hMemDC = CreateCompatibleDC(hDc);
// 创建一张画纸-位图
HBITMAP hBitmapBack = CreateCompatibleBitmap(hDc,500,600);
// 关联ID编号与画纸位图
SelectObject(hMemDC,hBitmapBack);
// 显示方块
PaintSqare(hMemDC);
ShowSqare2(hMemDC);//停止时显示方块
// 显示积分
ShowScore(hMemDC);
// 传递图片 从内存dc传递到窗口
BitBlt(hDc,0,0,500,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;
int j = 0;
HBRUSH hOldBrush;//原来画刷
HBRUSH hNewBrush;//新画刷
// 大方块背景
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;*/
// 画刷颜色,给方块涂色
hNewBrush = CreateSolidBrush(RGB(63,191,49));
hOldBrush = (HBRUSH)SelectObject(hMemDC,hNewBrush);

FPGA与信号处理
- 粉丝: 1011
最新资源
- 网络安全(PPT36页)(1).ppt
- 论借助sniffer诊断Linux网络故障.docx
- 商务英语教学中网络的地位.doc
- 在市打击治理电信网络新型违法犯罪联席会议上表态发言三篇.doc
- 2023年大学计算机基础期末考试知识点.doc
- 系统安全预测技术.pptx
- 企业信息化建设的重要性和状况.docx
- 遥感数字图像处理考题整理.doc
- 高校师生同上一堂网络安全课观后感心得感悟5篇.docx
- 企业集团财务结算中心与计算机系统设计与会计操作.doc
- 电话网络系统方案.doc
- 九上下册物理第三节:广播-电视和移动通信公开课教案教学设计课件测试卷练习卷课时同步训练练习公开课教案.ppt
- 图像处理:十一表示描述.ppt
- 什么网站工作总结写的比较好.docx
- 项目管理与招标采购培训重点课程.doc
- 有关信息化银行对账问题的探讨【会计实务操作教程】.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


