Tetris API参考及相关规则说明
2012-05-19 19:52
357 查看
1:Play入口函数
Server每次产生一个方块后,都会调用该dll的play方法作为入口执行。
因此,实际上只要完成void play()函数的实现即可。
2:必备的api接口
为了完成play()的逻辑,至少需要通过以下几个必备api接口:
l 获取我方当前20*10的matrix的第iRow行iCol列是否含有砖块 //true有 false没有
bool api_getMatrixInfo(uint uiRow, uint uiCol);
l 获取当前到来的block的编号 //返回值: 0-6,由服务器保证
uint api_getCurrBlock();
l 设定如何落下当前的方块
void api_addStepMethod(uint uiRotate, uint uiCol);
l 打日志
void api_log(constchar* fmt, ...); //和printf用法相同
3:样例
4:扩展的api接口
为了更好地完成play()的逻辑,可以通过以下几个扩展api接口:
l 获取对方当前20*10的matrix的第iRow行iCol列是否含有砖块//true有 false没有
bool api_getMatrixInfoOppo(uint uiRow, uint uiCol);
一般用不着,除非想分析对方的行为
l 获取即将到来的block的编号//返回值: 0-6,由服务器保证
uint api_getNextBlock();
如果你的程序不仅想分析当前将到来的方块,还想分析下一个方块,就需要这个接口
l 设定如何落下当前的方块(高级)
voidapi_addStepMethod(uint uiRotate, uint uiCol, uint uiDown);
原函数是:voidapi_addStepMethod(uint uiRotate, uint uiCol);将当前block旋转iRotate后,置入iCol列,自然下降;
它多了一个uiDown参数。而多了uiDown参数,语义就变成了:将当前block旋转iRotate后,置入iCol列,下降iDown格(不再是自然下降!)
如果你的程序想让方块落下的过程中可以左拐和右拐中转一下,就需要这个接口了。
l 打日志(高级)
void api_log_without_logheader(const char* fmt, ...);
api_log总是会输出一个行的头部,有个别的场景下,你只想输出一个字符不想有头部,就需要这个接口了。
5:关于Matrix
Matrix就是一个20行,10列的容器,所有的方块都要落入到该容器中。涉及Matrix的函数有api_getMatrixInfo和api_getMatrixInfoOppo
注意,C/C++都是自0计数的,因此Matrix最上方的Row=0,最下方Row=19(不是20!!)
Matrix最左侧的Column=0, Matrix最右侧的Column=9(不是10!!)
6:关于Block
Block就是下降的大方块,每个大方块都是由4个小方块组成。
Block一共有7种
每种Block都有4种旋转状态。分别为Rotate = 0/1/2/3
当然,对于有的方块而言,旋转状态是一样的。例如正方块,等。
某Block在Matrix某一列下降,是指该Block的最左侧从Matrix的该列下降。
因此,一个方块往往在col=8,col=9的时候就不能下落的,因此block自身具有宽度。一旦下落,直接判负。
l Block=0: 就是正方形方块,因为像英文字母O,所以也叫BLOCK_O
#define BLOCK_O 0// rotate=0 rotate=1 rotate=2 rotate=3
// |** | |** | |** | |** |
// |** | |** | |** | |** |
// | | | | | | | |
// | | | | | | | |
l Block=1: 就是长竖条,因为像英文字母I,所以也叫BLOCK_I
#define BLOCK_I 1// rotate=0 rotate=1 rotate=2 rotate=3
// |* | |****| |* | |****|
// |* | | | |* | | |
// |* | | | |* | | |
// |* | | | |* | | |
l Block=2: 就是三叉路口状的方块,因为像英文字母T,所以也叫BLOCK_T
#define BLOCK_T 2// rotate=0 rotate=1 rotate=2 rotate=3
// |*** | | * | | * | |* |
// | * | |** | |*** | |** |
// | | | * | | | |* |
// | | | | | | | |
l Block=3: 就是拐棍的方块,因为像英文字母L,所以也叫BLOCK_L
#define BLOCK_L 3// rotate=0 rotate=1 rotate=2 rotate=3
// |* | |*** | |** | | * |
// |* | |* | | * | |*** |
// |** | | | | * | | |
// | | | | | | | |
l Block=4: 就是拐棍的方块(与BLOCK_L对称),因为像英文字母L,所以也叫BLOCK_L
#define BLOCK_J 4// rotate=0 rotate=1 rotate=2 rotate=3
// | * | |* | |** | |*** |
// | * | |*** | |* | | * |
// |** | | | |* | | |
// | | | | | | | |
l Block=5: 因为像英文字母Z,所以也叫BLOCK_Z
#define BLOCK_Z 5// rotate=0 rotate=1 rotate=2 rotate=3
// |** | |* | |** | | * |
// | ** | |** | | ** | |** |
// | | |* | | | |* |
// | | | | | | | |
l Block=6: 因为像英文字母S,所以也叫BLOCK_S
#define BLOCK_S 6// rotate=0 rotate=1 rotate=2 rotate=3
// | ** | |* | | ** | |* |
// |** | |** | |** | |** |
// | | | * | | | | * |
// | | | | | | | |
6:关于Round
Server执行时,最小粒度是Round(轮次)。
每个Round开始时,Server都是产生一个新的Block。
每个Round内,Server调用且只调用一次dll的play方法。
dll的play方法内,只能完成当前容器局面(Matrix)下的决策。当调用api_addStepMethod时,server并不会立即使block下降,而是在play函数退出后统一处理。
7:进攻
Tetris并非是比双方是否能消除最多的行。因为在对战规则中,当一方一次性消除多行时,将会对对方形成“进攻”,即对方增行。(从最下方“顶上去”一些交错的方块)
注意上面的感叹号,就是被顶上去的部分。
这个感叹号也是普通的方块,你大可以后续把它消除掉。
Server每次产生一个方块后,都会调用该dll的play方法作为入口执行。
因此,实际上只要完成void play()函数的实现即可。
2:必备的api接口
为了完成play()的逻辑,至少需要通过以下几个必备api接口:
l 获取我方当前20*10的matrix的第iRow行iCol列是否含有砖块 //true有 false没有
bool api_getMatrixInfo(uint uiRow, uint uiCol);
l 获取当前到来的block的编号 //返回值: 0-6,由服务器保证
uint api_getCurrBlock();
l 设定如何落下当前的方块
void api_addStepMethod(uint uiRotate, uint uiCol);
l 打日志
void api_log(constchar* fmt, ...); //和printf用法相同
3:样例
void play() { //初始化二维数组 bool m[MAX_ROW][MAX_COL]; for (uint uiRow = 0; uiRow < MAX_ROW; uiRow++) { for (uint uiCol = 0; uiCol < MAX_COL; uiCol++) { m[uiRow][uiCol]=api_getMatrixInfo(uiRow, uiCol); } } //获取当前的方块编号 uint uiBlock = api_getCurrBlock(); //设定策略 uint uiRotate = 2; uint uiCol = 3; api_addStepMethod(uiRotate, uiCol); //打日志 api_log("i send my method: Rotate=%u, Col=%u\n", uiRotate, uiCol); return; } |
为了更好地完成play()的逻辑,可以通过以下几个扩展api接口:
l 获取对方当前20*10的matrix的第iRow行iCol列是否含有砖块//true有 false没有
bool api_getMatrixInfoOppo(uint uiRow, uint uiCol);
一般用不着,除非想分析对方的行为
l 获取即将到来的block的编号//返回值: 0-6,由服务器保证
uint api_getNextBlock();
如果你的程序不仅想分析当前将到来的方块,还想分析下一个方块,就需要这个接口
l 设定如何落下当前的方块(高级)
voidapi_addStepMethod(uint uiRotate, uint uiCol, uint uiDown);
原函数是:voidapi_addStepMethod(uint uiRotate, uint uiCol);将当前block旋转iRotate后,置入iCol列,自然下降;
它多了一个uiDown参数。而多了uiDown参数,语义就变成了:将当前block旋转iRotate后,置入iCol列,下降iDown格(不再是自然下降!)
如果你的程序想让方块落下的过程中可以左拐和右拐中转一下,就需要这个接口了。
l 打日志(高级)
void api_log_without_logheader(const char* fmt, ...);
api_log总是会输出一个行的头部,有个别的场景下,你只想输出一个字符不想有头部,就需要这个接口了。
5:关于Matrix
Matrix就是一个20行,10列的容器,所有的方块都要落入到该容器中。涉及Matrix的函数有api_getMatrixInfo和api_getMatrixInfoOppo
注意,C/C++都是自0计数的,因此Matrix最上方的Row=0,最下方Row=19(不是20!!)
Matrix最左侧的Column=0, Matrix最右侧的Column=9(不是10!!)
6:关于Block
Block就是下降的大方块,每个大方块都是由4个小方块组成。
Block一共有7种
每种Block都有4种旋转状态。分别为Rotate = 0/1/2/3
当然,对于有的方块而言,旋转状态是一样的。例如正方块,等。
某Block在Matrix某一列下降,是指该Block的最左侧从Matrix的该列下降。
因此,一个方块往往在col=8,col=9的时候就不能下落的,因此block自身具有宽度。一旦下落,直接判负。
l Block=0: 就是正方形方块,因为像英文字母O,所以也叫BLOCK_O
#define BLOCK_O 0// rotate=0 rotate=1 rotate=2 rotate=3
// |** | |** | |** | |** |
// |** | |** | |** | |** |
// | | | | | | | |
// | | | | | | | |
l Block=1: 就是长竖条,因为像英文字母I,所以也叫BLOCK_I
#define BLOCK_I 1// rotate=0 rotate=1 rotate=2 rotate=3
// |* | |****| |* | |****|
// |* | | | |* | | |
// |* | | | |* | | |
// |* | | | |* | | |
l Block=2: 就是三叉路口状的方块,因为像英文字母T,所以也叫BLOCK_T
#define BLOCK_T 2// rotate=0 rotate=1 rotate=2 rotate=3
// |*** | | * | | * | |* |
// | * | |** | |*** | |** |
// | | | * | | | |* |
// | | | | | | | |
l Block=3: 就是拐棍的方块,因为像英文字母L,所以也叫BLOCK_L
#define BLOCK_L 3// rotate=0 rotate=1 rotate=2 rotate=3
// |* | |*** | |** | | * |
// |* | |* | | * | |*** |
// |** | | | | * | | |
// | | | | | | | |
l Block=4: 就是拐棍的方块(与BLOCK_L对称),因为像英文字母L,所以也叫BLOCK_L
#define BLOCK_J 4// rotate=0 rotate=1 rotate=2 rotate=3
// | * | |* | |** | |*** |
// | * | |*** | |* | | * |
// |** | | | |* | | |
// | | | | | | | |
l Block=5: 因为像英文字母Z,所以也叫BLOCK_Z
#define BLOCK_Z 5// rotate=0 rotate=1 rotate=2 rotate=3
// |** | |* | |** | | * |
// | ** | |** | | ** | |** |
// | | |* | | | |* |
// | | | | | | | |
l Block=6: 因为像英文字母S,所以也叫BLOCK_S
#define BLOCK_S 6// rotate=0 rotate=1 rotate=2 rotate=3
// | ** | |* | | ** | |* |
// |** | |** | |** | |** |
// | | | * | | | | * |
// | | | | | | | |
6:关于Round
Server执行时,最小粒度是Round(轮次)。
每个Round开始时,Server都是产生一个新的Block。
每个Round内,Server调用且只调用一次dll的play方法。
dll的play方法内,只能完成当前容器局面(Matrix)下的决策。当调用api_addStepMethod时,server并不会立即使block下降,而是在play函数退出后统一处理。
7:进攻
Tetris并非是比双方是否能消除最多的行。因为在对战规则中,当一方一次性消除多行时,将会对对方形成“进攻”,即对方增行。(从最下方“顶上去”一些交错的方块)
被顶之前 | 被顶之后 |
------------ | | | | | | | | | | | | | | | | | | | ++ * | | ++* *** | |********* | ------------ | ------------ | | | | | | | | | | | | | | | | |++ ** * | |++*** *** | |********* | | ! ! ! ! !| ------------ |
这个感叹号也是普通的方块,你大可以后续把它消除掉。
相关文章推荐
- InternetOpen\InternetOpenUrl\InternetReadFile 等相关Win32 网络API 使用详细说明
- InternetOpen/InternetOpenUrl/InternetReadFile 等相关Win32 网络API 使用详细说明
- 关于小程序中网络相关API的说明
- InternetOpen\InternetOpenUrl\InternetReadFile 等相关Win32 网络API 使用详细说明
- 大维团购导航API采集规则详细说明(单城市,多城市)
- InternetOpen\InternetOpenUrl\InternetReadFile 等相关Win32 网络API 使用详细说明
- InternetOpen\InternetOpenUrl\InternetReadFile 等相关Win32 网络API 使用详细说明
- windows磁盘相关API实践说明
- C#中使用API(SHFileOperation)进行文件操作,特别说明了回收站相关参数
- 【转帖】InternetOpen\InternetOpenUrl\InternetReadFile 等相关Win32 网络API 使用详细说明
- InternetOpen\InternetOpenUrl\InternetReadFile 等相关Win32 网络API 使用详细说明
- Windows 剪切板相关API说明
- BroadcastReceiver广播相关API和说明
- PhysicsBody相关API说明
- 相关Win32 网络API 使用详细说明
- 关于PHP-Zend framework2 框架 学习过程。 阅前须知: ZF2中的配置文件是可以静态文件配置来注册和通过相关函数动态注册。 1.EventManager(事件驱动),关于事件驱动,在ZF2相关资料没有详细说明,可以参考ANDROID的事件驱动,MFC的消息响应/事件驱动。
- SOCKET相关API说明
- windows VC USB开发相关的api说明
- VB读写INI文件的四个函数以及相关API详细说明
- InternetOpen/InternetOpenUrl/InternetReadFile 等相关Win32 网络API 使用详细说明