6.C语言迷宫程序界面版

写迷宫程序首先需要安装图形库easyX 安装地址链接:https://pan.baidu.com/s/1qZwFn3m 密码:ozge

项目截图:

//左上角是七点,右下角是终点,蓝色表示的是走过的路径,红色表示的是当前位置,采用的是深度优先遍历

mg.h

 1 #pragma once
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include <stdio.h>
 4 #include <graphics.h>
 5 #include <mmsystem.h>
 6 #include <stdlib.h>
 7 #include <time.h>
 8 #include <string.h>
 9 #include "conio.h"
10 #pragma comment(lib,"winmm.lib")
11 
12 //每一个格子的像素
13 #define ELEM  20
14 //界面的宽和高
15 #define WINDOW_WIDTH 500
16 #define WINDOW_HEIGHT 500
17 
18 //枚举四个方向
19 typedef enum DIR{ up = 72, down = 80, left = 75, right = 77}DIR;
20 
21 //当前到的位置
22 int cur_x, cur_y;
23 //一共走的步数
24 int total_count = 0;
25 
26 //初始化游戏
27 void GameInit();
28 //绘制游戏
29 void GamePaint();
30 //判断能不能走
31 bool judge(int cur_x, int cur_y, char dir);
32 //人工操作移动
33 void move();
34 //判断能否成功走出来
35 bool judgeSuc(int,int);

