zoukankan      html  css  js  c++  java
  • C语言实现迷宫小游戏

    代码如下,时间太晚,有空补注释:

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<time.h>
      4 #include<stdlib.h>
      5 #include<windows.h>
      6 #define n 21
      7 #define m 37
      8 #define up 1
      9 #define down 2
     10 #define left 3
     11 #define right 4
     12 #define Key_Up 72
     13 #define Key_Down 80
     14 #define Key_Right 77
     15 #define Key_Left 75
     16 typedef struct Point
     17 {
     18     int x;
     19     int y;
     20     int pos;
     21 }point;
     22 HANDLE h_out_buf;//缓冲技术解决闪屏
     23 COORD coord={0,0};
     24 DWORD bytes=0;
     25 char data[n+2][m*2+4];
     26 int maze[n+2][m+2];
     27 point p[10000];
     28 int l=0;
     29 point start,end;
     30 void add(point t)
     31 {
     32     p[l]=t;
     33     l++;
     34 }
     35 void add_neibor(point t)//将当前点周围的邻墙加入数组中
     36 {
     37     point q;
     38     if(t.x+1<=n)
     39     {
     40         q=t;
     41         q.x=t.x+1;
     42         q.pos=down;
     43         add(q);
     44     }
     45     if(t.x-1>=1)
     46     {
     47         q=t;
     48         q.x=t.x-1;
     49         q.pos=up;
     50         add(q);
     51     }
     52     if(t.y+1<=m)
     53     {
     54         q=t;
     55         q.y=t.y+1;
     56         q.pos=right;
     57         add(q);
     58     }
     59     if(t.y-1>=1)
     60     {
     61         q=t;
     62         q.y=t.y-1;
     63         q.pos=left;
     64         add(q);
     65     }
     66 }
     67 void del(int index)
     68 {
     69     int i;
     70     for(i=index;i<l-1;i++)
     71         p[i]=p[i+1];
     72     l--;
     73 }
     74 void show_maze()
     75 {
     76     int i,j;
     77     for(i=0;i<n+2;i++)
     78     {
     79         for(j=0;j<m+2;j++)
     80         {
     81             if(!maze[i][j])
     82             {
     83                 data[i][2*j]='*';
     84                 data[i][2*j+1]=' ';
     85             }
     86             else if(maze[i][j]==1)
     87             {
     88                 data[i][2*j]=' ';
     89                 data[i][2*j+1]=' ';
     90             }
     91             else if(maze[i][j]==2)
     92             {
     93                 data[i][2*j]=2;
     94                 data[i][2*j+1]=' ';
     95             }
     96             else
     97             {
     98                 data[i][2*j]=1;
     99                 data[i][2*j+1]=' ';
    100             }
    101         }
    102     }
    103     for(i=0;i<n+2;i++)
    104     {
    105         coord.Y=i;
    106         WriteConsoleOutputCharacterA(h_out_buf, data[i], 2*j, coord, &bytes);
    107     }
    108     SetConsoleActiveScreenBuffer(h_out_buf);
    109 }
    110 void creat_maze()
    111 {
    112     int i,j,x,y;
    113     point q;
    114     memset(maze,0,sizeof(maze));
    115     srand((unsigned)time(NULL));
    116     start.x=1;
    117     start.y=1;
    118     end.x=n;
    119     end.y=m;
    120     maze[1][1]=1;
    121     add_neibor(start);
    122     while(l)
    123     {
    124         int r=rand()%l;
    125         if(p[r].pos==up)
    126         {
    127             x=p[r].x-1;
    128             y=p[r].y;
    129         }
    130         if(p[r].pos==down)
    131         {
    132             x=p[r].x+1;
    133             y=p[r].y;
    134         }
    135         if(p[r].pos==left)
    136         {
    137             x=p[r].x;
    138             y=p[r].y-1;
    139         }
    140         if(p[r].pos==right)
    141         {
    142             x=p[r].x;
    143             y=p[r].y+1;
    144         }
    145         if(maze[x][y]==0)
    146         {
    147             maze[p[r].x][p[r].y]=1;
    148             maze[x][y]=1;
    149             q.x=x;
    150             q.y=y;
    151             add_neibor(q);
    152         }
    153         del(r);
    154     }
    155     maze[start.x][start.y]=2;
    156     maze[end.x][end.y]=3;
    157 }
    158 void win()
    159 {
    160     int i,j;
    161     char a[30]="CONGRATULATIONS!";
    162     char b[30]="YOU WIN THIS GAME!";
    163     char c[30]="AUTHOR:天道铸魂";
    164     char d[30]="按任意键结束游戏";
    165     memset(data,0,sizeof(data));
    166     for(i=0;i<n+2;i++)
    167     {
    168         for(j=0;j<m+2;j++)
    169         {
    170             data[i][2*j]=' ';
    171             data[i][2*j+1]=' ';
    172         }
    173     }
    174     strcpy(data[7]+31,a);
    175     strcpy(data[9]+30,b);
    176     strcpy(data[11]+31,c);
    177     strcpy(data[18]+30,d);
    178     for(i=0;i<n+2;i++)
    179     {
    180         coord.Y=i;
    181         WriteConsoleOutputCharacterA(h_out_buf, data[i], 2*j, coord, &bytes);
    182     }
    183     SetConsoleActiveScreenBuffer(h_out_buf);
    184 }
    185 void play_game()
    186 {
    187     int key1,key;
    188     point now;
    189     now.x=now.y=1;
    190     while(1)
    191     {
    192         show_maze();
    193         if(now.x==n&&now.y==m)
    194         {
    195             system("cls");
    196             win();
    197             break;
    198         }
    199         key1=getch();
    200         key=getch();
    201         if(key==Key_Up)
    202         {
    203             if(now.x-1>0)
    204             {
    205                 if(maze[now.x-1][now.y])
    206                 {
    207                     maze[now.x][now.y]=1;
    208                     now.x--;
    209                     maze[now.x][now.y]=2;
    210                 }
    211             }
    212         }
    213         else if(key==Key_Down)
    214         {
    215             if(now.x+1<=n)
    216             {
    217                 if(maze[now.x+1][now.y])
    218                 {
    219                     maze[now.x][now.y]=1;
    220                     now.x++;
    221                     maze[now.x][now.y]=2;
    222                 }
    223             }
    224         }    
    225         else if(key==Key_Left)
    226         {
    227             if(now.y-1>0)
    228             {
    229                 if(maze[now.x][now.y-1])
    230                 {
    231                     maze[now.x][now.y]=1;
    232                     now.y--;
    233                     maze[now.x][now.y]=2;
    234                 }
    235             }
    236             
    237         }
    238         else if(key==Key_Right)
    239         {
    240             if(now.y+1>0)
    241             {
    242                 if(maze[now.x][now.y+1])
    243                 {
    244                     maze[now.x][now.y]=1;
    245                     now.y++;
    246                     maze[now.x][now.y]=2;
    247                 }
    248             }
    249         }
    250     }
    251 }
    252 void start_game()
    253 {
    254     creat_maze();
    255     play_game();
    256 }
    257 int main()
    258 {
    259     h_out_buf = CreateConsoleScreenBuffer(GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CONSOLE_TEXTMODE_BUFFER,NULL);
    260     CONSOLE_CURSOR_INFO cci;
    261     cci.bVisible = 0;
    262     cci.dwSize = 1;
    263     SetConsoleCursorInfo(h_out_buf, &cci);
    264     start_game();
    265     return 0;
    266 }
  • 相关阅读:
    使用 star UML制作的图
    评价片段
    项目部分
    用新学的知识 写了一段小代码
    常用系统存储过程
    考试小总结
    分页
    行转列面试题 事例
    子查询
    生成验证码的方法集合(一)
  • 原文地址:https://www.cnblogs.com/search-the-universe/p/9136784.html
Copyright © 2011-2022 走看看