當前位置:首頁 » 游戲軟體 » qq可以打小游戲的代碼
擴展閱讀
qq可以打小游戲的代碼 2025-05-10 02:37:02
海報節日的文字怎樣做 2025-05-10 02:36:28

qq可以打小游戲的代碼

發布時間: 2025-05-10 02:37:02

❶ 在C++中用MFC編寫小游戲,像方塊,貪吃蛇之類。步驟詳細不要只給一些代碼,看不懂。QQ:714715223

3. 要點分析
蛇的活動區域是由若干個小方格組成的。當這些小方格呈現灰色時,便表示蛇身。設整個區域由m×n個方格組成,最左上角的方格坐標為(0, 0)。蛇是由若干個鄰的方格組成的,將這些方格的坐標依蛇頭至蛇尾的次序存入到一個數組中便代表了蛇身。當蛇在游戲區域中「游動」一格時,所對應的數組操作應該是,將新的位置坐標插入到數組頭部,同時將數組中最後一個元素刪除。這項工作可以用一個一般的數組來完成,但當進行插入操作時需要自己移動數組中的元素;也可以使用CArray來完成這些工作,CArray的成員函數提供了需要的操作,這樣做簡單一些。

4. 解題步驟
(1)新建工程Snake,在MFC的向導第一步選擇Single Document,按Finish結束。
(2)選擇ResourceView窗口,打開菜單編輯器,在頂層菜單上添加一個名為「游戲」的彈出式菜單,該菜單下再添加一個名為「開始」的子菜單,其ID為ID_GAME_START,如圖1所示。

圖1 菜單的設計

(3)在ClassWizard中為剛才編輯好的菜單添加消息處理函數。打開ClassWizard,選中Message Maps頁。在Class Name中選擇CSnakeView,在Object ID中選擇ID_GAME_ START,在Messages中選擇COMMAND,添加消息處理函數。
(4)在ClassWizard中添加鍵盤消息處理函數。打開ClassWizard,選中Message Maps頁。在Class Name中選擇CSnakeView,在Object ID中選擇CSnakeView,在Messages中選擇WM_KeyDown,添加消息處理函數。
(5)在ClassWizard中定時器消息添加處理函數。打開ClassWizard,選中Message Maps頁。在Class Name中選擇CSnakeView,在Object ID中選擇CSnakeView,在Messages中選擇WM_Timer,添加消息處理函數。
(6)編輯生成的代碼,完成程序。

