俄罗斯方块SDK版
前言
本来可以从俄罗斯方块控制台版改一版, 将UI接口换掉, 变成SDK版.
正好放假了, 有时间.
就用了一个星期来重头做一个新版, 享受一下静下心来, 有条不紊干活的感觉^_^
这个工程用来验证SDK编程中对消息循环, UI绘制, 局部刷新的理解.
做这么个东西, 以自己为用户, 玩起来还是挺耐玩.
完全靠4个箭头键实现左移, 右移, 旋转, 下落, 消行或固定
考虑到自己智商比较挫, 没有加自动落下的实现. 毕竟每个人都不喜欢输的感觉.
如果真是全心投入, 如果输了, 应该能总结出输的原因 : "做人心不能贪, 不能眼高手低, 如果有问题, 要立即解决, 不要指望时来运转".
反正输了之后, 能总结的失败原因能总结出来一堆.
正宗方块的资料
UI预览
工程下载
工程预览
- CTetrominoData m_TetrominoData[TETROMINODATA_ARY_SIZE];
- void CRussiaBlock::TetrominoDataInit() {
- /// I型(方向0,90,180,270)
- m_TetrominoData[0] = CTetrominoDataI0();
- m_TetrominoData[1] = CTetrominoDataI90();
- m_TetrominoData[2] = CTetrominoDataI180();
- m_TetrominoData[3] = CTetrominoDataI270();
- m_TetrominoData[0].SetRotateL(&m_TetrominoData[3]);
- m_TetrominoData[0].SetRotateR(&m_TetrominoData[1]);
- m_TetrominoData[1].SetRotateL(&m_TetrominoData[0]);
- m_TetrominoData[1].SetRotateR(&m_TetrominoData[2]);
- m_TetrominoData[2].SetRotateL(&m_TetrominoData[1]);
- m_TetrominoData[2].SetRotateR(&m_TetrominoData[3]);
- m_TetrominoData[3].SetRotateL(&m_TetrominoData[2]);
- m_TetrominoData[3].SetRotateR(&m_TetrominoData[0]);
- /// O型(方向0,90,180,270)
- m_TetrominoData[4] = CTetrominoDataO0();
- m_TetrominoData[5] = CTetrominoDataO90();
- m_TetrominoData[6] = CTetrominoDataO180();
- m_TetrominoData[7] = CTetrominoDataO270();
- m_TetrominoData[4].SetRotateL(&m_TetrominoData[7]);
- m_TetrominoData[4].SetRotateR(&m_TetrominoData[5]);
- m_TetrominoData[5].SetRotateL(&m_TetrominoData[4]);
- m_TetrominoData[5].SetRotateR(&m_TetrominoData[6]);
- m_TetrominoData[6].SetRotateL(&m_TetrominoData[4]);
- m_TetrominoData[6].SetRotateR(&m_TetrominoData[7]);
- m_TetrominoData[7].SetRotateL(&m_TetrominoData[6]);
- m_TetrominoData[7].SetRotateR(&m_TetrominoData[4]);
- /// T型(方向0,90,180,270)
- m_TetrominoData[8] = CTetrominoDataT0();
- m_TetrominoData[9] = CTetrominoDataT90();
- m_TetrominoData[10] = CTetrominoDataT180();
- m_TetrominoData[11] = CTetrominoDataT270();
- m_TetrominoData[8].SetRotateL(&m_TetrominoData[11]);
- m_TetrominoData[8].SetRotateR(&m_TetrominoData[9]);
- m_TetrominoData[9].SetRotateL(&m_TetrominoData[8]);
- m_TetrominoData[9].SetRotateR(&m_TetrominoData[10]);
- m_TetrominoData[10].SetRotateL(&m_TetrominoData[9]);
- m_TetrominoData[10].SetRotateR(&m_TetrominoData[11]);
- m_TetrominoData[11].SetRotateL(&m_TetrominoData[10]);
- m_TetrominoData[11].SetRotateR(&m_TetrominoData[8]);
- /// J型(方向0,90,180,270)
- m_TetrominoData[12] = CTetrominoDataJ0();
- m_TetrominoData[13] = CTetrominoDataJ90();
- m_TetrominoData[14] = CTetrominoDataJ180();
- m_TetrominoData[15] = CTetrominoDataJ270();
- m_TetrominoData[12].SetRotateL(&m_TetrominoData[15]);
- m_TetrominoData[12].SetRotateR(&m_TetrominoData[13]);
- m_TetrominoData[13].SetRotateL(&m_TetrominoData[12]);
- m_TetrominoData[13].SetRotateR(&m_TetrominoData[14]);
- m_TetrominoData[14].SetRotateL(&m_TetrominoData[13]);
- m_TetrominoData[14].SetRotateR(&m_TetrominoData[15]);
- m_TetrominoData[15].SetRotateL(&m_TetrominoData[14]);
- m_TetrominoData[15].SetRotateR(&m_TetrominoData[12]);
- /// L型(方向0,90,180,270)
- m_TetrominoData[16] = CTetrominoDataL0();
- m_TetrominoData[17] = CTetrominoDataL90();
- m_TetrominoData[18] = CTetrominoDataL180();
- m_TetrominoData[19] = CTetrominoDataL270();
- m_TetrominoData[16].SetRotateL(&m_TetrominoData[19]);
- m_TetrominoData[16].SetRotateR(&m_TetrominoData[17]);
- m_TetrominoData[17].SetRotateL(&m_TetrominoData[16]);
- m_TetrominoData[17].SetRotateR(&m_TetrominoData[18]);
- m_TetrominoData[18].SetRotateL(&m_TetrominoData[17]);
- m_TetrominoData[18].SetRotateR(&m_TetrominoData[19]);
- m_TetrominoData[19].SetRotateL(&m_TetrominoData[18]);
- m_TetrominoData[19].SetRotateR(&m_TetrominoData[16]);
- /// S型(方向0,90,180,270)
- m_TetrominoData[20] = CTetrominoDataS0();
- m_TetrominoData[21] = CTetrominoDataS90();
- m_TetrominoData[22] = CTetrominoDataS180();
- m_TetrominoData[23] = CTetrominoDataS270();
- m_TetrominoData[20].SetRotateL(&m_TetrominoData[23]);
- m_TetrominoData[20].SetRotateR(&m_TetrominoData[21]);
- m_TetrominoData[21].SetRotateL(&m_TetrominoData[20]);
- m_TetrominoData[21].SetRotateR(&m_TetrominoData[22]);
- m_TetrominoData[22].SetRotateL(&m_TetrominoData[21]);
- m_TetrominoData[22].SetRotateR(&m_TetrominoData[23]);
- m_TetrominoData[23].SetRotateL(&m_TetrominoData[22]);
- m_TetrominoData[23].SetRotateR(&m_TetrominoData[20]);
- /// Z型(方向0,90,180,270)
- m_TetrominoData[24] = CTetrominoDataZ0();
- m_TetrominoData[25] = CTetrominoDataZ90();
- m_TetrominoData[26] = CTetrominoDataZ180();
- m_TetrominoData[27] = CTetrominoDataZ270();
- m_TetrominoData[24].SetRotateL(&m_TetrominoData[27]);
- m_TetrominoData[24].SetRotateR(&m_TetrominoData[25]);
- m_TetrominoData[25].SetRotateL(&m_TetrominoData[24]);
- m_TetrominoData[25].SetRotateR(&m_TetrominoData[26]);
- m_TetrominoData[26].SetRotateL(&m_TetrominoData[25]);
- m_TetrominoData[26].SetRotateR(&m_TetrominoData[27]);
- m_TetrominoData[27].SetRotateL(&m_TetrominoData[26]);
- m_TetrominoData[27].SetRotateR(&m_TetrominoData[24]);
- }
骨牌数据类
- // TetrominoData.h: interface for the CTetrominoData class.
- //
- //////////////////////////////////////////////////////////////////////
- #if !defined(AFX_TETROMINODATA_H__B5414B4A_2708_4A07_AD1D_7AAB52962115__INCLUDED_)
- #define AFX_TETROMINODATA_H__B5414B4A_2708_4A07_AD1D_7AAB52962115__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- #include "common.h"
- class CTetrominoData
- {
- public:
- CTetrominoData();
- virtual ~CTetrominoData();
- void SetColor(COLORREF color) {m_color = color;}
- COLORREF GetColor() {return m_color;}
- void SetData(BYTE uc0, BYTE uc1, BYTE uc2, BYTE uc3,
- BYTE uc4, BYTE uc5, BYTE uc6, BYTE uc7,
- BYTE uc8, BYTE uc9, BYTE uc10, BYTE uc11,
- BYTE uc12, BYTE uc13, BYTE uc14, BYTE uc15);
- BYTE operator [](int iIndex);
- void SetRotateL(CTetrominoData* pIn) {m_RotateL = pIn;}
- void SetRotateR(CTetrominoData* pIn) {m_RotateR = pIn;}
- CTetrominoData* GetRotateL() {return m_RotateL;}
- CTetrominoData* GetRotateR() {return m_RotateR;}
- int GetDataRows(); ///< 得到数据行数, 从左上角到最下面的有数据的行数
- int GetDataCols(); ///< 得到数据列数, 从左上角到最右面的有数据的列数
- private:
- COLORREF m_color;
- BYTE m_ucData[16];
- CTetrominoData* m_RotateL; ///< 向左转是哪个骨牌
- CTetrominoData* m_RotateR; ///< 向右转是哪个骨牌
- };
- #endif // !defined(AFX_TETROMINODATA_H__B5414B4A_2708_4A07_AD1D_7AAB52962115__INCLUDED_)
- // TetrominoData.cpp: implementation of the CTetrominoData class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "TetrominoData.h"
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CTetrominoData::CTetrominoData()
- {
- ZeroMemory(m_ucData, (sizeof(m_ucData) / sizeof(m_ucData[0])));
- m_color = RGB(0, 0, 0);
- }
- CTetrominoData::~CTetrominoData()
- {
- }
- void CTetrominoData::SetData(BYTE uc0, BYTE uc1, BYTE uc2, BYTE uc3,
- BYTE uc4, BYTE uc5, BYTE uc6, BYTE uc7,
- BYTE uc8, BYTE uc9, BYTE uc10, BYTE uc11,
- BYTE uc12, BYTE uc13, BYTE uc14, BYTE uc15) {
- m_ucData[0] = uc0;
- m_ucData[1] = uc1;
- m_ucData[2] = uc2;
- m_ucData[3] = uc3;
- m_ucData[4] = uc4;
- m_ucData[5] = uc5;
- m_ucData[6] = uc6;
- m_ucData[7] = uc7;
- m_ucData[8] = uc8;
- m_ucData[9] = uc9;
- m_ucData[10] = uc10;
- m_ucData[11] = uc11;
- m_ucData[12] = uc12;
- m_ucData[13] = uc13;
- m_ucData[14] = uc14;
- m_ucData[15] = uc15;
- }
- int CTetrominoData::GetDataRows() {
- if ((0 != m_ucData[12])
- || (0 != m_ucData[13])
- || (0 != m_ucData[14])
- || (0 != m_ucData[15])) {
- return 4;
- } else if ((0 != m_ucData[8])
- || (0 != m_ucData[9])
- || (0 != m_ucData[10])
- || (0 != m_ucData[11])) {
- return 3;
- } else if ((0 != m_ucData[4])
- || (0 != m_ucData[5])
- || (0 != m_ucData[6])
- || (0 != m_ucData[7])) {
- return 2;
- } else if ((0 != m_ucData[3])
- || (0 != m_ucData[2])
- || (0 != m_ucData[1])
- || (0 != m_ucData[0])) {
- return 1;
- }
- return 0;
- }
- int CTetrominoData::GetDataCols() {
- if ((0 != m_ucData[3])
- || (0 != m_ucData[7])
- || (0 != m_ucData[11])
- || (0 != m_ucData[15])) {
- return 4;
- } else if ((0 != m_ucData[2])
- || (0 != m_ucData[6])
- || (0 != m_ucData[10])
- || (0 != m_ucData[14])) {
- return 3;
- } else if ((0 != m_ucData[1])
- || (0 != m_ucData[5])
- || (0 != m_ucData[9])
- || (0 != m_ucData[13])) {
- return 2;
- } else if ((0 != m_ucData[0])
- || (0 != m_ucData[4])
- || (0 != m_ucData[8])
- || (0 != m_ucData[12])) {
- return 1;
- }
- return 0;
- }
- BYTE CTetrominoData::operator [](int iIndex) {
- BOOL bValid = (iIndex >= 0) && (iIndex < (sizeof(m_ucData) / sizeof(m_ucData[0])));
- return bValid ? m_ucData[iIndex] : m_ucData[0];
- }
- // TetrominoDataS0.h: interface for the CTetrominoDataS0 class.
- //
- //////////////////////////////////////////////////////////////////////
- #if !defined(AFX_TetrominoDataS0_H__D23B94A8_C1F2_44A4_9ACD_2B934A82F86A__INCLUDED_)
- #define AFX_TetrominoDataS0_H__D23B94A8_C1F2_44A4_9ACD_2B934A82F86A__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- #include "TetrominoData.h"
- class CTetrominoDataS0 : public CTetrominoData
- {
- public:
- CTetrominoDataS0();
- virtual ~CTetrominoDataS0();
- };
- #endif // !defined(AFX_TetrominoDataS0_H__D23B94A8_C1F2_44A4_9ACD_2B934A82F86A__INCLUDED_)
- // TetrominoDataS90.h: interface for the CTetrominoDataS90 class.
- //
- //////////////////////////////////////////////////////////////////////
- #if !defined(AFX_TetrominoDataS90_H__4157546E_E5CA_4624_B8A5_63AE11EBCD5C__INCLUDED_)
- #define AFX_TetrominoDataS90_H__4157546E_E5CA_4624_B8A5_63AE11EBCD5C__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- #include "TetrominoDataS0.h"
- class CTetrominoDataS90 : public CTetrominoDataS0
- {
- public:
- CTetrominoDataS90();
- virtual ~CTetrominoDataS90();
- };
- #endif // !defined(AFX_TetrominoDataS90_H__4157546E_E5CA_4624_B8A5_63AE11EBCD5C__INCLUDED_)
- // TetrominoDataS180.h: interface for the CTetrominoDataS180 class.
- //
- //////////////////////////////////////////////////////////////////////
- #if !defined(AFX_TetrominoDataS180_H__FC5200AC_B7CC_4291_AE86_3C2E983BD4C9__INCLUDED_)
- #define AFX_TetrominoDataS180_H__FC5200AC_B7CC_4291_AE86_3C2E983BD4C9__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- #include "TetrominoDataS0.h"
- class CTetrominoDataS180 : public CTetrominoDataS0
- {
- public:
- CTetrominoDataS180();
- virtual ~CTetrominoDataS180();
- };
- #endif // !defined(AFX_TetrominoDataS180_H__FC5200AC_B7CC_4291_AE86_3C2E983BD4C9__INCLUDED_)
- // TetrominoDataS270.h: interface for the CTetrominoDataS270 class.
- //
- //////////////////////////////////////////////////////////////////////
- #if !defined(AFX_TetrominoDataS270_H__4DDC72B7_219B_4E7B_8573_EA98D82CD754__INCLUDED_)
- #define AFX_TetrominoDataS270_H__4DDC72B7_219B_4E7B_8573_EA98D82CD754__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- #include "TetrominoDataS90.h"
- class CTetrominoDataS270 : public CTetrominoDataS90
- {
- public:
- CTetrominoDataS270();
- virtual ~CTetrominoDataS270();
- };
- #endif // !defined(AFX_TetrominoDataS270_H__4DDC72B7_219B_4E7B_8573_EA98D82CD754__INCLUDED_)
- // TetrominoDataS0.cpp: implementation of the CTetrominoDataS0 class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "TetrominoDataS0.h"
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CTetrominoDataS0::CTetrominoDataS0()
- {
- SetColor(RGB(10, 249, 10));
- SetData(
- 0, 1, 1, 0,
- 1, 1, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0);
- }
- CTetrominoDataS0::~CTetrominoDataS0()
- {
- }
- // TetrominoDataS90.cpp: implementation of the CTetrominoDataS90 class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "TetrominoDataS90.h"
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CTetrominoDataS90::CTetrominoDataS90()
- {
- SetData(
- 1, 0, 0, 0,
- 1, 1, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 0, 0);
- }
- CTetrominoDataS90::~CTetrominoDataS90()
- {
- }
- // TetrominoDataS180.cpp: implementation of the CTetrominoDataS180 class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "TetrominoDataS180.h"
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CTetrominoDataS180::CTetrominoDataS180()
- {
- SetData(
- 0, 1, 1, 0,
- 1, 1, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0);
- }
- CTetrominoDataS180::~CTetrominoDataS180()
- {
- }
- // TetrominoDataS270.cpp: implementation of the CTetrominoDataS270 class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "TetrominoDataS270.h"
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CTetrominoDataS270::CTetrominoDataS270()
- {
- SetData(
- 1, 0, 0, 0,
- 1, 1, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 0, 0);
- }
- CTetrominoDataS270::~CTetrominoDataS270()
- {
- }
http://blog.csdn.net/lostspeed/article/details/50643208
俄罗斯方块SDK版的更多相关文章
- Pascal小游戏 俄罗斯方块怀旧版
俄罗斯方块怀旧版(注释版) {$APPTYPE GUI}{$MODE DELPHI}program WinPiece; usesWindows; constAppName = 'WinPiece';p ...
- python tkinter实现俄罗斯方块 基础版
本项目最终效果见本人b站投稿av81480858 简介部分 本项目最终代码已上传github: https://github.com/BigShuang/Tetris 的1_BASIC文件夹 .其中1 ...
- 俄罗斯方块C#版
using System; using System.Windows.Forms; using System.Drawing; using System.Media; class me : Form ...
- android studio 编译sdk版降低报错解决方法
解决办法如下: 步骤1:在gradle中修改 compile sdk 版本,比如 8. 步骤2:在gradle中删除v7包的依赖 步骤3:在manifest中修改theme,supportsRtl.t ...
- 俄罗斯方块 UWP 版
UWP跟 WPF编程模型一致,不过UWP做了精简,而且不同的系统的API还略有不同.不同的地方有以下几点: 1.动画.动画除了故事版,还有其它的实现方式. 2.异步方法.UWP中的方法调用,大部分都是 ...
- .NET+MVC+Alipay的Sdk版单笔转账到支付宝账户接口
public class AliPayController : Controller { // GET: AliPay public ActionResult Index() { return Red ...
- 转-android 支付宝SDK集成
http://blog.csdn.net/kroclin/article/details/40746779 一.前言 最近做的项目刚好要集成支付宝,上网找了很多资料,介绍得感觉不是很全面,所以我经过这 ...
- 分析Cocos2d-x横版ACT手游源 1、登录
我自己的游戏代码 因为 游戏源 盯着外面的 我们能够能够理解 /******************************************************************** ...
- 必应地图api文档,微软必应地图web开发版详解,可以在国内使用国外地图
最近,公司项目要求在页面中嵌入地图,需求还算简单,但是由于必须具备响应式(主要是pc和移动端),而且由于公司业务是全球性的,要支持国外地点搜索.考虑到百度,腾讯,高德等等国内地图无法显示国外数据,谷歌 ...
随机推荐
- 11427 - Expect the Expected(概率期望)
11427 - Expect the Expected Some mathematical background. This problem asks you to compute the expec ...
- Ajax学习(三)——XMLHttpRequest对象的五步使使用方法
Ajax的核心技术是XMLHttpRequest对象,它能够在不向server提交整个页面的情况下.实现局部更新网页.通过这个对象,Ajax能够像桌面应用程序那样仅仅与server进行数据层的 ...
- 【Oracle】ORA-01722:无效数字(控制文件最后一个字段)
原因: 每一行物理数据最后都存在一个换行符. 如果integer或者number类型的字段位于控制文件的最后,最后其实都会有CR/LF的换行符,在用sqlldr导入时会把换行符也算作那个数字的一部分, ...
- C#_会员管理系统:开发四(日志查看)
新建一个日志查看窗体: 日志需要的登录时间和登录状态信息由用户刚登录程序时就提供,所以在登录窗体(VIPLogin.cs)中添加代码: //定义一个全局变量 Uid; //用于获取登录成功后的用户名 ...
- CentOS 6.5上安装MySQL-Cluster
参考博文: CentOS 6.2下MySQL Cluster 7.2 配置数据库集群 CentOS 6.5上安装MySQL-Cluster 7.3.4过程笔记--下一步学习 MySQL Cluster ...
- 花海漫步 NOI模拟题
题目好像难以看懂? 题目大意 给出一个字符串\(S\),统计满足以下条件的\((i,j,p,q)\)的数量. \(i \leq j, p \leq q\) \(S[i..j],S[p..q]\)是回文 ...
- [cocos2d-x]针对不同的设备,选取不同的自适应图片
前言: 我们在进行移动设备开发的时候,我们常常会准备不同大小的图片资源以适应不同大小的设备,下面我称普清图片资源和高清图片资源.那么如何做到图片资源的自适应呢?下面我来用一个demo展示一下这个效果的 ...
- [置顶] 深入ResourceBundle
ResourceBundle是java开发中非常实用的一个类,主要用来处理应用程序多语言这样的国际化问题. 如果你的应用程序如果有国际化的需求,可以考虑使用ResourceBundle, 你要做的就是 ...
- C# 使用PictureBox控件--点击切换图片
效果: 1. 2. 代码: private Boolean fals = true; /// <summary> /// 单击事件 /// </summary> /// < ...
- 无法启动outlook mapi
office2013 管理员权限,在命令行中定位到office15文件夹,然后运行命令"outlook /importprf ..prf"