⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamewnd.c

📁 俄罗斯方块的整套源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (disCounter > 0)
	{
		// 先对disY[]从小到大排序
		for (i = 0; i < disCounter; i++)
		{
			for (j = i + 1; j < disCounter; j++)
			{
				if (disY[i] > disY[j])
				{
					x = disY[i];
					disY[i] = disY[j];
					disY[j] = x;
				}
			}
		}

		// 将被消除行之上的方块移动到合适的位置
		for (i = 0; i < disCounter; i++)
		{
			for (j = disY[i] + 1; j < disY[i + 1]; j++)
			{
				// 将第j行下移i+1行
				MEMCPY(	pthis->m_pContainerData + ((j - i - 1) * pthis->m_nContainerWidth), 
						pthis->m_pContainerData + (j * pthis->m_nContainerWidth), 
						pthis->m_nContainerWidth);
			}
		}
		// 将剩余的行数全部下移disCounter行
		MEMCPY(	pthis->m_pContainerData + (disY[disCounter - 1] + 1 - disCounter) * pthis->m_nContainerWidth,
				pthis->m_pContainerData + (disY[disCounter - 1] + 1) * pthis->m_nContainerWidth, 
				pthis->m_nContainerWidth * (pthis->m_nContainerHeight - disY[disCounter - 1] - 1));
		// 将下移后留出的空位清空
		MEMSET(	pthis->m_pContainerData + (pthis->m_nContainerHeight - disCounter) * pthis->m_nContainerWidth, 
				0, 
				disCounter * pthis->m_nContainerWidth);
	}
	
	return disCounter;
}