4. 源程序清單
(1) 選擇ClassView窗口,雙擊CSnakeView類,添加如下成員變數。並添加頭文件:
#include <Afxtempl.h>
class CSnakeView : public CView
{
//此處略去若干行由系統生成的代碼
private:
void ReDisplay(CPoint pPoint);
void IniGame();
void IniAim();
int m_nLeft, m_nTop, m_nWidth, m_nHeight, m_nSize; // 起始坐標,寬/高度(格數),每格大小
int m_nDirect; // 當前方向
// 1-右,2-左,3-下,4-上
CPoint m_pAim; // 當前目標坐標
CArray < CPoint, CPoint > m_aBody; // 蛇身
int m_nGameStatus; // 游戲狀態:0-未開始,1-開始
int m_nCount; // 吃掉目標數
int m_nTime, m_nTime1; // 用時間
};
(2)在CSnakeView. Cpp文件,添加3個成員函數IniAim、IniGame和ReDiaplay:
// 該函數隨機產生一個供蛇吃的目標,如果該目標恰巧與蛇身重合,則重新產生一個
void CSnakeView::IniAim()
{
int uX, uY; // 目標位置
while (1)
{
uX=rand ( ) % m_nHeight;
uY=rand ( ) % m_nWidth;
int uTag = 0; // 0-不與蛇身重合,1-重合
for (int i=0;i <= m_aBody. GetUpperBound ( );i++)
{
CPoint uPoint = m_aBody. GetAt (i);
if (uPoint. x == uX ||uPoint. y == uY ) // 目標與蛇身重合
{
uTag = 1;
break;
}
}
if (uTag == 0)
break;
}
m_pAim = CPoint (uX, uY); // 產生的目標存放在成員變數中
}
// 該函數對游戲初始化,定義游戲的初始狀態
void CSnakeView::IniGame()
{
// 游戲區域
m_nLeft = 20;
m_nTop = 20;
m_nWidth = 40;
m_nHeight = 30;
m_nSize = 10;

// 游初始狀態
m_nGameStatus = 0;
m_nDirect = 1;
m_nCount = 0;

// 初始化蛇身
m_aBody. RemoveAll ( );
m_aBody. Add ( CPoint (2, 7) );
m_aBody. Add ( CPoint (2, 6) );
m_aBody. Add ( CPoint (2, 5) );
m_aBody. Add ( CPoint (2, 4) );

// 計時器清零
m_nTime = 0;
m_nTime1 = 0;

// 初始化隨機數發生器
srand ( (unsigned) time (NULL) );

// 產生一個目標
IniAim ( );
}
// 刷新游戲區域中pPoint處的一個小方格
void CSnakeView::ReDisplay(CPoint pPoint)
{
InvalidateRect (CRect (m_nLeft + pPoint. y * m_nSize, m_nTop + pPoint. x * m_nSize,
m_nLeft + (pPoint. y + 1) * m_nSize, m_nTop + (pPoint. x + 1) * m_nSize) );
}
(3)修改CSnakeView的構造函數,完成游戲的初始化。
CSnakeView::CSnakeView()
{
IniGame();
}
(4)在OnDraw中加入代碼,顯示游戲界面。
void CSnakeView::OnDraw(CDC* pDC)
{
CSnakeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
// 畫游戲區域
pDC -> SelectStockObject (WHITE_BRUSH);
pDC -> Rectangle (CRect (m_nLeft - 1, m_nTop - 1, m_nLeft + m_nWidth * m_nSize + 1,
m_nTop + m_nHeight * m_nSize + 1) );

// 顯示當前用時
CString uStr;
uStr. Format ("當前用時:% d", m_nTime);
pDC -> TextOut (m_nLeft + m_nWidth * m_nSize + 30, 40, uStr);

// 顯示當前得分
uStr. Format ("當前得分: % d", m_nCount);
pDC -> TextOut (m_nLeft + m_nWidth * m_nSize + 30, 140, uStr);

// 顯示目標
pDC -> SelectStockObject (LTGRAY_BRUSH);
pDC -> Rectangle (CRect (m_nLeft + m_pAim. y * m_nSize, m_nTop + m_pAim. x * m_nSize,
m_nLeft + (m_pAim. y + 1) * m_nSize, m_nTop + (m_pAim. x + 1 ) *m_nSize ));

// 畫蛇
for (int i=0; i<= m_aBody. GetUpperBound (); i++)
{
CPoint uPoint = m_aBody. GetAt (i);
pDC -> Rectangle (CRect (m_nLeft + uPoint. y * m_nSize, m_nTop + uPoint. x * m_nSize,
m_nLeft + (uPoint. y + 1) * m_nSize, m_nTop + (uPoint. x + 1) * m_nSize) );
}
}
(5)為游戲菜單下的開始項的消息映射函數添加代碼。
void CSnakeView::OnGameStart()
{
// 啟動游戲,啟動定時器
IniGame ( );
m_nGameStatus = 1;
SetTimer (1, 100, NULL);
Invalidate ( );
}
(6)為鍵盤按鍵消息處理函數添加代碼。
// 根據按下的方向鍵設置代表不同方向的值
void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch (nChar)
{
case 38:
m_nDirect = 4;
break;
case 40:
m_nDirect = 3;
break;
case 37:
m_nDirect = 2;
break;
case 39:
m_nDirect = 1;
break;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
(7)為定時器消息處理函數添加代碼。
void CSnakeView::OnTimer(UINT nIDEvent)
{
m_nTime1++; // 計時
if (m_nTime1 == 10) // 達到1秒
{
m_nTime++;
m_nTime1 = 0;
Invalidate ( );
}
CPoint uPoint = m_aBody. GetAt (0); // 蛇頭的位置
int uTag = 0; //是否失敗
switch (m_nDirect) // 判斷下一步蛇是否出界
{
case 1: // right
uPoint. y++;
if (uPoint. y >= m_nWidth)
uTag = 1;
break;
case 2: // left
uPoint. y--;
if (uPoint. y < 0)
uTag = 1;
break;
case 3: // down
uPoint. x++;
if (uPoint. x >= m_nHeight)
uTag = 1;
break;
case 4: // up
uPoint. x--;
if (uPoint. x < 0)
uTag = 1;
break;
}
if (uTag ==0) // 判斷蛇是否碰到了自身
{
for (int i=0; i <= m_aBody.GetUpperBound(); i++)
{
CPoint uPoint1 = m_aBody. GetAt (i);
if (uPoint1. x == uPoint. x && uPoint1.y == uPoint. y)
{
uTag = 1;
break;
}
}
}
if (uTag == 0)
{
m_aBody. InsertAt (0, uPoint); // 新的蛇頭的位置
ReDisplay (uPoint);
if (uPoint. x == m_pAim. x && uPoint. y == m_pAim. y) // 碰上目標
{
m_nCount++;
IniAim ( );
Invalidate ( );
}
else
{
CPoint uPoint1 = m_aBody. GetAt (m_aBody.GetUpperBound ( ) );
m_aBody. RemoveAt (m_aBody.GetUpperBound ( ) );
ReDisplay (uPoint1);
}
}
else // 游戲結束
{
KillTimer(1);
AfxMessageBox("Fail!");
}
CView::OnTimer(nIDEvent);
}