main.cpp

  1 #include "mg.h"
  2 
  3 //初始化地图
  4 //0表示没走过的点,1表示障碍,2表示当前在的位置,3表示已经走过的路径
  5 int map[WINDOW_HEIGHT / ELEM][WINDOW_WIDTH / ELEM] = { 0 };
  6 
  7 void main()
  8 {
  9     //初始化游戏
 10     GameInit();
 11     //以下是实现人工操作
 12     //while (1)
 13     //{
 14     //    //如果没有键盘按下
 15     //    while (!_kbhit())
 16     //    {
 17     //        GamePaint();
 18     //        run(cur_x, cur_y);
 19     //    }
 20     //    move();
 21     //}
 22     system("pause");
 23 }
 24 
 25 //初始化游戏界面,并初始化地图
 26 void GameInit()
 27 {
 28     //设置窗口大小
 29     initgraph(WINDOW_HEIGHT, WINDOW_WIDTH);
 30     //设置窗口颜色
 31     setbkcolor(LIGHTGRAY);
 32     //强制绘图,显示界面
 33     cleardevice();
 34 
 35     //初始化时间种子,随机生成一个地图,并且判断地图能不能走出来
 36     srand(time(0));
 37     do
 38     {
 39         for (int i = 0; i < WINDOW_HEIGHT / ELEM; i++)
 40         {
 41             for (int j = 0; j < WINDOW_WIDTH / ELEM; j++)
 42             {
 43                 int num = rand() % 10;
 44                 if (num < 7)
 45                     map[i][j] = 0; 
 46                 else
 47                     map[i][j] = 1;
 48             }
 49         }
 50         //左上角位置是人的初始位置
 51         map[0][0] = 2;
 52         //右下角
 53         map[WINDOW_HEIGHT / ELEM - 1][WINDOW_WIDTH / ELEM - 1] = 0;
 54         GamePaint();
 55     } while (judgeSuc(0,0) == false);//如果不能走出来则继续生成迷宫
 56 }
 57 
 58 //绘制
 59 void GamePaint()
 60 {
 61     //按行绘制
 62     for (int y = 0; y < WINDOW_HEIGHT / ELEM; y++)
 63     {
 64         for (int x = 0; x < WINDOW_WIDTH / ELEM; x++)
 65         {
 66             //没有走过
 67             if (map[y][x] == 0 )
 68             {
 69                 //设置画笔颜色
 70                 setcolor(RED);
 71                 //设置填充颜色
 72                 setfillcolor(DARKGRAY);
 73                 //填充矩形
 74                 fillrectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM);
 75                 //画矩形
 76                 rectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM);
 77             }
 78 
 79             //障碍物
 80             if (map[y][x] == 1)
 81             {
 82                 setcolor(RED);
 83                 setfillcolor(BLACK);
 84                 fillrectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM);
 85                 rectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM);
 86             }
 87             
 88             //当前位置
 89             if (map[y][x] == 2)
 90             {
 91                 setcolor(RED);
 92                 setfillcolor(RED);
 93                 fillrectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM);
 94                 rectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM);
 95             }
 96 
 97             //已经走过的路径
 98             if (map[y][x] == 3)
 99             {
100                 setcolor(RED);
101                 setfillcolor(GREEN);
102                 fillrectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM);
103                 rectangle(x*ELEM, y*ELEM, (x + 1)*ELEM, (y + 1)*ELEM);
104             }
105         }
106     }
107 }
108 
109 //判断能不能走
110 bool judge(int cur_x,int cur_y,char dir)
111 {
112     switch (dir)
113     {
114     case up:
115         if (cur_y - 1 < 0 || map[cur_y - 1][cur_x] == 1 || map[cur_y - 1][cur_x] == 3)
116         {
117             return false;
118         }
119         break;
120     case down:
121         if (cur_y + 1 > WINDOW_HEIGHT / ELEM - 1 || map[cur_y + 1][cur_x] == 1 || map[cur_y + 1][cur_x] == 3)
122         {
123             return false;
124         }
125         break;
126     case left:
127         if (cur_x - 1 < 0 || map[cur_y][cur_x - 1] == 1 || map[cur_y][cur_x - 1] == 3)
128         {
129             return false;
130         }
131         break;
132     case right:
133         if (cur_x + 1 >  WINDOW_HEIGHT / ELEM - 1 || map[cur_y][cur_x + 1] == 1 || map[cur_y][cur_x + 1] == 3)
134         {
135             return false;
136         }
137         break;
138     }
139 
140     return true;
141 }
142 
143     
144 //判断地图能否走出去
145 bool judgeSuc(int cur_x, int cur_y)
146 {
147     total_count++;//走一次步数加一
148     map[cur_y][cur_x] = 3;//把走过的标记
149 
150     if (cur_x == WINDOW_WIDTH / ELEM - 1 && cur_y == WINDOW_HEIGHT / ELEM - 1)
151     {
152         char res[100];
153         sprintf(res, "成功走出迷宫,一共走了%d步", total_count);
154         MessageBoxA(0,res, "提示",0);
155         //return true;
156         return false;
157     }
158     else
159     {
160         //右下左上
161         if (judge(cur_x, cur_y, right))
162         {
163             //下一个走到的位置设置为2
164             map[cur_y][cur_x + 1] = 2;
165             //绘制当前状态,并且等待100ms
166             GamePaint();
167             Sleep(100);
168             //从下一个位置开始走
169             judgeSuc(cur_x+1, cur_y);
170             //递归还原
171             total_count--;
172         }
173 
174         if (judge(cur_x, cur_y, down))
175         {
176             map[cur_y + 1][cur_x] = 2;
177             GamePaint();
178             Sleep(100);
179             judgeSuc(cur_x, cur_y+1);
180             total_count--;
181         }
182 
183         if (judge(cur_x, cur_y, left))
184         {
185             map[cur_y][cur_x - 1] = 2;
186             map[cur_y][cur_x] = 0;
187             GamePaint();
188             Sleep(100);
189             judgeSuc(cur_x-1, cur_y);
190             total_count--;
191         }
192 
193         if (judge(cur_x, cur_y, up))
194         {
195             map[cur_y - 1][cur_x] = 2;
196             map[cur_y][cur_x] = 0;
197             GamePaint();
198             Sleep(100);
199             judgeSuc(cur_x, cur_y-1);
200             total_count--;
201         }
202 
203         if (total_count == 1)
204         {
205             return false;
206         }
207     }
208 }
209 
210 //向各个方向移动
211 void move()
212 {
213     //方向
214     char dir;
215     dir = _getch();
216 
217     //各个方向判断
218     switch (dir)
219     {
220     case up:
221         if (judge(cur_x, cur_y, up))
222         {
223             map[cur_y - 1][cur_x] = 2;
224             map[cur_y][cur_x] = 0;
225             cur_y -= 1;
226         }
227         break;
228     case down:
229         if (judge(cur_x, cur_y, down))
230         {
231             map[cur_y + 1][cur_x] = 2;
232             map[cur_y][cur_x] = 0;
233             cur_y += 1;
234         }
235         break;
236     case left:
237         if (judge(cur_x, cur_y, left))
238         {
239             map[cur_y][cur_x - 1] = 2;
240             map[cur_y][cur_x] = 0;
241             cur_x -= 1;
242         }
243         break;
244     case right:
245         if (judge(cur_x, cur_y, right))
246         {
247             map[cur_y][cur_x + 1] = 2;
248             map[cur_y][cur_x] = 0;
249             cur_x += 1;
250         }
251         break;
252     }
253 }

 

posted @ 2018-01-16 17:21  喵小喵~  阅读(1114)  评论(0编辑  收藏  举报