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 & ...
随机推荐
- Vue内置指令
v-text 类型: string用法: 更新元素的 textContent.如果要更新部分的 textContent ,需要使用 {{ Mustache }} 插值. v-html 类型: stri ...
- NYIST 1108 最低的惩罚
最低的惩罚 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 那么现在问题就来了... 给你N(1=<N<=15)个任务,每个任务有一个截止完成时间t(1= ...
- MAC中Parallels Desktop windows忘记密码的解决办法
由于工作或是生活,在国内的环境下我们总有些时候要用到Windows才能完成某些任务,对于不经常使用Windows的用户,相信在虚拟机上安装一个Windows是不错的选择.小编就使用了Paralles ...
- Android实战简易教程-第二十八枪(Uri转String型实例)
接上一篇文章.我们能够轻易的获取所选图片的uri,那么我们考虑怎样将获取的uri转换成String型的地址呢? 接下来我们通过实例来研究.布局文件和上篇(二十七枪)一致,我们就不再列出,直接看Main ...
- 福建省赛-- Common Tangents(数学几何)
Problem B Common Tangents Accept: 191 Submit: 608 Time Limit: 1000 mSec Memory Limit : 32768 K ...
- 解读邮箱正则表达式:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
转自:http://www.cnblogs.com/joyceTING/archive/2013/05/09/3069089.html正则表达式 \w+([-+.]\w+)*@\w+([-.]\w+) ...
- 文件共享服务器nfs搭建过程
网络文件共享服务器192. yum install -y nfs-utils 在exports文件中添加的从机范围 vim /etc/exports /home/nfs/ (rw,sync,fsid= ...
- OpenCV问题集锦,图片显示不出来的问题,cvWaitKey(0),不能读图片,未经处理的异常,等问题集合
昨天根据uc伯克利的人工图像分割文件.seg,显示图像的时候调用了OpenCV的库函数,图片都能用imwrite写好,但是imshow死活显示不出来. 今天早上发现原来是imshow()后面应该加上: ...
- 【DNN 系列】 添加模块后不显示
添加模块后不显示分为几个原因 1.检查.dnn文件是否填写正确,要和对应的页面文件对应上 我有一步是这这个名称地方我填上了 就不显示了.这里需要注意,VIEW 的名城是不需要写的 2.重写文件 实体操 ...
- springboot整合redis,并解决乱码问题。
热烈推荐:超多IT资源,尽在798资源网 springboot 版本为 1.5.9 //如果是2.x 修改 pom.xml 也可切换成 1.5.9 <parent> <groupId ...