6.C语言迷宫程序界面版
写迷宫程序首先需要安装图形库easyX 安装地址链接:https://pan.baidu.com/s/1qZwFn3m 密码:ozge
项目截图:
//左上角是七点,右下角是终点,蓝色表示的是走过的路径,红色表示的是当前位置,采用的是深度优先遍历
mg.h
- #pragma once
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <graphics.h>
- #include <mmsystem.h>
- #include <stdlib.h>
- #include <time.h>
- #include <string.h>
- #include "conio.h"
- #pragma comment(lib,"winmm.lib")
- //每一个格子的像素
- #define ELEM 20
- //界面的宽和高
- #define WINDOW_WIDTH 500
- #define WINDOW_HEIGHT 500
- //枚举四个方向
- typedef enum DIR{ up = , down = , left = , right = }DIR;
- //当前到的位置
- int cur_x, cur_y;
- //一共走的步数
- int total_count = ;
- //初始化游戏
- void GameInit();
- //绘制游戏
- void GamePaint();
- //判断能不能走
- bool judge(int cur_x, int cur_y, char dir);
- //人工操作移动
- void move();
- //判断能否成功走出来
- bool judgeSuc(int,int);
main.cpp
- #include "mg.h"
- //初始化地图
- //0表示没走过的点,1表示障碍,2表示当前在的位置,3表示已经走过的路径
- int map[WINDOW_HEIGHT / ELEM][WINDOW_WIDTH / ELEM] = { };
- void main()
- {
- //初始化游戏
- GameInit();
- //以下是实现人工操作
- //while (1)
- //{
- // //如果没有键盘按下
- // while (!_kbhit())
- // {
- // GamePaint();
- // run(cur_x, cur_y);
- // }
- // move();
- //}
- system("pause");
- }
- //初始化游戏界面,并初始化地图
- void GameInit()
- {
- //设置窗口大小
- initgraph(WINDOW_HEIGHT, WINDOW_WIDTH);
- //设置窗口颜色
- setbkcolor(LIGHTGRAY);
- //强制绘图,显示界面
- cleardevice();
- //初始化时间种子,随机生成一个地图,并且判断地图能不能走出来
- srand(time());
- do
- {
- for (int i = ; i < WINDOW_HEIGHT / ELEM; i++)
- {
- for (int j = ; j < WINDOW_WIDTH / ELEM; j++)
- {
- int num = rand() % ;
- if (num < )
- map[i][j] = ;
- else
- map[i][j] = ;
- }
- }
- //左上角位置是人的初始位置
- map[][] = ;
- //右下角
- map[WINDOW_HEIGHT / ELEM - ][WINDOW_WIDTH / ELEM - ] = ;
- GamePaint();
- } while (judgeSuc(,) == false);//如果不能走出来则继续生成迷宫
- }
- //绘制
- void GamePaint()
- {
- //按行绘制
- for (int y = ; y < WINDOW_HEIGHT / ELEM; y++)
- {
- for (int x = ; x < WINDOW_WIDTH / ELEM; x++)
- {
- //没有走过
- if (map[y][x] == )
- {
- //设置画笔颜色
- setcolor(RED);
- //设置填充颜色
- setfillcolor(DARKGRAY);
- //填充矩形
- fillrectangle(x*ELEM, y*ELEM, (x + )*ELEM, (y + )*ELEM);
- //画矩形
- rectangle(x*ELEM, y*ELEM, (x + )*ELEM, (y + )*ELEM);
- }
- //障碍物
- if (map[y][x] == )
- {
- setcolor(RED);
- setfillcolor(BLACK);
- fillrectangle(x*ELEM, y*ELEM, (x + )*ELEM, (y + )*ELEM);
- rectangle(x*ELEM, y*ELEM, (x + )*ELEM, (y + )*ELEM);
- }
- //当前位置
- if (map[y][x] == )
- {
- setcolor(RED);
- setfillcolor(RED);
- fillrectangle(x*ELEM, y*ELEM, (x + )*ELEM, (y + )*ELEM);
- rectangle(x*ELEM, y*ELEM, (x + )*ELEM, (y + )*ELEM);
- }
- //已经走过的路径
- if (map[y][x] == )
- {
- setcolor(RED);
- setfillcolor(GREEN);
- fillrectangle(x*ELEM, y*ELEM, (x + )*ELEM, (y + )*ELEM);
- rectangle(x*ELEM, y*ELEM, (x + )*ELEM, (y + )*ELEM);
- }
- }
- }
- }
- //判断能不能走
- bool judge(int cur_x,int cur_y,char dir)
- {
- switch (dir)
- {
- case up:
- if (cur_y - < || map[cur_y - ][cur_x] == || map[cur_y - ][cur_x] == )
- {
- return false;
- }
- break;
- case down:
- if (cur_y + > WINDOW_HEIGHT / ELEM - || map[cur_y + ][cur_x] == || map[cur_y + ][cur_x] == )
- {
- return false;
- }
- break;
- case left:
- if (cur_x - < || map[cur_y][cur_x - ] == || map[cur_y][cur_x - ] == )
- {
- return false;
- }
- break;
- case right:
- if (cur_x + > WINDOW_HEIGHT / ELEM - || map[cur_y][cur_x + ] == || map[cur_y][cur_x + ] == )
- {
- return false;
- }
- break;
- }
- return true;
- }
- //判断地图能否走出去
- bool judgeSuc(int cur_x, int cur_y)
- {
- total_count++;//走一次步数加一
- map[cur_y][cur_x] = ;//把走过的标记
- if (cur_x == WINDOW_WIDTH / ELEM - && cur_y == WINDOW_HEIGHT / ELEM - )
- {
- char res[];
- sprintf(res, "成功走出迷宫,一共走了%d步", total_count);
- MessageBoxA(,res, "提示",);
- //return true;
- return false;
- }
- else
- {
- //右下左上
- if (judge(cur_x, cur_y, right))
- {
- //下一个走到的位置设置为2
- map[cur_y][cur_x + ] = ;
- //绘制当前状态,并且等待100ms
- GamePaint();
- Sleep();
- //从下一个位置开始走
- judgeSuc(cur_x+, cur_y);
- //递归还原
- total_count--;
- }
- if (judge(cur_x, cur_y, down))
- {
- map[cur_y + ][cur_x] = ;
- GamePaint();
- Sleep();
- judgeSuc(cur_x, cur_y+);
- total_count--;
- }
- if (judge(cur_x, cur_y, left))
- {
- map[cur_y][cur_x - ] = ;
- map[cur_y][cur_x] = ;
- GamePaint();
- Sleep();
- judgeSuc(cur_x-, cur_y);
- total_count--;
- }
- if (judge(cur_x, cur_y, up))
- {
- map[cur_y - ][cur_x] = ;
- map[cur_y][cur_x] = ;
- GamePaint();
- Sleep();
- judgeSuc(cur_x, cur_y-);
- total_count--;
- }
- if (total_count == )
- {
- return false;
- }
- }
- }
- //向各个方向移动
- void move()
- {
- //方向
- char dir;
- dir = _getch();
- //各个方向判断
- switch (dir)
- {
- case up:
- if (judge(cur_x, cur_y, up))
- {
- map[cur_y - ][cur_x] = ;
- map[cur_y][cur_x] = ;
- cur_y -= ;
- }
- break;
- case down:
- if (judge(cur_x, cur_y, down))
- {
- map[cur_y + ][cur_x] = ;
- map[cur_y][cur_x] = ;
- cur_y += ;
- }
- break;
- case left:
- if (judge(cur_x, cur_y, left))
- {
- map[cur_y][cur_x - ] = ;
- map[cur_y][cur_x] = ;
- cur_x -= ;
- }
- break;
- case right:
- if (judge(cur_x, cur_y, right))
- {
- map[cur_y][cur_x + ] = ;
- map[cur_y][cur_x] = ;
- cur_x += ;
- }
- break;
- }
- }
6.C语言迷宫程序界面版的更多相关文章
- Hybrid App是如何实现网页语言与程序语言的混合?谁占主体?
[编者按]本文作者@徐珂铭,一位看好Html5的移动互联网的从业人士.喜爱玩技术,会点JAVA.HTML及CSS,有自己的想法及姑且能表达想法的文字,因此有了自己的文章. 基于HTML5的Web Ap ...
- 通过反汇编C语言小程序学习Liunx汇编语言
大家好! 我是来自山东师范大学的吴乐. 今天在<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- windows系统下c语言暂停程序
原文:windows系统下c语言暂停程序 windows系统下,很多C语言初学者的调试时,往往没看到结果程序就退出了,据我所知的方法主要有以下几种 方法一: #include int main() { ...
- Linux下简单C语言小程序的反汇编分析
韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...
- C语言应用程序的内存图
1.综述 c语言应用程序加载到内存,这时它所占据的内存分为四个区,分别为栈Stack,堆Heap,静态存储区Static Area,代码存储区Code Area,这四个区分别放置应用程序的不同部分,从 ...
- c语言小程序以及java生成注释文档方法
c语言小程序:sizeof和strlen() sizeof运算符以字节为单位给出数据的大小,strlen()函数以字符为单位给出字符串的长度,字符和字节不是一回事. char类型用于存储字母和标点符号 ...
- C语言编程程序的内存如何布局
重点关注以下内容: C语言程序在内存中各个段的组成 C语言程序连接过程中的特性和常见错误 C语言程序的运行方式 一:C语言程序的存储区域 由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过 ...
- C语言小程序——推箱子(窄字符和宽字符)
C语言小程序——推箱子(窄字符Version) 推箱子.c #include <stdio.h> #include <conio.h> #include <stdlib. ...
- Linux C语言小程序
Linux C语言小程序 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include & ...
随机推荐
- BZOJ 3129 [SDOI2013]方程 (拓展Lucas)
题目大意:给定一个方程$X_{1}+X_{2}+X_{3}+X_{4}+...+X_{n}=M$,$\forall X_{i}<=A_{i} (i<=n1)$ $\forall X_{i} ...
- spring boot ---web应用开发-错误处理
一.错误的处理 方法一:Spring Boot 将所有的错误默认映射到/error, 实现ErrorController @Controller @RequestMapping(value = &qu ...
- HTTP 文件共享服务器工具 - chfs
CuteHttpFileServer/chfs是一个免费的.HTTP协议的文件共享服务器,使用浏览器可以快速访问.它具有以下特点: 单个文件,整个软件只有一个可执行程序,无配置文件等其他文件 跨平台运 ...
- 紫书 习题8-14 UVa 1616(二分+小数化分数+精度)
参考了https://www.cnblogs.com/dwtfukgv/p/5645446.html (1)直接二分答案.说实话我没有想到, 一开始以为是贪心, 以某种策略能得到最优解. 但是想了很久 ...
- 第一个JavaWeb工程
这个工程主要用来研究log4j,所以就只有一个页面,希望以后慢慢进步. java动态生成网页主要使用servlet.把请求拦截下来,处理后返回结果. 这里创建的是一个maven工程. 结构如下:
- Mysql学习总结(26)——MySQL子查询
mysql中虽然有连接查询实现多表连接查询,但是连接查询的性能很差,因此便出现了子查询. 1.理论上,子查询可以出现在查询语句的任何位置,但实际应用中多出现在from后和where后.出现在from后 ...
- Camera Calibration 相机标定:原理简介(三)
3 绝对圆锥曲线 在进一步了解相机标定前,有必要了解绝对圆锥曲线(Absolute Conic)这一概念. 对于一个3D空间的点x,其投影空间的坐标为:x~=[x1,x2,x3,x4]T.我们定义无穷 ...
- Effective C++ 11-17
11.为须要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符. 显然,由于动态内存分配,绝对会有深浅拷贝的问题,要重写拷贝构造函数.使其为深拷贝,才干实现真正意义上的拷贝.这是我理解的关于要声明拷 ...
- [android]DES/3DES/AES加密方式
DES 支持8位加密解密,3Des支持24位,Aes支持32位.3Des是Des算法做三次.位数的单位是字节byte.不是bits. 3Des是把24位分成3组.第一组八位用来加密,第二组8位用于解密 ...
- hdoj--5562--Clarke and food(模拟)
Clarke and food Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...