基于Pierre Dellacherie的俄罗斯方块-02小方块

  1. 小方块的定义

  2. 主要是小方块的创造

  3. 小方块的旋转

  4. 获取小方块的数据

  5. 下一个小方块

我这里运用的都是一些简单的方式写的,主要是思路,大家理解就好
#pragma once
#define BLOCK_COL	4
#define BLOCK_ROW	4

#define BLOCK_SHAPE_COUNT	4

typedef unsigned char (*BLOCKDATE)[BLOCK_COL];



class CBlock
{
public:
	CBlock();
	CBlock(const CBlock& Block);
	~CBlock();
	CBlock& operator=(const CBlock& Block);

	//产生方块
	void RandCreateBlock();
	//旋转方块
	void RotateBlock();
	//设置类型
	void SetType(size_t nType);
	//设置shape
	void SetShape(size_t nShape);
	//获取类型
	size_t GetType(size_t nType);
	//设置shape
	size_t GetShape(size_t nShape);
	//获取shape

	const BLOCKDATE GetCurrentBlock()const; //当前图形
	const BLOCKDATE GetNextBlock()const;	//下一个图形

private:
	unsigned char m_aryBlock[BLOCK_ROW][BLOCK_COL] = {};
	size_t m_nCurrentType = 0;
	size_t m_nCurrentShape = 0;

	unsigned char m_aryNextBlock[BLOCK_ROW][BLOCK_COL] = {};
	size_t m_nNextType = 0;
	size_t m_nNextShape = 0;

};


#include "CBlock.h"
#include <memory.h>
#include <time.h>
#include <stdlib.h>

static char g_uchBlocks[][4] = {
	/*
		■■  ■■■■  ■   ■■■   ■■
		■■       ■■■    ■     ■■
	 */
	1, 1, 0, 0,
	1, 1, 0, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	1, 1, 0, 0,
	1, 1, 0, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	1, 1, 0, 0,
	1, 1, 0, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	1, 1, 0, 0,
	1, 1, 0, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	//■■■■
	0, 0, 0, 0,
	1, 1, 1, 1,
	0, 0, 0, 0,
	0, 0, 0, 0,

	0, 1, 0, 0,
	0, 1, 0, 0,
	0, 1, 0, 0,
	0, 1, 0, 0,

	0, 0, 0, 0,
	1, 1, 1, 1,
	0, 0, 0, 0,
	0, 0, 0, 0,

	0, 1, 0, 0,
	0, 1, 0, 0,
	0, 1, 0, 0,
	0, 1, 0, 0,

	//   ■ 
	//  ■■■
	0, 1, 0, 0,
	1, 1, 1, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	0, 1, 0, 0,
	0, 1, 1, 0,
	0, 1, 0, 0,
	0, 0, 0, 0,

	0, 0, 0, 0,
	1, 1, 1, 0,
	0, 1, 0, 0,
	0, 0, 0, 0,

	0, 1, 0, 0,
	1, 1, 0, 0,
	0, 1, 0, 0,
	0, 0, 0, 0,

	//   ■■ 
	//    ■■
	1, 1, 0, 0,
	0, 1, 1, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	0, 0, 1, 0,
	0, 1, 1, 0,
	0, 1, 0, 0,
	0, 0, 0, 0,

	1, 1, 0, 0,
	0, 1, 1, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	0, 0, 1, 0,
	0, 1, 1, 0,
	0, 1, 0, 0,
	0, 0, 0, 0,

	//   ■■ 
	//   ■■
	0, 1, 1, 0,
	1, 1, 0, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	0, 1, 0, 0,
	0, 1, 1, 0,
	0, 0, 1, 0,
	0, 0, 0, 0,

	0, 1, 1, 0,
	1, 1, 0, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	0, 1, 0, 0,
	0, 1, 1, 0,
	0, 0, 1, 0,
	0, 0, 0, 0,

	//   F
	1, 0, 0, 0,
	1, 1, 1, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	0, 1, 1, 0,
	0, 1, 0, 0,
	0, 1, 0, 0,
	0, 0, 0, 0,

	0, 0, 0, 0,
	1, 1, 1, 0,
	0, 0, 1, 0,
	0, 0, 0, 0,

	0, 1, 0, 0,
	0, 1, 0, 0,
	1, 1, 0, 0,
	0, 0, 0, 0,

	//   fan F
	0, 0, 1, 0,
	1, 1, 1, 0,
	0, 0, 0, 0,
	0, 0, 0, 0,

	0, 1, 0, 0,
	0, 1, 0, 0,
	0, 1, 1, 0,
	0, 0, 0, 0,

	0, 0, 0, 0,
	1, 1, 1, 0,
	1, 0, 0, 0,
	0, 0, 0, 0,

	1, 1, 0, 0,
	0, 1, 0, 0,
	0, 1, 0, 0,
	0, 0, 0, 0,

};

