• C++实现贪吃蛇小游戏


    总体思路


      一直输出、清屏、再输出...形成刷新效果,形成动画效果。生成一个二维数组,用以储存地图、食物、蛇和围墙。每次输出将这个二维数组输出。生成指针数组指向二维数组来表示一个蛇头和蛇尾,指针所指的位置值为*表示蛇身,-表示蛇头,创建变量fx用来记录当前蛇的移动方向

      蛇的移动:循环用_kbhit()判断键盘是否触动,如果没有触动,蛇就往前移动(将指针所指的位置值清空,蛇头指针前面那格变为新蛇头,原来的蛇头变成蛇身,蛇的最后一格尾巴去掉,如果蛇头吃到食物,蛇尾就不去。然后指针所指的位置重新赋值),如果键盘触动,判断如果不是w、a、s、d、空格(游戏结束)、回车(游戏重开)就视为没被触动,如果是wasd就改变变量fx,并且蛇头往所指方向移动。如果蛇头的前面一格是蛇身、围墙,游戏结束

      食物的生成:用两个随机数定位食物的位置,如果食物位置是围墙或蛇身,重新生成

    代码

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<conio.h>
      4 #include<time.h>
      5 #include<windows.h>
      6 int st=3,js=1,df=0;
      7 char fx='a',*p;
      8 void sjs(char a[20][20])
      9 {
     10     srand(time(NULL));
     11     p=&a[rand()%17+1][rand()%17+1];
     12     while(*p=='*')
     13     {
     14         srand(time(NULL));
     15         p=&a[rand()%17+1][rand()%17+1];
     16     }
     17     *p='!';
     18 }
     19 void csh(char a[20][20],char *q[300])
     20 {    
     21     int i,j;
     22     st=3;
     23     js=1;
     24     df=0;
     25     fx='a';
     26     for(i=0;i<20;i++)
     27     {
     28         a[19][i]=a[0][i]='@';
     29         a[i][19]=a[i][0]='@';
     30     }
     31     for(i=1;i<19;i++)
     32         for(j=1;j<19;j++)
     33             a[i][j]=' ';
     34     q[0]=&a[10][9];
     35     q[1]=&a[10][10];
     36     q[2]=&a[10][11];
     37     *q[0]='-';
     38     *q[1]=*q[2]='*';
     39     sjs(a);
     40     printf("您的得分为:%d",df);
     41 }
     42 void sx(char a[20][20])
     43 {        
     44     int i,j;
     45     for(i=0;i<20;i++)
     46         {
     47             a[19][i]=a[0][i]='@';
     48             a[i][19]=a[i][0]='@';
     49         }
     50     for(i=1;i<19;i++)
     51         for(j=1;j<19;j++)
     52             a[i][j]=' ';
     53     *p='!';
     54 }
     55 void sc(char a[20][20])
     56 {
     57     int i,j;
     58     for(i=0;i<20;i++)
     59     {
     60         for(j=0;j<20;j++)
     61         {
     62         printf("%c ",a[i][j]);
     63         }
     64         printf("
    ");
     65     }
     66     printf("您的得分为:%d",df);
     67 
     68 }
     69 void up(char a[20][20],char *q[300])
     70 {    
     71     int i,j;
     72     if(*(q[0]-20)!='@')
     73     {    
     74         if(*(q[0]-20)!='*')
     75             if(*(q[0]-20)=='!')
     76             {
     77                 sx(a);
     78                 for(i=st;i>0;i--)
     79                 {
     80                     q[i]=q[i-1];
     81                     *q[i]='*';
     82                 }
     83                 q[0]=q[0]-20;
     84                 *q[0]='|';
     85                 st=st+1;
     86                 df=df+1;
     87                 system("cls");
     88                 sjs(a);
     89                 sc(a);
     90             }
     91             else
     92             {
     93 
     94                 sx(a);
     95                 for(i=st-1;i>0;i--)
     96                 {
     97                     q[i]=q[i-1];
     98                     *q[i]='*';
     99                 }
    100                 q[0]=q[0]-20;
    101                 *q[0]='|';
    102                 system("cls");
    103                 sc(a);
    104             }
    105         else
    106             js=0;
    107     }
    108     else
    109         js=0;
    110 
    111 }
    112 void left(char a[20][20],char *q[300])
    113 {    
    114     int i,j;
    115     if(*(q[0]-1)!='@')
    116     {
    117         if(*(q[0]-1)!='*')
    118         {
    119             if(*(q[0]-1)=='!')
    120             {
    121                 sx(a);
    122                 for(i=st;i>0;i--)
    123                 {
    124                     q[i]=q[i-1];
    125                     *q[i]='*';
    126                 }
    127                 q[0]=q[0]-1;
    128                 *q[0]='-';
    129                 st=st+1;
    130                 df=df+1;
    131                 system("cls");
    132                 sjs(a);
    133                 sc(a);
    134             }
    135             else
    136             {
    137 
    138                 sx(a);
    139                 for(i=st-1;i>0;i--)
    140                 {
    141                     q[i]=q[i-1];
    142                     *q[i]='*';
    143                 }
    144                 q[0]=q[0]-1;
    145                 *q[0]='-';
    146                 system("cls");
    147                 sc(a);
    148                 }
    149             }
    150         else
    151             js=0;
    152     }
    153     else
    154         js=0;
    155 }
    156 void down(char a[20][20],char *q[300])
    157 {    
    158     int i,j;
    159     if(*(q[0]+20)!='@')
    160     {    
    161         if(*(q[0]+20)!='*')
    162             if(*(q[0]+20)=='!')
    163             {
    164                 sx(a);
    165                 for(i=st;i>0;i--)
    166                 {
    167                     q[i]=q[i-1];
    168                     *q[i]='*';
    169                 }
    170                 q[0]=q[0]+20;
    171                 *q[0]='|';
    172                 st=st+1;
    173                 df=df+1;
    174                 system("cls");
    175                 sjs(a);
    176                 sc(a);
    177             }
    178             else
    179             {
    180 
    181                 sx(a);
    182                 for(i=st-1;i>0;i--)
    183                 {
    184                     q[i]=q[i-1];
    185                     *q[i]='*';
    186                 }
    187                 q[0]=q[0]+20;
    188                 *q[0]='|';
    189                 system("cls");
    190                 sc(a);
    191             }
    192         else
    193             js=0;
    194     }
    195     else
    196         js=0;
    197 
    198 }
    199 void right(char a[20][20],char *q[300])
    200 {
    201     int i,j;
    202     if(*(q[0]+1)!='@')
    203     {
    204         if(*(q[0]+1)!='*')
    205         {
    206             if(*(q[0]+1)=='!')
    207             {
    208                 sx(a);
    209                 for(i=st;i>0;i--)
    210                 {
    211                     q[i]=q[i-1];
    212                     *q[i]='*';
    213                 }
    214                 q[0]=q[0]+1;
    215                 *q[0]='-';
    216                 st=st+1;
    217                 df=df+1;
    218                 system("cls");
    219                 sjs(a);
    220                 sc(a);
    221             }
    222             else
    223             {
    224 
    225                 sx(a);
    226                 for(i=st-1;i>0;i--)
    227                 {
    228                     q[i]=q[i-1];
    229                     *q[i]='*';
    230                 }
    231                 q[0]=q[0]+1;
    232                 *q[0]='-';
    233                 system("cls");
    234                 sc(a);
    235             }
    236         }
    237         else
    238             js=0;
    239     }
    240     else
    241         js=0;
    242 
    243 }
    244 void dp()
    245 {
    246         int pd;
    247         pd=_getch();
    248         if(fx=='w')
    249             if(pd=='a'||pd=='d')
    250                 fx=pd;
    251         if(fx=='a')
    252             if(pd=='w'||pd=='s')
    253                 fx=pd;
    254         if(fx=='s')
    255             if(pd=='a'||pd=='d')
    256                 fx=pd;
    257         if(fx=='d')
    258             if(pd=='w'||pd=='s')
    259                 fx=pd;
    260 
    261 }
    262 void yx()
    263 {
    264     int i,j;
    265     char a[20][20],*q[300],pd;
    266     csh(a,q);
    267     sc(a);
    268     Sleep(500);
    269     while(js==1)
    270     {
    271         if(_kbhit()!=0)
    272         {
    273         dp();
    274         }
    275         switch(fx)
    276         {
    277         case 'w':up(a,q);break;
    278         case 'a':left(a,q);break;
    279         case 's':down(a,q);break;
    280         case 'd':right(a,q);
    281         }
    282     }
    283         printf("
    很遗憾,您输了
    点击回车重开,点击空格结束
    ");
    284 
    285 }
    286 void main()
    287 {
    288     char xz=13;
    289     yx();
    290     xz=_getch();
    291     while(xz!=13)
    292     {
    293         xz=_getch();
    294         if(xz==' ')
    295             break;
    296     }
    297     if(xz==13)
    298     {
    299         system("cls");
    300         main();
    301     }
    302 }

    运行截图


    总结


    这个代码其实是四个月前写的,现在回过头来只有一个感觉。。。我当初写了啥?四个月前的代码现在已经忘了大半了,现在想重新看一遍都看不下去。所以这个博客也是凭模糊的记忆写的。。。这个代码最大的问题就是一个注释都没有,有些后来想到的一些改进的地方都因为没有注释而寸步难行,其他可以改进的部分就是一开始就定死了地图的大小,后面如果要改了话很麻烦,可以用define来定义二维数组的大小,以后要改可以直接在define改。还有就是在原代码是输入fx,然后根据w、a、s、d来传到不同的函数,每一个函数进行一个方向的行动,可以将四个函数合并为一个,判断完方向后将蛇头的位移传递到函数中,用这个函数来进行四个方向的移动

  • 相关阅读:
    关于MySQL错误 2005
    Eclipse如何导入第三方jar包
    Codeforces Round #377 (Div. 2) D. Exams
    18110 Koishi's travel, Satori's travel
    用Java做的类似皇家守卫战的游戏
    Notepad++如何编译、运行Java
    Codeforces Round #341 (Div. 2)--C. Wet Shark and Flowers
    hdu 2120 Ice_cream's world I
    FZU 1851 组合数
    HUST 1599 Multiple
  • 原文地址:https://www.cnblogs.com/hbsblog/p/12863509.html
Copyright © 2020-2023  润新知