• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-91  評(píng)論-137  文章-0  trackbacks-0
            首先我們需要食物,蛇的節(jié)點(diǎn),一條蛇三個(gè)結(jié)構(gòu)
              1 class Food
              2 {
              3 public:
              4     Food(){}
              5     Food(COORD _cd) : cd(_cd){}
              6 
              7     COORD cd;
              8 };
              9 
             10 class SnakeNode
             11 {
             12 public:
             13     SnakeNode() : Prev(0),Next(0)
             14     {
             15         cd.X = cd.Y = 0;
             16     }
             17 
             18     SnakeNode(COORD _cd) : cd(_cd),Prev(0),Next(0){}
             19     SnakeNode(int x,int y) : Prev(0),Next(0)
             20     {
             21         cd.X = x;
             22         cd.Y = y;
             23     }
             24 
             25     COORD cd;
             26     SnakeNode* Prev;
             27     SnakeNode* Next;
             28 };
             29 
             30 class Snake
             31 {
             32 public:
             33     Snake()
             34     {
             35         Initialize();
             36     }
             37 
             38     ~Snake()
             39     {
             40         Destroy();
             41     }
             42 
             43     void Initialize()
             44     {
             45         Score = 0;
             46         Length = 3;
             47         Type = dtLeft;
             48         Speed = 1000;
             49         Score = 0;
             50         SnakeNode* pNode1 = new SnakeNode(GAME_WIDTH / 2,GAME_HEIGHT / 2);
             51         SnakeNode* pNode2 = new SnakeNode(pNode1->cd.X + 1,pNode1->cd.Y);
             52         SnakeNode* pNode3 = new SnakeNode(pNode1->cd.X + 2,pNode1->cd.Y);
             53         pNode1->Next = pNode2;
             54         pNode2->Next = pNode3;
             55         pNode3->Prev = pNode2;
             56         pNode2->Prev = pNode1;
             57         Head = pNode1;
             58         Tail = pNode3;
             59     }
             60 
             61     void Destroy()
             62     {
             63         SnakeNode* pNode = Head->Next;
             64         while(pNode)
             65         {
             66             SnakeNode* Next = pNode->Next;
             67             delete pNode;
             68             pNode = Next;
             69         }
             70         if(Head)
             71         {
             72             delete Head;
             73             Head = Tail = 0;
             74         }
             75     }
             76 
             77     int Insert(int x,int y)
             78     {
             79         SnakeNode* pNode = new SnakeNode(x,y);
             80         pNode->Next = Head;
             81         Head->Prev = pNode;
             82         Head = pNode;
             83         return ++Length;
             84     }
             85 
             86     COORD Pop()
             87     {
             88         COORD cd = Tail->cd;
             89         Tail = Tail->Prev;
             90         delete Tail->Next;
             91         Tail->Next = 0;
             92         return cd;
             93     }
             94 
             95     int Length;                // 長度,無用
             96     DIRECTIONTYPE Type;        // 方向
             97     SnakeNode* Head;        // 蛇頭節(jié)點(diǎn)
             98     SnakeNode* Tail;        // 蛇尾節(jié)點(diǎn)
             99     int Speed;                // 速度
            100     Food food;                // 食物位置
            101     int Score;                // 分?jǐn)?shù)
            102 };
            然后我們需要一個(gè)函數(shù)表示蛇向蛇頭方向移動(dòng)了一格
             1     static void SnakeMove(Snake& sn)
             2     {
             3         COORD cdNew;
             4         switch(sn.Type)
             5         {
             6         case dtTop:
             7             cdNew = sn.Head->cd;
             8             cdNew.Y--;
             9             break;
            10         case dtRight:
            11             cdNew = sn.Head->cd;
            12             cdNew.X++;
            13             break;
            14         case dtBottom:
            15             cdNew = sn.Head->cd;
            16             cdNew.Y++;
            17             break;
            18         case dtLeft:
            19             cdNew = sn.Head->cd;
            20             cdNew.X--;
            21             break;
            22         }
            23         if(cdNew.X < 0 || cdNew.X >= GAME_WIDTH || cdNew.Y < 0 || cdNew.Y >= GAME_HEIGHT) throw "GameOver";
            24         sn.Insert(cdNew.X,cdNew.Y);
            25         if(cdNew.X != sn.food.cd.X || cdNew.Y != sn.food.cd.Y)
            26         {
            27             COORD cd = sn.Pop();
            28             Check(sn);
            29             DrawBack(cd);
            30         }
            31         else
            32         {
            33             sn.food = GetFood();
            34             sn.Score++;
            35             sn.Speed = 1000 - ((int)(sn.Score / 10)) * 100;
            36             Check(sn);
            37         }
            38     }
            我們需要一個(gè)延時(shí)函數(shù)和等待用戶按鍵的函數(shù)
             1     static void Delay(Snake& sn)
             2     {
             3         DWORD dwStart = GetTickCount();
             4         while(GetTickCount() - dwStart <= sn.Speed)
             5         {
             6             int Key = GetKey();
             7             if(Key != -1)
             8             {
             9                 switch(Key)
            10                 {
            11                 case VK_UP:
            12                     sn.Type = dtTop;
            13                     break;
            14                 case VK_RIGHT:
            15                     sn.Type = dtRight;
            16                     break;
            17                 case VK_DOWN:
            18                     sn.Type = dtBottom;
            19                     break;
            20                 case VK_LEFT:
            21                     sn.Type = dtLeft;
            22                     break;
            23                 }
            24                 Sleep(sn.Speed - GetTickCount() + dwStart);
            25                 return;
            26             }
            27             Sleep(1);
            28         }
            29     }
            30 
            31     static int GetKey()
            32     {
            33         int KeyList[] = {VK_UP,VK_RIGHT,VK_DOWN,VK_LEFT,VK_ESCAPE,0x52};
            34         for(int i=0;i<6;i++)
            35         {
            36             if(GetAsyncKeyState(KeyList[i]))
            37                 return KeyList[i];
            38         }
            39         return -1;
            40     }
            當(dāng)然我們也需要一個(gè)生成食物的函數(shù)(當(dāng)然食物不能生成在蛇身上)
             1     static Food GetFood()
             2     {
             3         COORD cd;
             4         BOOL bIn = TRUE;
             5         while(bIn)
             6         {
             7             bIn = FALSE;
             8             int n = rand() % (GAME_WIDTH * GAME_HEIGHT);
             9             cd.X = n % GAME_WIDTH;
            10             cd.Y = n / GAME_WIDTH;
            11             for(SnakeNode* pNode=g_Snake.Head;pNode!=g_Snake.Tail;pNode=pNode->Next)
            12             {
            13                 if(cd.X == pNode->cd.X && cd.Y == pNode->cd.Y)
            14                 {
            15                     bIn = TRUE;
            16                     break;
            17                 }
            18             }
            19         }
            20         Food Result(cd);
            21         return Result;
            22     }
            最后是整體框架
             1     static void Loop()
             2     {
             3         try
             4         {
             5             while(TRUE)
             6             {
             7                 DrawSnake(g_Snake);
             8                 DrawFood(g_Snake);
             9                 DrawInformation(g_Snake);
            10                 Delay(g_Snake);
            11                 SnakeMove(g_Snake);
            12             }
            13         }
            14         catch(LPTSTR str)
            15         {
            16             system("cls");
            17             SetCursor(0,0);
            18             printf(str);
            19             printf("\n1.Press R For Restart\n2.Press ESC For Exit");
            20             while(TRUE)
            21             {
            22                 int Key = GetKey();
            23                 switch(Key)
            24                 {
            25                 case VK_ESCAPE:
            26                     return;
            27                 case 0x52// Press R
            28                     g_Snake.Destroy();
            29                     Initlize();
            30                     Loop();
            31                     return;
            32                 }
            33                 Sleep(100);
            34             }
            35         }
            36     }
            運(yùn)行結(jié)果


            蛇做的有點(diǎn)抽象...

            部分代碼取自http://www.shnenglu.com/menjitianya/archive/2011/05/26/147205.html

            所有代碼打包下載
            posted on 2011-05-28 13:02 lwch 閱讀(1738) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 游戲
            国产精品综合久久第一页| 精品久久久噜噜噜久久久| 久久夜色精品国产噜噜亚洲a| 亚洲欧美一区二区三区久久| 久久无码中文字幕东京热| 蜜臀久久99精品久久久久久小说| 99久久无码一区人妻a黑| 亚洲成色999久久网站| 亚洲精品美女久久久久99小说| 日韩欧美亚洲综合久久| 国产精品一区二区久久国产| 久久久久国产精品麻豆AR影院 | 婷婷久久五月天| 精品久久久久香蕉网| 久久一本综合| 国产精品久久永久免费| 亚洲综合久久夜AV | 久久99精品国产99久久6男男| 欧美成a人片免费看久久| 色综合久久中文字幕无码| 久久精品国产色蜜蜜麻豆| 亚洲∧v久久久无码精品| 大蕉久久伊人中文字幕| 久久精品日日躁夜夜躁欧美| 94久久国产乱子伦精品免费| 99久久精品免费看国产一区二区三区| 欧美精品一本久久男人的天堂| 色综合久久夜色精品国产| 国产99久久久国产精免费| 77777亚洲午夜久久多喷| 久久久久久毛片免费看| 精品久久久久久综合日本| 久久久久久久精品成人热色戒| 国产精品无码久久四虎| 久久久久久久久久久久中文字幕| 综合久久一区二区三区| 国产一区二区三精品久久久无广告 | 久久精品日日躁夜夜躁欧美| 久久99久久成人免费播放| 麻豆精品久久精品色综合| 99999久久久久久亚洲|