随笔-91  评论-137  文章-0  trackbacks-0
首先我们需要食物,蛇的节点,一条蛇三个结构
  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;        // 蛇头节点
 98     SnakeNode* Tail;        // 蛇尾节点
 99     int Speed;                // 速度
100     Food food;                // 食物位置
101     int Score;                // 分数
102 };
然后我们需要一个函数表示蛇向蛇头方向移动了一格
 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     }
我们需要一个延时函数和等待用户按键的函数
 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     }
当然我们也需要一个生成食物的函数(当然食物不能生成在蛇身上)
 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     }
运行结果


蛇做的有点抽象...

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

所有代码打包下载
posted on 2011-05-28 13:02 lwch 阅读(1731) 评论(0)  编辑 收藏 引用 所属分类: 游戏

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理