CBlock::CBlock()
{
	RandCreateBlock();
	RandCreateBlock();
}

CBlock::CBlock(const CBlock& Block)
{
	*this = Block;
}

CBlock::~CBlock()
{

}

CBlock& CBlock::operator=(const CBlock& Block)
{
	// 当前图形赋值
	m_nCurrentType = Block.m_nCurrentType;
	m_nCurrentShape = Block.m_nCurrentShape;
	memcpy(m_aryBlock, Block.m_aryBlock, sizeof(m_aryBlock));

	//下一个图形复制
	m_nNextType = Block.m_nNextType;
	m_nNextShape = Block.m_nNextShape;
	memcpy(m_aryNextBlock, Block.m_aryNextBlock, sizeof(m_aryNextBlock));
	return *this;
}

//随机产生方块
void CBlock::RandCreateBlock()
{
	m_nCurrentType = m_nNextType;
	m_nCurrentShape = m_nNextShape;
	memcpy(m_aryBlock,m_aryNextBlock , sizeof(m_aryBlock));

	//随机产生一个
	m_nNextType = rand() % (sizeof(g_uchBlocks) / (BLOCK_COL * BLOCK_ROW * BLOCK_SHAPE_COUNT));
	m_nNextShape = rand() % BLOCK_SHAPE_COUNT;
	memcpy(m_aryNextBlock, g_uchBlocks + m_nNextType * (BLOCK_COL * BLOCK_ROW * BLOCK_SHAPE_COUNT) + m_nNextShape * (BLOCK_COL * BLOCK_ROW ), sizeof(m_aryNextBlock));
}

void CBlock::RotateBlock()
{
	m_nCurrentShape = (m_nCurrentShape + 1) % 4;
	memcpy(m_aryBlock, g_uchBlocks + m_nCurrentType * (BLOCK_COL * BLOCK_ROW * BLOCK_SHAPE_COUNT) + m_nCurrentShape * (BLOCK_COL * BLOCK_ROW), sizeof(m_aryBlock));
}

void CBlock::SetType(size_t nType)
{
	m_nCurrentType = nType;
	memcpy(m_aryBlock, g_uchBlocks + m_nCurrentType * (BLOCK_COL * BLOCK_ROW * BLOCK_SHAPE_COUNT) + m_nCurrentShape * (BLOCK_COL * BLOCK_ROW), sizeof(m_aryBlock));
}

void CBlock::SetShape(size_t nShape)
{
	m_nCurrentShape = nShape;
	memcpy(m_aryBlock, g_uchBlocks + m_nCurrentType * (BLOCK_COL * BLOCK_ROW * BLOCK_SHAPE_COUNT) + m_nCurrentShape * (BLOCK_COL * BLOCK_ROW), sizeof(m_aryBlock));
}

size_t CBlock::GetType(size_t nType)
{
	return m_nCurrentType;
}

size_t CBlock::GetShape(size_t nShape)
{
	return m_nCurrentShape;
}

const BLOCKDATE CBlock::GetCurrentBlock() const
{
	return BLOCKDATE(m_aryBlock);
}

const BLOCKDATE CBlock::GetNextBlock() const
{
	return BLOCKDATE(m_aryNextBlock);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值