?? skyblue_rectview.cpp
字號:
GameStatus[xx4][yy4] = MAP_STATE_NOT_EMPTY;
InvalidateCurrent();
//改變形狀代碼
m_currentRect = m_lscurrentRect;
}
else
{//恢復原來狀態
GameStatus[x1][y1] = MAP_STATE_NOT_EMPTY;
GameStatus[x2][y2] = MAP_STATE_NOT_EMPTY;
GameStatus[x3][y3] = MAP_STATE_NOT_EMPTY;
GameStatus[x4][y4] = MAP_STATE_NOT_EMPTY;
}
//判斷是否已到底
IsBottom();
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內部函數:游戲開始
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
void CSkyblue_RectView::OnGameStart()
{
if (!m_bGamePaush) //如果不是游戲暫停狀態,則必須作些初始工作
{
m_bGameEnd = FALSE;
//總分值清零, 并顯示總分記分牌
m_iPerformance = 0;
//顯示當前的區域及游戲級別的漢字描述
CurrentAreaAndLevel();
// CRect rect(m_iStartY, m_iStartX, m_iStartY+110, m_iStartX+370);
// InvalidateRect(&rect);
}
m_bGamePaush = FALSE;
SetTimer(1,1500-250*m_iLevel,NULL);
}
//游戲暫停
void CSkyblue_RectView::OnGamePaush()
{
m_bGamePaush = TRUE;
KillTimer(1);
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內部函數:游戲結束
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
void CSkyblue_RectView::OnGameEnd()
{
m_bGameEnd = TRUE;
// m_bGamePaush = FALSE; //清除游戲暫停狀態
int i,j;
for (i=0;i<m_iRow;i++)
for (j=0;j<m_iCol;j++)
GameStatus[i][j]=0;
CRect rect(m_iStartY, m_iStartX, m_iStartY+440, m_iStartX+370);
InvalidateRect(&rect);
m_bGamePaush = FALSE; //清除游戲暫停狀態
KillTimer(1);
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內部函數:刷新當前的區域
*
* 只刷新需要刷新的四個小方塊區域,防止屏幕抖動情況發生
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
void CSkyblue_RectView::InvalidateCurrent()
{
int i;
// for (i=0;i<4;i++)
// {
// CRect rect(m_iStartX+ActiveStatus[i][1]*m_iLarge,
// m_iStartY+ActiveStatus[i][0]*m_iLarge,
// m_iStartX+(ActiveStatus[i][1]+1)*m_iLarge+5,
// m_iStartY+(ActiveStatus[i][0]+1)*m_iLarge);
// InvalidateRect(&rect);
Invalidate(FALSE);
// }
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內部函數:游戲設置
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
void CSkyblue_RectView::OnGameOption()
{
//參數順序: 區域大小代碼:0-3,分別為:12X10,18X15,24X20,m_iLargeX25
//級別:0-5,分別為:1500,1200,1000,800,600,400
//背景音樂:TRUE 或者 FALSE
int m_lsArea;
switch(m_iRow)
{
case 12:
m_lsArea = 0;
break;
case 18:
m_lsArea = 1;
break;
case 24:
m_lsArea = 2;
break;
case 30:
m_lsArea = 3;
break;
}
COptionDlg dlg(m_lsArea,m_iLevel,m_iBlockSytle,m_bMusic,m_bDrawGrid);
if (dlg.DoModal()==IDOK)
{
//確定區域的大小
switch(dlg.m_iArea)
{
case 0:
m_iRow = 12;
m_iCol = 10;
m_iLarge = 30;
break;
case 1:
m_iRow = 18;
m_iCol = 15;
m_iLarge = 20;
break;
case 2:
m_iRow = 24;
m_iCol = 20;
m_iLarge = 15;
break;
case 3:
m_iRow = 30;
m_iCol = 25;
m_iLarge = 12;
break;
}
//確定級別
m_iLevel = dlg.m_iLevel;
//選擇的樣式
m_iBlockSytle = dlg.m_iBlockStyle;
//確定是否繪網格背景
m_bDrawGrid = dlg.m_bDrawGrid;
//檢查是否插放音樂
m_bMusic = dlg.m_bMusic;
if (m_bMusic)
PlayMid();
else
StopMid();
Invalidate();
}
}
//用于生成當前區域大小與級別所對應的漢字描述
void CSkyblue_RectView::CurrentAreaAndLevel()
{
switch(m_iRow)
{
case 12:
m_strArea = "12行10列"; break;
case 18:
m_strArea = "18行15列"; break;
case 24:
m_strArea = "24行20列"; break;
case 30:
m_strArea = "30行25列"; break;
}
switch(m_iLevel)
{
case 0:
m_strLevel = "第一級: 入門級"; break;
case 1:
m_strLevel = "第二級: 初級級"; break;
case 2:
m_strLevel = "第三級: 中級"; break;
case 3:
m_strLevel = "第四級: 中高級"; break;
case 4:
m_strLevel = "第五級: 高級"; break;
case 5:
m_strLevel = "第六級: 頂級"; break;
}
}
/* * * * * * * * * * * * * * * * * * * * * *
* 內部函數:以下為菜單屏蔽與開啟控制
*
* 最后修改日期:2005.8.6
* * * * * * * * * * * * * * * * * * * * * */
//如果游戲開始,則此[開始游戲]按鈕被屏蔽
void CSkyblue_RectView::OnUpdateGameStart(CCmdUI* pCmdUI)
{
if (m_bGameEnd || m_bGamePaush)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
//如果游戲開始,則此[游戲設置]按鈕被屏蔽
void CSkyblue_RectView::OnUpdateGameOption(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
//如游戲開始,則[游戲暫停]按鈕開啟
void CSkyblue_RectView::OnUpdateGamePaush(CCmdUI* pCmdUI)
{
if (!m_bGameEnd)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
//如果游戲開始,則此[游戲結束]按鈕被開啟
void CSkyblue_RectView::OnUpdateGameEnd(CCmdUI* pCmdUI)
{
if (!m_bGameEnd)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
//如果游戲開始,則此[退出系統]按鈕被屏蔽
void CSkyblue_RectView::OnUpdateGameExit(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
//如果游戲開始,則此[關于]按鈕被屏蔽
void CSkyblue_RectView::OnUpdateHelpAbout(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
//如果游戲開始,則此[幫助]按鈕被屏蔽
void CSkyblue_RectView::OnUpdateHelpHelp(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(FALSE);
}
void CSkyblue_RectView::OnHelpHelp()
{
}
//用菜單設置區域大小
void CSkyblue_RectView::OnUpdateOptionArea1(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iRow==12)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnUpdateOptionArea2(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iRow==18)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnUpdateOptionArea3(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iRow==24)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnUpdateOptionArea4(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iRow==30)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
//用菜單設置區域大小
void CSkyblue_RectView::OnOptionArea1()
{
m_iRow = 12;
m_iCol = 10;
m_iLarge = 30;
Invalidate();
}
void CSkyblue_RectView::OnOptionArea2()
{
m_iRow = 18;
m_iCol = 15;
m_iLarge = 20;
Invalidate();
}
void CSkyblue_RectView::OnOptionArea3()
{
m_iRow = 24;
m_iCol = 20;
m_iLarge = 15;
Invalidate();
}
void CSkyblue_RectView::OnOptionArea4()
{
m_iRow = 30;
m_iCol = 25;
m_iLarge = 12;
Invalidate();
}
// 用菜單設置游戲級別
void CSkyblue_RectView::OnUpdateOptionLevel1(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iLevel == 0)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnUpdateOptionLevel2(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iLevel == 1)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnUpdateOptionLevel3(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iLevel == 2)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnUpdateOptionLevel4(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iLevel == 3)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnUpdateOptionLevel5(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iLevel == 4)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnUpdateOptionLevel6(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_iLevel == 5)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
//用菜單設置游戲級別
void CSkyblue_RectView::OnOptionLevel1()
{
m_iLevel = 0;
}
void CSkyblue_RectView::OnOptionLevel2()
{
m_iLevel = 1;
}
void CSkyblue_RectView::OnOptionLevel3()
{
m_iLevel = 2;
}
void CSkyblue_RectView::OnOptionLevel4()
{
m_iLevel = 3;
}
void CSkyblue_RectView::OnOptionLevel5()
{
m_iLevel = 4;
}
void CSkyblue_RectView::OnOptionLevel6()
{
m_iLevel = 5;
}
//用菜單設置是否有網格
void CSkyblue_RectView::OnUpdateOptionGrid(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_bDrawGrid)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnOptionGrid()
{
if (m_bDrawGrid)
m_bDrawGrid = FALSE;
else
m_bDrawGrid = TRUE;
Invalidate();
}
//
//插放背景音樂, 所有錯誤忽略
//
void CSkyblue_RectView::PlayMid()
{
HWND hWnd;
hWnd = GetSafeHwnd();
//分配命令字符串緩沖,錯誤信息儲存緩沖,播放的文件名
char szCmdBuf[300],errBuf[60],szfileName[255];
//錯誤碼
MCIERROR mciError;
//初始化設備元素
strcpy(szfileName,"skyblue_rect.mid");
//初始化命令字符串
wsprintf( szCmdBuf,"open %s type sequencer alias bkMusic",szfileName);
//打開設備
mciError = mciSendString( szCmdBuf, errBuf, sizeof(errBuf), NULL);
if (mciError == 0)
{//如果打開成功則播放
mciError = mciSendString("play bkMusic notify",NULL,0, hWnd);
//根據播放操作是否成功決定是否關閉設備
if (mciError != 0)
mciSendString("close bkMusic",NULL,0,NULL);
}
}
//
//終止插放背景音樂
//
void CSkyblue_RectView::StopMid()
{
//關閉設備
mciSendString("close bkMusic",NULL,0,NULL);
}
//用菜單設置是否插放音樂
void CSkyblue_RectView::OnUpdateOptionMusic(CCmdUI* pCmdUI)
{
if (m_bGameEnd)
pCmdUI -> Enable(TRUE);
else
pCmdUI -> Enable(FALSE);
if (m_bMusic)
pCmdUI -> SetCheck(TRUE);
else
pCmdUI -> SetCheck(FALSE);
}
void CSkyblue_RectView::OnOptionMusic()
{
if (m_bMusic)
{
m_bMusic = FALSE;
StopMid();
}
else
{
m_bMusic = TRUE;
PlayMid();
}
}
void CSkyblue_RectView::OnGameExit()
{
//清理內存設備環境,釋放資源
DCEnvClear();
}
void CSkyblue_RectView::OnHelpAbout()
{
HWND hwnd = ::AfxGetMainWnd()->GetSafeHwnd();
ShellAbout(hwnd,"俄羅斯方塊 作者:skyblue 風中解碼","E-mail:skyblue@yahoo.com.cn",NULL);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -