虽然本人一直是个免费的游戏测试员(/手动滑稽),但一直有着一个游戏架构师的梦想。正如马爸爸所说,梦想还是要有的,万一实现了呢?
这些天放寒假,有些空闲时间,就想着做一个简单的游戏机。能达到小时候十几块钱买的那种小霸王的功能就差不多了(有贪吃蛇,赛车小游戏,俄罗斯方块,雷霆战机,坦克大战),好吧,原谅我有些浮夸风(/手动斜眼)。。。
这不,下面是我这两天抠出来的一个最简单的贪吃蛇小游戏,姑且叫它“大大维的贪吃蛇v1”吧!!!游戏借鉴了好多已有的贪吃蛇版本,就不再一一致谢了。。。(原谅我懒得再翻记录)
游戏功能比较简单,后续还需要完善。先将代码在这保存一份,日后看看,也是一件挺有意思的事情把!!!
1 /**--------------------------------------------------**/ 2 /**名称:大大维的贪吃蛇v1 日期:2017/1/22**/ 3 /**描述:实现了贪吃蛇的基本功能,可以调节游戏难度,**/ 4 /**做了一个简单的用户界面 **/ 5 /**存在的问题:由于使用了全局数组存贮,因此对Space **/ 6 /**类的封装有些欠缺;由于使用了全局刷新,游戏运行中**/ 7 /**会出现闪屏现象,游戏难度越高,闪动越严重;不能够**/ 8 /**存储玩家的游戏记录,由于不是图形化界面,用户界面**/ 9 /**较丑;不能改变游戏的地图大小 **/ 10 /**笔者会在后续版本逐步完善这些问题!!! **/ 11 /**--------------------------------------------------**/ 12 13 #include<iostream> 14 #include<ctime> 15 #include<cstdlib> 16 #include<cstdio> 17 #include<conio.h> 18 #include<windows.h> 19 using namespace std; 20 const int SpaceLENG=20; 21 const int SpaceHIGH=40; 22 const int HARDSPEED=100; 23 const int NOMALSPEED=400; 24 const int EASYSPEED=700; 25 int speed=NOMALSPEED; 26 bool FLAG=true; 27 enum dir {UP,DOWN,LEFT,RIGHT};///使用小写会引发歧义 28 enum level {HARD,ESAY,NOMAL}; 29 ///---------------------------------------------------- 30 ///游戏空间定义 31 class Space 32 { 33 public: 34 void InitSpace(); 35 void DisplaySpace(); 36 public: 37 char SpaceData[SpaceLENG+2][SpaceHIGH+2]; 38 }; 39 void Space::InitSpace() 40 { 41 for(int i=-1; i<SpaceLENG+1; i++) 42 for(int j=-1; j<SpaceHIGH+1; j++) 43 { 44 if(i<0||i==SpaceLENG||j<0||j==SpaceHIGH) 45 SpaceData[i][j]=‘#‘; 46 else 47 SpaceData[i][j]=‘ ‘; 48 } 49 } 50 void Space::DisplaySpace() 51 { 52 for(int i=-1; i<SpaceLENG+1; i++) 53 { 54 for(int j=-1; j<SpaceHIGH+1; j++) 55 { 56 cout<<SpaceData[i][j]; 57 } 58 cout<<endl; 59 } 60 cout<<endl<<endl; 61 } 62 Space *spa=new Space(); 63 ///---------------------------------------------------- 64 ///蛇节点定义 65 class SnakeNode 66 { 67 public: 68 void setXY(int m,int n) 69 { 70 x=m; 71 y=n; 72 } 73 void setNext(SnakeNode *temp) 74 { 75 next=temp; 76 } 77 void setPrior(SnakeNode *temp) 78 { 79 prior=temp; 80 } 81 int getX() 82 { 83 return x; 84 } 85 int getY() 86 { 87 return y; 88 } 89 SnakeNode* getNext() 90 { 91 return next; 92 } 93 SnakeNode* getPrior() 94 { 95 return prior; 96 } 97 private: 98 int x,y; 99 SnakeNode *prior,*next; 100 }; 101 ///---------------------------------------------------- 102 ///食物定义 103 class Food 104 { 105 public: 106 void foodCreate() 107 { 108 bool flag=true; 109 while(flag) 110 { 111 srand((unsigned int)time(NULL)); 112 fx=rand()%SpaceLENG; 113 fy=rand()%SpaceHIGH; 114 if(spa->SpaceData[fx][fy]!=‘*‘) 115 flag=false; 116 } 117 118 spa->SpaceData[fx][fy]=‘$‘; 119 } 120 int getFx() 121 { 122 return fx; 123 } 124 int getFy() 125 { 126 return fy; 127 } 128 private: 129 int fx; 130 int fy; 131 }; 132 ///---------------------------------------------------- 133 ///蛇定义 134 class Snake:public SnakeNode,public Food 135 { 136 public: 137 Snake() 138 { 139 addHead(SpaceLENG/2,SpaceHIGH/2); 140 addHead(SpaceLENG/2,SpaceHIGH/2-1); 141 addHead(SpaceLENG/2,SpaceHIGH/2-2); 142 } 143 void addHead(int x,int y); 144 void delTail(); 145 void moving(); 146 void changePoint(char keydown); 147 SnakeNode* getHead() 148 { 149 return head; 150 } 151 SnakeNode* getTail() 152 { 153 return tail; 154 } 155 int getLEN() 156 { 157 return LEN; 158 } 159 private: 160 SnakeNode *head=NULL,*tail=NULL; 161 int LEN=0; 162 dir point=LEFT; 163 }; 164 void Snake::addHead(int x,int y) 165 { 166 SnakeNode *temp=new SnakeNode(); 167 temp->setXY(x,y); 168 temp->setNext(head); 169 temp->setPrior(NULL); 170 if(head) 171 { 172 head->setPrior(temp);///如果头不为空 173 spa->SpaceData[head->getX()][head->getY()]=‘*‘;///旧头 174 } 175 head=temp; 176 if(!tail)tail=head;///如果尾为空 177 spa->SpaceData[head->getX()][head->getY()]=‘@‘;///新头 178 LEN++; 179 } 180 void Snake::delTail() 181 { 182 SnakeNode *temp=tail; 183 spa->SpaceData[tail->getX()][tail->getY()]=‘ ‘; 184 if(tail==head) 185 tail=head=NULL; 186 else 187 { 188 tail=tail->getPrior(); 189 tail->setNext(NULL); 190 LEN--; 191 } 192 delete temp; 193 194 } 195 void Snake::moving() 196 { 197 int a,b; 198 SnakeNode* temp=getHead(); 199 a=temp->getX(); 200 b=temp->getY(); 201 switch(point) 202 { 203 case UP: 204 --a; 205 break; 206 case DOWN: 207 ++a; 208 break; 209 case LEFT: 210 --b; 211 break; 212 case RIGHT: 213 ++b; 214 break; 215 } 216 ///撞墙 217 if(a==SpaceLENG||b==SpaceHIGH||a==-1||b==-1) 218 { 219 FLAG=false; 220 } 221 ///吃食物 222 if(a==getFx()&&b==getFy()) 223 { 224 addHead(a,b); 225 foodCreate(); 226 } 227 ///普通移动 cout<< sna.getHead()->x<<" "<<sna.getHead()->y<<endl; 228 else 229 { 230 addHead(a,b); 231 delTail(); 232 } 233 } 234 void Snake::changePoint(char keydown)///方向控制 235 { 236 switch(keydown) 237 { 238 case ‘w‘: 239 { 240 if(point!=DOWN) 241 { 242 point=UP; 243 break; 244 } 245 else break; 246 } 247 case ‘W‘: 248 { 249 if(point!=DOWN) 250 { 251 point=UP; 252 break; 253 } 254 else break; 255 } 256 case ‘s‘: 257 { 258 if(point!=UP) 259 { 260 point=DOWN; 261 break; 262 } 263 else break; 264 } 265 case ‘S‘: 266 { 267 if(point!=UP) 268 { 269 point=DOWN; 270 break; 271 } 272 else break; 273 } 274 case ‘a‘: 275 { 276 if(point!=RIGHT) 277 { 278 point=LEFT; 279 break; 280 } 281 else break; 282 } 283 case ‘A‘: 284 { 285 if(point!=RIGHT) 286 { 287 point=LEFT; 288 break; 289 } 290 else break; 291 } 292 case ‘d‘: 293 { 294 if(point!=LEFT) 295 { 296 point=RIGHT; 297 break; 298 } 299 else break; 300 } 301 case ‘D‘: 302 { 303 if(point!=LEFT) 304 { 305 point=RIGHT; 306 break; 307 } 308 else break; 309 } 310 } 311 } 312 ///---------------------------------------------------- 313 ///用户交互界面创建 314 class UserView 315 { 316 public: 317 int menuCreate(); 318 int gameSetting(); 319 }; 320 int UserView::menuCreate() 321 { 322 bool flag=true; 323 while(flag) 324 { 325 cout<<" MENU"<<endl<<endl; 326 cout<<"Instruction:"<<endl<<endl; 327 cout<<"The Snake‘s original length is 3."<<endl<<endl; 328 cout<<"Using ‘w,s,a,d‘ or ‘W,S,A,D‘ to control the direction."<<endl<<endl<<endl<<endl; 329 cout<<"Please Input ‘Y‘or‘y‘ to start game;"<<endl; 330 cout<<"Please Input ‘N‘or‘n‘ to end game;"<<endl; 331 cout<<"Please Input ‘S‘or‘s‘ to game setting;"<<endl; 332 cout<<"Please Input else to stay!"<<endl; 333 char startKey=getch(); 334 if(startKey==‘N‘||startKey==‘n‘) 335 { 336 system("cls"); 337 cout<<"Good Bye!!!"<<endl; 338 exit(0); 339 } 340 else if(startKey==‘Y‘||startKey==‘y‘) 341 { 342 system("cls"); 343 cout<<" Game Start!!!"<<endl<<endl<<endl<<endl<<endl; 344 cout<<" GOOD LUCK!!!"<<endl; 345 getch(); 346 flag=false; 347 } 348 else if(startKey==‘S‘||startKey==‘s‘) 349 { 350 gameSetting(); 351 } 352 system("cls"); 353 } 354 system("cls"); 355 return 0; 356 } 357 int UserView::gameSetting() 358 { 359 system("cls"); 360 cout<<" Setting:"<<endl<<endl<<endl<<endl; 361 cout<<"Please Chose Game Difficulty"<<endl; 362 cout<<"Input ‘H‘or‘h‘---Hard Level"<<endl; 363 cout<<"Input ‘N‘or‘n‘---Nomal Level"<<endl; 364 cout<<"Input ‘E‘or‘e‘---Easy Level"<<endl; 365 cout<<"Input else return the MENU"<<endl; 366 char hardKey=getch(); 367 if(hardKey==‘H‘||hardKey==‘h‘) 368 { 369 cout<<"The Game‘s Difficulty now is Hard Level!!!"<<endl; 370 speed=HARDSPEED; 371 return 0; 372 } 373 else if(hardKey==‘N‘||hardKey==‘n‘) 374 { 375 cout<<"The Game‘s Difficulty now is Nomal Level!!!"<<endl; 376 speed=NOMALSPEED; 377 return 0; 378 } 379 else if(hardKey==‘E‘||hardKey==‘e‘) 380 { 381 cout<<"The Game‘s Difficulty now is Easy Level!!!"<<endl; 382 speed=EASYSPEED; 383 return 0; 384 } 385 system("cls"); 386 return 0; 387 } 388 ///---------------------------------------------------- 389 ///程序入口 390 int main() 391 { 392 while(true) 393 { 394 UserView view; 395 view.menuCreate(); 396 spa->InitSpace(); 397 Snake sna; 398 sna.foodCreate(); 399 spa->DisplaySpace(); 400 while(FLAG) 401 { 402 char downKey=getch(); 403 sna.changePoint(downKey); 404 ///kbhit(),检查是否有键盘输入,若有,则返回一个非0值,否则返回0,在头文件<conio.h>中定义 405 while(FLAG&&!kbhit()) 406 { 407 system("cls"); 408 sna.moving(); 409 spa->DisplaySpace(); 410 Sleep(speed); 411 } 412 } 413 cout<<"Game Over!!!"<<endl; 414 cout<<"The Snake‘s Length is :"<<sna.getLEN()<<endl<<endl<<endl<<endl; 415 cout<<"The Game Will Return Back MENU!"<<endl; 416 getch(); 417 system("cls"); 418 } 419 return 0; 420 }
最后上几张游戏的运行的截图:
原文:http://www.cnblogs.com/liujw2114/p/6341515.html