貪吃蛇的程序,主框架是吉亮大神的,做了點修改,支持改變速度,改變地圖大小;

1 /*NAME:SNAKE DATE:2014/1/11*/ 2 #include <iostream.h> 3 #include <windows.h> 4 #include <stdlib.h> 5 #include <conio.h> 6 #include <time.h> //使用當前時間做種子; 7 enum dir{up,down,left,right}; //枚舉類型enum dir; 8 9 int map_lenth,map_wide;//地圖的長和寬(即i和j) 10 11 //圍牆; 12 class Fence 13 { 14 public: 15 void InitFence(); 16 void OutputF(); 17 public: 18 char game[40][40]; 19 }f; //定義對象; 20 //畫框框; 21 void Fence::InitFence() 22 { 23 for(int i=0; i<map_lenth; i++) 24 for(int j=0; j<map_wide; j++) 25 { 26 if(i==0 || i==map_lenth-1 || j==0 || j==map_wide-1) 27 game[i][j]= '*'; 28 else game[i][j]= ' '; 29 } 30 } 31 //顯示框框; 32 void Fence::OutputF() 33 { 34 for(int i=0; i<map_lenth; i++) 35 { 36 for(int j=0; j<map_wide; j++) 37 cout<<game[i][j]<<' '; 38 cout<<endl; 39 } 40 } 41 42 //蛇結點; 43 class SnakeNode 44 { 45 private: 46 int x,y; 47 SnakeNode *prior,*next; 48 public: 49 void add_head(int x,int y); 50 int get_x(); 51 int get_y(); 52 void delete_tail(); 53 }*head=NULL,*tail=NULL; 54 //插入頭結點; 55 void SnakeNode::add_head(int x,int y) 56 { 57 SnakeNode *q=new SnakeNode; 58 q->x =x; q->y =y; 59 q->next =head; 60 q->prior =NULL; 61 if(head) head->prior =q; 62 head =q; 63 if(!tail) tail =head; 64 f.game[x][y]= '~'; //f對象可以在定義Fence類時定義; 且Fence類在SnakeNode類前定義; 65 } 66 int SnakeNode::get_x() 67 { 68 return x; 69 } 70 int SnakeNode::get_y() 71 { 72 return y; 73 } 74 //刪除尾結點; 75 void SnakeNode::delete_tail() 76 { 77 SnakeNode *p=tail; 78 f.game[tail->get_x()][tail->get_y()]= ' ';//把尾結點的坐標表示的'*'置為空格; 79 if(tail==head) 80 tail= head= NULL; 81 else 82 { 83 tail= tail->prior; 84 tail->next= NULL; 85 } 86 delete p; 87 } 88 89 //move移動; 90 class move 91 { 92 public: 93 dir point; //枚舉變量point: 控制方向; 94 int food_x; 95 int food_y; 96 public: 97 void moving(); 98 void change_point(char); //改變方向; 99 void get_food(); 100 }; 101 102 void move::moving() 103 { 104 int a,b; 105 a=head->get_x(); //取得頭結點橫坐標 106 b=head->get_y(); //取得頭結點縱坐標 107 switch(point) 108 { 109 case up: --a; break; 110 case down: ++a; break; 111 case left: --b; break; 112 case right: ++b; break; 113 } 114 if(a==map_lenth-1 || b==map_wide-1 || a==0 || b==0) 115 { //判斷是否撞牆; 116 cout<<"game over!!!"<<endl; 117 exit(0); 118 } 119 if(a==food_x && b==food_y) 120 { //吃food; 121 head->add_head(a,b); 122 get_food(); 123 } 124 else{ 125 head->add_head(a,b); //插入頭結點; 126 head->delete_tail(); //刪除尾結點; 127 } 128 } 129 130 void move::change_point(char keydown) 131 { 132 switch(keydown) 133 { 134 case 'w': 135 { 136 if (point!=down) 137 { 138 point=up; break; 139 } 140 else break; 141 } 142 case 's': 143 { 144 if (point!=up) 145 { 146 point=down; break; 147 } 148 else break; 149 } 150 case 'a': 151 { 152 if (point!=right) 153 { 154 point=left; break; 155 } 156 else 157 break; 158 } 159 case 'd': 160 { 161 if (point!=left) 162 { 163 point=right; break; 164 } 165 else break; 166 } 167 } 168 } 169 void move::get_food() 170 { 171 srand((unsigned int) time(NULL)); //做種子(程序運行時間); 172 food_x= rand()%(map_lenth-2)+1; 173 food_y= rand()%(map_wide-2)+1; 174 f.game[food_x][food_y]='x'; 175 } 176 177 //main(); 178 int main() 179 { 180 int speed; 181 cout<<"Instruction: The snake's original length is 3.\nUsing 'w,s,a,d' to start the game and control the direction.\nGOOD LUCK!\n"; 182 cout<<"\nPlease put in 'lenth' & 'wide' to control the map and press enter to confirm.(limits:4~39)"<<endl; 183 cout<<"Length="; 184 cin>>map_lenth; 185 cout<<"Wide="; 186 cin>>map_wide; 187 cout<<endl<<"Warning:the bigger num means the lower speed.Limits:1~500!\nSpeed="; 188 cin>>speed; 189 //畫框框和小蛇; 190 move m; 191 f.InitFence(); 192 head->add_head(4,3); 193 head->add_head(4,4); 194 head->add_head(4,5); 195 m.get_food(); 196 f.OutputF(); 197 while (true) 198 { 199 char keydown=getch(); //getch()返回鍵盤上讀取的字符;包含頭文件<conio.h> 200 m.change_point(keydown); 201 while(!kbhit()) 202 { //判斷有沒有按鍵落下; 203 system("cls"); //清屏函數; 204 m.moving(); 205 f.OutputF(); 206 Sleep(speed); 207 } 208 } 209 return 0; 210 }