首页 > 其他 > 详细

大大维的贪吃蛇v1

时间:2017-01-22 22:28:23      阅读:355      评论:0      收藏:0      [点我收藏+]

虽然本人一直是个免费的游戏测试员(/手动滑稽),但一直有着一个游戏架构师的梦想。正如马爸爸所说,梦想还是要有的,万一实现了呢?

这些天放寒假,有些空闲时间,就想着做一个简单的游戏机。能达到小时候十几块钱买的那种小霸王的功能就差不多了(有贪吃蛇,赛车小游戏,俄罗斯方块,雷霆战机,坦克大战),好吧,原谅我有些浮夸风(/手动斜眼)。。。

这不,下面是我这两天抠出来的一个最简单的贪吃蛇小游戏,姑且叫它“大大维的贪吃蛇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 }
View Code

最后上几张游戏的运行的截图:

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

 

大大维的贪吃蛇v1

原文:http://www.cnblogs.com/liujw2114/p/6341515.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!