zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Msql-51CTO笔记
    Elasticsearch 学习第一天
    大数据开发参考资料
    1.docker的安装
    java_根据实体字段中的中文汉字排序
    遍历set集合,进行数据的拼接
    关于integer 和int
    03.linux环境安装mysql8的安装包
    02.linux下面安装jdk8
    01.VMware15.5下安装Centos7
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8297707.html
Copyright © 2011-2022 走看看