• <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  評論-137  文章-0  trackbacks-0
            首先我們需要食物,蛇的節(jié)點,一條蛇三個結(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é)點
             98     SnakeNode* Tail;        // 蛇尾節(jié)點
             99     int Speed;                // 速度
            100     Food food;                // 食物位置
            101     int Score;                // 分數(shù)
            102 };
            然后我們需要一個函數(shù)表示蛇向蛇頭方向移動了一格
             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     }
            我們需要一個延時函數(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     }
            當然我們也需要一個生成食物的函數(shù)(當然食物不能生成在蛇身上)
             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     }
            運行結(jié)果


            蛇做的有點抽象...

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

            所有代碼打包下載
            posted on 2011-05-28 13:02 lwch 閱讀(1739) 評論(0)  編輯 收藏 引用 所屬分類: 游戲
            亚洲精品国精品久久99热一| 久久精品免费网站网| 久久人人爽人人爽人人AV东京热 | 亚洲成人精品久久| 合区精品久久久中文字幕一区| 久久久久国产精品人妻| 91精品国产色综久久| 一本色道久久88—综合亚洲精品| 好久久免费视频高清| 久久久黄色大片| 久久精品国产99国产精品| 国产成年无码久久久久毛片| 亚洲七七久久精品中文国产| 久久精品国产91久久综合麻豆自制| 久久夜色精品国产| 国产精品免费久久久久电影网| 囯产极品美女高潮无套久久久| 久久久久亚洲AV成人网人人软件| 蜜臀久久99精品久久久久久小说| 久久香蕉国产线看观看猫咪?v| 九九久久99综合一区二区| 日韩精品久久久久久免费| 性做久久久久久免费观看| 99久久综合国产精品二区| 精品综合久久久久久97超人| 久久久久无码精品国产不卡| 久久国产色AV免费看| 久久久久久午夜精品| 日韩亚洲国产综合久久久| 国产精品亚洲美女久久久| 久久九九有精品国产23百花影院| 久久永久免费人妻精品下载| 久久久久久国产精品美女| 久久精品卫校国产小美女| 久久久久久国产a免费观看黄色大片| 国产精久久一区二区三区| 天天久久狠狠色综合| 999久久久免费国产精品播放| 久久精品国产99国产精品澳门 | 国产精品欧美亚洲韩国日本久久| 丁香五月网久久综合|