俄罗斯方块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和移动端),而且由于公司业务是全球性的,要支持国外地点搜索.考虑到百度,腾讯,高德等等国内地图无法显示国外数据,谷歌 ...
随机推荐
- mysql记录慢查询
1,配置开启 Linux: 在mysql配置文件my.cnf中增加 log-slow-queries=/var/lib/mysql/slowquery.log (指定日志文件存放位置,可以为空,系统会 ...
- BitNami Redmine Stack
BitNami Redmine Stack 是打包了 Redmine 的一键安装程序包,包括:Apache, MySQL, Ruby On Rails, and Subversion Redmine ...
- 静态化 - 伪静态技术(PHP正则表达式实现)
效果: 代码: <?php // + —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— // + 正则表达式,实 ...
- G - I Think I Need a Houseboat(简单题,粘贴下来是因为数据精度需要注意)
These will be floating point numbers:看这句话,就是说数据会是浮点型的, 问题(一)数据定义成double类型就过了 我当时以为定义成float类型就可以了, 因为 ...
- USACO Milk2 区间合并
这题WA了四次,后来发现不能用所谓的桶排来写 虽然空间上是可以的,但是存在这样一个问题 比如两组数据[15,20]和[21,30] 在20 和 21这两个时刻之间没有milking,但是用桶排的方法写 ...
- 关于jsonp(~~原理和理解)
JSON和JSONP 与XML相比,JSON是一个轻量级的数据交换格式.JSON对于JavaScript开发人员充满魅力的原因在于JSON本身就是Javascript中的对象. 例如一个ticker对 ...
- js词法作用域
作用域链和原型链是JS中比较重要的2个概念, JS的是函数作用域,与C之类语言的块级作用域不同 JS的作用域还是词法作用域,或者叫静态作用域,作用域链是在语法解析时就完成的,而不是在执行时创建. 例子 ...
- 窗体区域绘制问题WS_CLIPCHILDREN与WS_CLIPSIBLINGS
WS_CLIPCHILDREN,使得父窗体在绘制时留出其上的子窗体的位置不去画它,而那片区域留着子窗体去画.WS_CLIPSIBLINGS,必须用于子窗体,使得该子窗体在收到WM_PAINT时同时令其 ...
- 为什么希捷选择了8GB作为标准的闪存容量呢?答案就在下面(新的驱动器可以实现一定程度上的写入缓存)
与前两代Momentus XT产品不同,希捷称第三代混合硬盘所使用的技术更接近真正的SSHD(Solid State Hybrid Disk?),而不是HHD.也就是说更偏向于固态硬盘.首先它不会属于 ...
- Clojure学习01:开始起步
我们先要了解下什么是Clojure,我们从它的特性来了解: 1.首先它是一门编程语言,并且它写的程序是运行在jvm上的,同java语言一样. 2.Clojure代码可以使用任意java类库,反之jav ...