做一個普通的貪喫蛇出來,首先看下我們要實現的功能:
- 會移動的球
- 隨機生成喫的食物
- 球吃了食物會變大
首先是球的移動
int x,y;
case WM_CREATE:
SetTimer(hwnd, 1, 100, NULL); // 設置定時器的刷新時間
return 0;
case WM_PAINT: // 可以理解爲繪製窗口用
hdc = BeginPaint(hwnd, &ps); // 必須要有BeginPaint 和 EndPaint。 hdc 是設備上下文
Ellipse(hdc, x, y, x + Ballsize, y + Ballsize); // 畫圓的api , 2到4的參數分別是左上xy坐 標和右下座標,Ballsize可以理解爲球的直徑
EndPaint(hwnd, &ps);
return 0;
case WM_TIMER: // 定時器
x+=speed,y+=speed;
InvalidateRect(hwnd, NULL, TRUE); //刷新窗口用
return 0;
通過時時刷新窗口,每次刷新時,圓的座標都相較上次移動了speed的距離,這也就實現了球的移動。
通過上下左右控制球的移動
case WM_KEYDOWN: //按鍵消息
switch (wParam)
{
case VK_UP:
p = 0;
return 0;
case VK_DOWN:
p=1
return 0;
case VK_LEFT:
p = 2;
return 0;
case VK_RIGHT:
p = 3;
return 0;
}
//在 WM_PAINT中增加
if (p == 0)
y -= 10;
else if (p == 1)
y += 10;
else if (p == 2)
x -= 10;
else if (p == 3)
x += 10;
通過獲得按鍵消息,改變P的值 從而確定圓的行走方向。以上 也就是基本實現了 通過上下左右控制圓球的移動功能。
而實現隨機產生食物的功能就更簡單了。
srand((unsigned)time(NULL));//設置時間種子 防止僞隨機
for(int i=0;i<number;i++)
{
x = rand() % 700;
y = rand() % 700;
Ellipse(hdc, x, y, x + FoodSize, y + FoodSize);
}
//畫很多很多的圓就ok了!
//吃了食物會變大
vector<Food> foodvector // 裝有食物的數組
void Grow()
{
bool Eat()
{
while(foodvector)
{
// 判斷每個食物的中心座標是否在圓的左上座標和右下座標之間,如果是,則認爲圓吃了食物
}
}
if(喫掉了食物)
{
// 重新分配食物的x,y的座標
Ballsize += Growsize; //球長大
}
}
難點在於如何判斷圓是否吃了食物,我的方法就如上所說是通過座標判斷的。之後的很多判斷都是通過座標,所以座標判斷的函數可以抽出來,這樣就不用每次都寫了。
突然覺得Unity3D中的碰撞檢測好方便啊。
基本的實現就是這樣了。我之前說過我將會用C++的封裝。
- CCoordinate //座標類 所有擁有座標的物體都繼承該類,左上右下和中心點座標
- CBallProPerty //球的屬性類
- CFood //食物座標
- CControl // 球的移動以及其他操作
- CSimpleAI // 智障AI類 這是我下一章要寫的內容