📄 llkdlg.cpp
字号:
}
void CLlkDlg::ReadFile() //读取最高分
{
CFile file;
file.Open(_T("\\record.txt"), CFile::modeRead, NULL);
file.Read(&m_lPoint, sizeof(m_lPoint));
m_strBox.Format(_T("%d"), m_lPoint);
file.Close();
}
void CLlkDlg::ReleasePicPlace(int x, int y) //消去位图链表
{
int nIndex = GetPicIndex(x, y);
LPCJL_PATH pPic = PIC_PLACE[nIndex];
LPCJL_PATH pPrev = NULL;
while (pPic)
{
if ((pPic->x == x) && (pPic->y == y))
{
if (pPrev)
pPrev->prev = pPic->prev;
else
PIC_PLACE[nIndex]= pPic->prev;
GlobalFree(pPic);
return;
}
pPrev = pPic;
pPic = pPic->prev;
}
}
void CLlkDlg::ReleasePlace() //消去位图数组值
{
LPCJL_PATH pPic = NULL;
LPCJL_PATH pPrev = NULL;
for (int i = 0; i <= 28; i++)
{
pPic = PIC_PLACE[i];
while (pPic)
{
pPrev = pPic->prev;
GlobalFree(pPic);
pPic = pPrev;
}
}
}
void CLlkDlg::SelButton(CDC *pDC) //绘“选项”按扭
{
CDC Mydc1,Mydc2;
CBitmap Button,ButtonDown;
Button.LoadBitmap(IDB_BUTTON);
ButtonDown.LoadBitmap(IDB_BUTTON_DOWN);
Mydc1.CreateCompatibleDC(pDC);
Mydc1.SelectObject(&Button);
Mydc2.CreateCompatibleDC(pDC);
Mydc2.SelectObject(&ButtonDown);
if (m_bSel)
{
pDC->BitBlt(418,18,48,25,&Mydc2,0,0,SRCCOPY);
}
else
{
pDC->BitBlt(418,18,48,25,&Mydc1,0,0,SRCCOPY);
}
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
CFont *pOldFont,*font;
font = new CFont;
font->CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE,0,0,0,0,0,0, _T("Arial"));
pOldFont = (CFont*)pDC->SelectObject(font);
if (m_nLanguage == 0)
pDC->DrawText(_T("SELE"), CRect(418,20,466,43), DT_CENTER);
if (m_nLanguage == 1)
pDC->DrawText(_T("选项"), CRect(418,20,466,43), DT_CENTER);
if (m_nButton == 3) //绘选择框
{
CPen pen( PS_SOLID ,3,RGB(167,241,243));
CPen *pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(419, 18);
pDC->LineTo(419, 43);
pDC->MoveTo(419,41);
pDC->LineTo(464, 41);
pDC->MoveTo(464,43);
pDC->LineTo(464, 18);
pDC->MoveTo(464,19);
pDC->LineTo(419, 19);
pOldPen->DeleteObject();
}
Mydc2.DeleteDC();
pOldFont->DeleteObject();
font->DeleteObject();
delete font;
Mydc1.DeleteDC();
Button.DeleteObject();
ButtonDown.DeleteObject();
}
void CLlkDlg::SetInGame(BOOL bInGame) //设置是否游戏
{
m_bInGame = bInGame;
}
void CLlkDlg::SetLeft(int nLeft) //设置剩余牌数
{
m_nLeft = nLeft;
}
void CLlkDlg::SetLevel(int nNewLevel) //关卡设置
{
m_nLevel = nNewLevel;
}
void CLlkDlg::SetPause(BOOL bPause) //暂停设置
{
m_bPause = bPause;
}
void CLlkDlg::SetPicIndex(int x, int y, int nIndex) //设置位图坐标
{
int index = GetPicIndex(x, y);
int nVal = GetValue(x, y);
CJL_MAP[x][y] = nVal - index + nIndex;
}
void CLlkDlg::SetPos(float nPos) //设置时间条当前位置
{
m_nPos = nPos;
}
void CLlkDlg::SetValue(int x, int y, int nNewValue) //设置坐标值
{
CJL_MAP[x][y] = nNewValue;
}
void CLlkDlg::ShowTop(CDC *pDC) //显示提示信息
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
CFont *pOldFont,*font;
font = new CFont;
font->CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE,0,0,0,0,0,0, _T("Arial"));
pOldFont = (CFont*)pDC->SelectObject(font);
pDC->DrawText(m_strTop, CRect(13,0,213,20), NULL);
pOldFont->DeleteObject();
font->DeleteObject();
delete font;
}
void CLlkDlg::Shuffle() //洗牌
{
int i, j;
CDWordArray arPic;
for (i = 1; i <= ROW_NUMBER; i++)
{
for (j = 1; j <= LINE_NUMBER; j++)
{
if (GetPicIndex(i, j) > 0)
{
arPic.Add(GetPicIndex(i, j));
if (((GetValue(i, j) & LS_CLICK) == LS_CLICK))
{
UpdateClkState(i, j, LS_NOCLK);
}
}
}
}
int index;
for (i = 1; i <= ROW_NUMBER; i++)
{
for (j = 1; j <= LINE_NUMBER; j++)
{
if (GetPicIndex(i, j) > 0)
{
index = (int(rand() * 001 + rand() * 0.1 + rand())) % arPic.GetSize();
SetPicIndex(i, j, arPic.GetAt(index));
arPic.RemoveAt(index);
}
}
}
ReleasePlace();
for(i = 0; i < 28; i++)
{
PIC_PLACE[i+1] = NULL;
}
ListPicPlace();
}
void CLlkDlg::TipButton(CDC *pDC) //绘提示按扭
{
CDC Mydc1,Mydc2;
CBitmap Button,ButtonDown;
Button.LoadBitmap(IDB_BUTTON);
ButtonDown.LoadBitmap(IDB_BUTTON_DOWN);
Mydc1.CreateCompatibleDC(&Mydc2);
Mydc1.SelectObject(&Button);
Mydc2.CreateCompatibleDC(&Mydc2);
Mydc2.SelectObject(&ButtonDown);
if (m_bTip)
{
pDC->BitBlt(296,18,48,25,&Mydc2,0,0,SRCCOPY);
}
else
{
pDC->BitBlt(296,18,48,25,&Mydc1,0,0,SRCCOPY);
}
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
CFont *pOldFont,*font;
font = new CFont;
font->CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE,0,0,0,0,0,0, _T("Arial"));
pOldFont = (CFont*)pDC->SelectObject(font);
if (m_nLanguage == 0)
pDC->DrawText(_T("TIP"), CRect(296,20,344,43), DT_CENTER);
if (m_nLanguage == 1)
pDC->DrawText(_T("提示"), CRect(296,20,344,43), DT_CENTER);
if (m_nButton == 1)
{
CPen pen( PS_SOLID ,3,RGB(167,241,243));
CPen *pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(297, 18);
pDC->LineTo(297, 43);
pDC->MoveTo(297,41);
pDC->LineTo(342, 41);
pDC->MoveTo(342,43);
pDC->LineTo(342, 18);
pDC->MoveTo(342,19);
pDC->LineTo(297,19);
pOldPen->DeleteObject();
}
if (m_nPrompt <= 0)
DrawSemiTransparentRect(pDC,CRect(296, 18, 344, 43),RGB(0, 0, 0));
Mydc1.DeleteDC();
Mydc2.DeleteDC();
pOldFont->DeleteObject();
font->DeleteObject();
delete font;
Button.DeleteObject();
ButtonDown.DeleteObject();
}
void CLlkDlg::UpdateClkState(int x, int y, int nNewVal) //修改位图显示
{
if (!(nNewVal == LS_CLICK || nNewVal == LS_NOCLK || nNewVal == LS_DBLCLK))
return;
int nVal = GetValue(x, y);
nVal &= ~LS_DBLCLK;
nVal &= ~LS_CLICK;
nVal &= ~LS_NOCLK;
SetValue(x, y, nVal |= nNewVal);
}
void CLlkDlg::UpdateLeft(int nVal) //修改剩余牌数
{
if (m_nLeft == 0)
return;
m_nLeft -= nVal;
}
void CLlkDlg::UpdatePos() //修改时间条位置
{
m_nPos += m_nSpeed;
}
void CLlkDlg::UpdatePrompt(int nAddVal) //修改提示次数
{
m_nPrompt += nAddVal;
}
void CLlkDlg::UpdateScore(int nAddScore) //修改分数
{
m_nScore += nAddScore;
}
void CLlkDlg::UpdateShuffle(int nAddVal) //修改洗牌次数
{
m_nShuffle += nAddVal;
}
void CLlkDlg::WashButton(CDC *pDC) //绘洗牌按扭
{
CDC Mydc1,Mydc2;
CBitmap Button,ButtonDown;
Button.LoadBitmap(IDB_BUTTON);
ButtonDown.LoadBitmap(IDB_BUTTON_DOWN);
Mydc1.CreateCompatibleDC(pDC);
Mydc1.SelectObject(&Button);
Mydc2.CreateCompatibleDC(pDC);
Mydc2.SelectObject(&ButtonDown);
if (m_bWash)
{
pDC->BitBlt(358,18,48,25,&Mydc2,0,0,SRCCOPY);
}
else
{
pDC->BitBlt(358,18,48,25,&Mydc1,0,0,SRCCOPY);
}
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
CFont *pOldFont,*font;
font = new CFont;
font->CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE,0,0,0,0,0,0, _T("Arial"));
pOldFont = (CFont*)pDC->SelectObject(font);
if (m_nLanguage == 0)
pDC->DrawText(_T("SHUF"),CRect(358,20,406,43),DT_CENTER);
if (m_nLanguage == 1)
pDC->DrawText(_T("洗牌"),CRect(358,20,406,43),DT_CENTER);
if (m_nButton == 2)
{
CPen pen( PS_SOLID ,3,RGB(167,241,243));
CPen *pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(359, 18);
pDC->LineTo(359, 43);
pDC->MoveTo(359,41);
pDC->LineTo(404, 41);
pDC->MoveTo(404,43);
pDC->LineTo(404, 18);
pDC->MoveTo(404,19);
pDC->LineTo(359, 19);
pOldPen->DeleteObject();
}
if (m_nShuffle <= 0)
DrawSemiTransparentRect(pDC,CRect(358, 18, 406, 43),RGB(0, 0, 0));
Mydc1.DeleteDC();
Mydc2.DeleteDC();
pOldFont->DeleteObject();
font->DeleteObject();
delete font;
Button.DeleteObject();
ButtonDown.DeleteObject();
}
void CLlkDlg::WriteFile() //记录最高分
{
CFile file;
file.Open(_T("\\record.txt"),CFile::modeWrite,NULL);
file.Write(&m_nScore, 20);
file.Close();
}
void CLlkDlg::OnGameAbandon() //放弃游戏
{
// TODO: Add your command handler code here
SetInGame(FALSE);
SetPause();
ReleasePlace();
InitMap();
SetPos(0);
m_bSecClk = FALSE;
m_nXIndex = -1;
m_nYIndex = -1;
m_strTop = ("");
m_nMin = 2;
m_nSec1 = 0;
m_nSec2 = 0;
m_nTimer = 0;
m_nPane_x = 0;
m_nPane_y = 0;
m_nMenu_y = 0;
}
void CLlkDlg::DrawMessage(CDC *pDC) //绘信息栏
{
CString str;
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
CFont *pOldFont,*font;
font = new CFont;
font->CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE,0,0,0,0,0,0, _T("Arial"));
pOldFont = (CFont*)pDC->SelectObject(font);
if (m_nLanguage == 0)
{
pDC->DrawText( _T("SCORE:"), CRect(390,55,460,71), DT_RIGHT);
str.Format(_T(" %d "), GetScore());
pDC->DrawText(str, CRect(390,73,460,89), DT_RIGHT);
pDC->DrawText( _T("LEVEL:"), CRect(390,94,460,110), DT_RIGHT);
str.Format(_T(" %d "), GetLevel());
pDC->DrawText(str, CRect(390,112,460,128), DT_RIGHT);
pDC->DrawText( _T("TIP:"), CRect(390, 133,460,149), DT_RIGHT);
str.Format(_T(" %d "), GetPrompt());
pDC->DrawText(str, CRect(390,151,460,167), DT_RIGHT);
pDC->DrawText( _T("SHUFFLE:"), CRect(390,172,460,188), DT_RIGHT);
str.Format(_T(" %d "), GetShuffle());
pDC->DrawText(str, CRect(390,190,460,206), DT_RIGHT);
pDC->DrawText( _T("NUMBER:"), CRect(390,211,460,227), DT_RIGHT);
str.Format(_T("%d/%d"), GetTotal() - GetLeft(), GetTotal());
pDC->DrawText(str, CRect(390,229,460,245), DT_RIGHT);
}
if (m_nLanguage == 1)
{
pDC->DrawText( _T("分数:"), CRect(390,55,460,71), DT_RIGHT);
str.Format(_T(" %d "), GetScore());
pDC->DrawText(str, CRect(390,73,460,89), DT_RIGHT);
pDC->DrawText( _T("关数:"), CRect(390,94,460,110), DT_RIGHT);
str.Format(_T(" %d "), GetLevel());
pDC->DrawText(str, CRect(390,112,460,128), DT_RIGHT);
pDC->DrawText( _T("提示:"), CRect(390, 133,460,149), DT_RIGHT);
str.Format(_T(" %d "), GetPrompt());
pDC->DrawText(str, CRect(390,151,460,167), DT_RIGHT);
pDC->DrawText( _T("洗牌:"), CRect(390, 172,460,188), DT_RIGHT);
str.Format(_T(" %d "), GetShuffle());
pDC->DrawText(str, CRect(390,190,460,206), DT_RIGHT);
pDC->DrawText( _T("牌数:"), CRect(390,211,460,227), DT_RIGHT);
str.Format(_T("%d/%d"), GetTotal() - GetLeft(), GetTotal());
pDC->DrawText(str, CRect(390,229,460,245), DT_RIGHT);
}
pOldFont->DeleteObject();
font->DeleteObject();
delete font;
}
void CLlkDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (!GetPause())
{
m_nTimer++;
m_nTimer %= m_nCycle;
if (GetPos()<GetUpper() && !m_nTimer)
{
UpdatePos();
if (m_nSec2 == 0)
{
if (m_nSec1 == 0)
{
if (m_nMin == 0)
{
m_nMin = 0;
}
else
{
m_nMin--;
m_nSec1 = 5;
m_nSec2 = 10;
}
}
else
{
m_nSec1--;
m_nSec2 = 10;
}
}
m_nSec2--;
}
if (GetPos() >= GetUpper())
{
SetPause();
SetInGame(false);
if (m_nScore > m_lHighPoint)
WriteFile();
m_bSele_ok = true;
if (m_bEffect && !m_bOvermusic)
PlaySound (TEXT("\\NAND\\llk(sound)\\OVER.wav"), NULL, SND_ASYNC | SND_NODEFAULT);
m_bOvermusic = TRUE;
}
}
this->Invalidate(false);
CDialog::OnTimer(nIDEvent);
}
void CLlkDlg::DrawMenu(CDC *pDC) //绘菜单
{
if (m_bSele_ok)
{
CDC dc;
CBitmap menu;
menu.LoadBitmap(IDB_MENU);
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&menu);
pDC->BitBlt(146,84,128,126,&dc,0,0,SRCCOPY);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -