【Windows編程】球球大作戰(二) 貪喫蛇的實現

做一個普通的貪喫蛇出來,首先看下我們要實現的功能:

  • 會移動的球
  • 隨機生成喫的食物
  • 球吃了食物會變大
首先是球的移動
  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類 這是我下一章要寫的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章