void GameWnd_DefineBlock(GameWnd* pthis)
{
	/* 7种活动块的初始化
	 * 记录其相对坐标
	 */
	// ----------------------------------------------------------------------
	// 第一套方块
	// ----------------------------------------------------------------------
	/*第1种: 
	*/
	DefineBlock(eBlockType_LINE, eDir_DOWN, 0, 0, -1);
	DefineBlock(eBlockType_LINE, eDir_DOWN, 1, 0, 0);
	DefineBlock(eBlockType_LINE, eDir_DOWN, 2, 0, 1);
	DefineBlock(eBlockType_LINE, eDir_DOWN, 3, 0, 2);
	/*第2种: □□
	*/
	DefineBlock(eBlockType_L, eDir_DOWN, 0, -1, 0);
	DefineBlock(eBlockType_L, eDir_DOWN, 1, 0, 0);
	DefineBlock(eBlockType_L, eDir_DOWN, 2, 0, 1);
	DefineBlock(eBlockType_L, eDir_DOWN, 3, 0, 2);
	/*第3种: □□
	*/
	DefineBlock(eBlockType_MIRRORL, eDir_DOWN, 0, 0, 0);
	DefineBlock(eBlockType_MIRRORL, eDir_DOWN, 1, 1, 0);
	DefineBlock(eBlockType_MIRRORL, eDir_DOWN, 2, 0, 1);
	DefineBlock(eBlockType_MIRRORL, eDir_DOWN, 3, 0, 2);
	/*第4种: □□
	           □□           */
	DefineBlock(eBlockType_Z, eDir_DOWN, 0, -1, -1);
	DefineBlock(eBlockType_Z, eDir_DOWN, 1, 0, -1);
	DefineBlock(eBlockType_Z, eDir_DOWN, 2, 0, 0);
	DefineBlock(eBlockType_Z, eDir_DOWN, 3, 1, 0);
	/*第5种:     □□
	           □□           */
	DefineBlock(eBlockType_MIRRORZ, eDir_DOWN, 0, -1, 0);
	DefineBlock(eBlockType_MIRRORZ, eDir_DOWN, 1, 0, 0);
	DefineBlock(eBlockType_MIRRORZ, eDir_DOWN, 2, 0, -1);
	DefineBlock(eBlockType_MIRRORZ, eDir_DOWN, 3, 1, -1);
	/*第6种: □□
	         □□
	*/
	DefineBlock(eBlockType_SQUARE, eDir_DOWN, 0, 0, 0);
	DefineBlock(eBlockType_SQUARE, eDir_DOWN, 1, 1, 0);
	DefineBlock(eBlockType_SQUARE, eDir_DOWN, 2, 0, 1);
	DefineBlock(eBlockType_SQUARE, eDir_DOWN, 3, 1, 1);
	/*第7种:   □
	         □□□
	*/
	DefineBlock(eBlockType_T, eDir_DOWN, 0, 0, -1);
	DefineBlock(eBlockType_T, eDir_DOWN, 1, -1, 0);
	DefineBlock(eBlockType_T, eDir_DOWN, 2, 0, 0);
	DefineBlock(eBlockType_T, eDir_DOWN, 3, 1, 0);

	//////////////////////////////////////////////////////////////////////////
	//第2套方块的特征矩阵
	//////////////////////////////////////////////////////////////////////////
	/*	1:
	    □□□□
	*/
	DefineBlock(eBlockType_LINE, eDir_RIGHT, 0, -2, 0);
	DefineBlock(eBlockType_LINE, eDir_RIGHT, 1, -1, 0);
	DefineBlock(eBlockType_LINE, eDir_RIGHT, 2, 0, 0);
	DefineBlock(eBlockType_LINE, eDir_RIGHT, 3, 1, 0);
	/*  2:
	  □□□
	*/
	DefineBlock(eBlockType_L, eDir_RIGHT, 0, 0, -1);
	DefineBlock(eBlockType_L, eDir_RIGHT, 1, -2, 0);
	DefineBlock(eBlockType_L, eDir_RIGHT, 2, -1, 0);
	DefineBlock(eBlockType_L, eDir_RIGHT, 3, 0, 0);
	/*  3:
		□□□
	*/
	DefineBlock(eBlockType_MIRRORL, eDir_RIGHT, 0, -2, 0);
	DefineBlock(eBlockType_MIRRORL, eDir_RIGHT, 1, -1, 0);
	DefineBlock(eBlockType_MIRRORL, eDir_RIGHT, 2, 0, 0);
	DefineBlock(eBlockType_MIRRORL, eDir_RIGHT, 3, 0, 1);
	/* 4:
		□□
	*/
	DefineBlock(eBlockType_Z, eDir_RIGHT, 0, 1, -1);
	DefineBlock(eBlockType_Z, eDir_RIGHT, 1, 1, 0);
	DefineBlock(eBlockType_Z, eDir_RIGHT, 2, 0, 0);
	DefineBlock(eBlockType_Z, eDir_RIGHT, 3, 0, 1);
	/*  5:
		□□
	*/
	DefineBlock(eBlockType_MIRRORZ, eDir_RIGHT, 0, 0, -1);
	DefineBlock(eBlockType_MIRRORZ, eDir_RIGHT, 1, 0, 0);
	DefineBlock(eBlockType_MIRRORZ, eDir_RIGHT, 2, 1, 0);
	DefineBlock(eBlockType_MIRRORZ, eDir_RIGHT, 3, 1, 1);
	/*  6:
	    □□
		□□
	*/
	DefineBlock(eBlockType_SQUARE, eDir_RIGHT, 0, 0, 0);
	DefineBlock(eBlockType_SQUARE, eDir_RIGHT, 1, 1, 0);
	DefineBlock(eBlockType_SQUARE, eDir_RIGHT, 2, 0, 1);
	DefineBlock(eBlockType_SQUARE, eDir_RIGHT, 3, 1, 1);
	/*  7:
		□□
	*/
	DefineBlock(eBlockType_T, eDir_RIGHT, 0, 0, -1);
	DefineBlock(eBlockType_T, eDir_RIGHT, 1, 0, 0);
	DefineBlock(eBlockType_T, eDir_RIGHT, 2, 1, 0);
	DefineBlock(eBlockType_T, eDir_RIGHT, 3, 0, 1);

	//////////////////////////////////////////////////////////////////////////
	//第3套方块
	//////////////////////////////////////////////////////////////////////////
	/*  1: 
	*/
	DefineBlock(eBlockType_LINE, eDir_UP, 0, 0, -1);
	DefineBlock(eBlockType_LINE, eDir_UP, 1, 0, 0);
	DefineBlock(eBlockType_LINE, eDir_UP, 2, 0, 1);
	DefineBlock(eBlockType_LINE, eDir_UP, 3, 0, 2);
	/*  2:
			□□
	*/
	DefineBlock(eBlockType_L, eDir_UP, 0, 0, -2);
	DefineBlock(eBlockType_L, eDir_UP, 1, 0, -1);
	DefineBlock(eBlockType_L, eDir_UP, 2, 0, 0);
	DefineBlock(eBlockType_L, eDir_UP, 3, 1, 0);
	/*  3:
         □□
	*/
	DefineBlock(eBlockType_MIRRORL, eDir_UP, 0, 0, -2);
	DefineBlock(eBlockType_MIRRORL, eDir_UP, 1, 0, -1);
	DefineBlock(eBlockType_MIRRORL, eDir_UP, 2, 0, 0);
	DefineBlock(eBlockType_MIRRORL, eDir_UP, 3, -1, 0);
	/*4: 
			□□
	          □□           */
	DefineBlock(eBlockType_Z, eDir_UP, 0, -1, -1);
	DefineBlock(eBlockType_Z, eDir_UP, 1, 0, -1);
	DefineBlock(eBlockType_Z, eDir_UP, 2, 0, 0);
	DefineBlock(eBlockType_Z, eDir_UP, 3, 1, 0);
	/*5:     
				 □□
	           □□           */
	DefineBlock(eBlockType_MIRRORZ, eDir_UP, 0, -1, 0);
	DefineBlock(eBlockType_MIRRORZ, eDir_UP, 1, 0, 0);
	DefineBlock(eBlockType_MIRRORZ, eDir_UP, 2, 0, -1);
	DefineBlock(eBlockType_MIRRORZ, eDir_UP, 3, 1, -1);
	/*6: 
			 □□
	         □□
	*/
	DefineBlock(eBlockType_SQUARE, eDir_UP, 0, 0, 0);
	DefineBlock(eBlockType_SQUARE, eDir_UP, 1, 1, 0);
	DefineBlock(eBlockType_SQUARE, eDir_UP, 2, 0, 1);
	DefineBlock(eBlockType_SQUARE, eDir_UP, 3, 1, 1);
	/*    7:
			□□□
	*/
	DefineBlock(eBlockType_T, eDir_UP, 0, -1, 0);
	DefineBlock(eBlockType_T, eDir_UP, 1, 0, 0);
	DefineBlock(eBlockType_T, eDir_UP, 2, 1, 0);
	DefineBlock(eBlockType_T, eDir_UP, 3, 0, 1);

	//////////////////////////////////////////////////////////////////////////
	//第4套:方块
	//////////////////////////////////////////////////////////////////////////
	/*	1:
	    □□□□
	*/
	DefineBlock(eBlockType_LINE, eDir_LEFT, 0, -2, 0);
	DefineBlock(eBlockType_LINE, eDir_LEFT, 1, -1, 0);
	DefineBlock(eBlockType_LINE, eDir_LEFT, 2, 0, 0);
	DefineBlock(eBlockType_LINE, eDir_LEFT, 3, 1, 0);
	/* 2:
	      □□□
	*/
	DefineBlock(eBlockType_L, eDir_LEFT, 0, 0, 0);
	DefineBlock(eBlockType_L, eDir_LEFT, 1, 1, 0);
	DefineBlock(eBlockType_L, eDir_LEFT, 2, 2, 0);
	DefineBlock(eBlockType_L, eDir_LEFT, 3, 0, 1);
	/*   3:
			□□□
	*/
	DefineBlock(eBlockType_MIRRORL, eDir_LEFT, 0, 0, -1);
	DefineBlock(eBlockType_MIRRORL, eDir_LEFT, 1, 0, 0);
	DefineBlock(eBlockType_MIRRORL, eDir_LEFT, 2, 1, 0);
	DefineBlock(eBlockType_MIRRORL, eDir_LEFT, 3, 2, 0);
	/* 4:
		□□
	*/
	DefineBlock(eBlockType_Z, eDir_LEFT, 0, 0, -1);
	DefineBlock(eBlockType_Z, eDir_LEFT, 1, 0, 0);
	DefineBlock(eBlockType_Z, eDir_LEFT, 2, -1, 0);
	DefineBlock(eBlockType_Z, eDir_LEFT, 3, -1, 1);
	/*  5:
		□□
	*/
	DefineBlock(eBlockType_MIRRORZ, eDir_LEFT, 0, 0, -1);
	DefineBlock(eBlockType_MIRRORZ, eDir_LEFT, 1, 0, 0);
	DefineBlock(eBlockType_MIRRORZ, eDir_LEFT, 2, 1, 0);
	DefineBlock(eBlockType_MIRRORZ, eDir_LEFT, 3, 1, 1);
	/*  6:
	    □□
		□□
	*/
	DefineBlock(eBlockType_SQUARE, eDir_LEFT, 0, 0, 0);
	DefineBlock(eBlockType_SQUARE, eDir_LEFT, 1, 1, 0);
	DefineBlock(eBlockType_SQUARE, eDir_LEFT, 2, 0, 1);
	DefineBlock(eBlockType_SQUARE, eDir_LEFT, 3, 1, 1);
	/*   7:
              □□
	*/
	DefineBlock(eBlockType_T, eDir_LEFT, 0, 0, -1);
	DefineBlock(eBlockType_T, eDir_LEFT, 1, 0, 0);
	DefineBlock(eBlockType_T, eDir_LEFT, 2, 0, 1);
	DefineBlock(eBlockType_T, eDir_LEFT, 3, -1, 0);
	//4套方块定义结束
	//////////////////////////////////////////////////////////////////////////

}

#ifdef ENABLE_MUSIC

void GameWnd_CreateMusic(GameWnd *pthis)
{
	if (pthis->m_pBgSound)
		GameWnd_ReleaseMusic(pthis);

	if (pthis->m_bMusicOn)
	{
		// 创建音乐接口
		pthis->m_BgSndData.dwSize = 0;
		pthis->m_BgSndData.clsData = MMD_FILE_NAME;
		pthis->m_BgSndData.pData = MIDI_FILE;
		ISHELL_CreateInstance(pthis->pMe->a.m_pIShell, AEECLSID_MEDIAMIDI,(void**)&pthis->m_pBgSound);
		IMEDIA_SetMediaData(pthis->m_pBgSound, &pthis->m_BgSndData);
	}
}

void GameWnd_PlayMusic(GameWnd *pthis)
{
	if (pthis->m_bMusicOn)
	{
		// 播放音乐啦
		pthis->m_bMute = FALSE;
		IMEDIA_Play(pthis->m_pBgSound);
		IMEDIA_RegisterNotify(pthis->m_pBgSound,(PFNMEDIANOTIFY)GameWnd_PlaySoundCB, pthis);
	}
}

void GameWnd_ReleaseMusic(GameWnd *pthis)
{
	if (pthis->m_pBgSound)
	{
		IMEDIA_Release(pthis->m_pBgSound);
		pthis->m_pBgSound = NULL;
	}
}

void GameWnd_CloseMusic(GameWnd *pthis)
{
	pthis->m_bMute = TRUE;
	if (pthis->m_pBgSound)
	{
		IMEDIA_Stop(pthis->m_pBgSound);
	}
}

void GameWnd_PlaySoundCB(GameWnd* pthis, AEEMediaCmdNotify* pMedia)
{
	//DBGPRINTF("%d",pMedia->nCmd);
	//DBGPRINTF("%d",pMedia->nStatus);
	if(pthis->m_pBgSound != NULL && pthis->m_bMusicOn && pthis->m_bMute == FALSE)
	{
		if(pMedia->nCmd == MM_CMD_PLAY && (pMedia->nStatus == MM_STATUS_DONE || pMedia->nStatus == MM_STATUS_ABORT))
		{
			IMEDIA_Play(pMedia->pIMedia);
		}
	}
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -