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 & ...
随机推荐
- 【C++】函数和指针
最近在看C++ primer plus,感觉函数与指针这一章难点比较多,记写笔记,加强理解. From C++ Primer Plus: Chapter 7 Function:C++ Programm ...
- Json相关内容
一. 导入包:net.sf.json.JSONObject 代码 import net.sf.json.JSON; import net.sf.json.JSONArray; import net.s ...
- mariadb-增删改查怎么用
MariaDB 数据类型 MariaDB数据类型可以分为数字,日期和时间以及字符串值. 使用数据类型的原则:够用就行,尽量使用范围小的,而不用大的 常用的数据类型 整数:int, (bit比整数还要小 ...
- VUEJS开发规范
VUEJS开发规范 基于组件化开发理解 组件命名规范 结构化规范 注释规范 编码规范 基于组件化开发理解 什么是组件? ``` 组件其实就是页面组成的一部分,好比是电脑中的每一个元件(如硬盘.键盘.鼠 ...
- nginx proxy_set_header设置,自定义header
在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了ng ...
- @SpringBootApplication cannot be resolved to a type In STS
@SpringBootApplication cannot be resolved to a type In STS 学习了:https://stackoverflow.com/questions/4 ...
- CCEditBox/CCEditBoxImplAndroid
#ifndef __CCEDITBOXIMPLANDROID_H__ #define __CCEDITBOXIMPLANDROID_H__ #include "cocos2d.h" ...
- css 清楚浮动的8种方式
清除浮动是每个 web前台设计师必须掌握的机能. css清除浮动大全,共8种方法. 浮动会使当前标签产生向上浮的效果,同一时候会影响到前后标签.父级标签的位置及 width height 属性.并且相 ...
- nj11--http
概念:Node.js提供了http模块.其中封装了一个高效的HTTP服务器和一个建议的HTTP客户端. http.server是一个基于事件的HTTP服务器.内部有C++实现.接口由JavaScrip ...
- sass05 数据类型,数据运算
/*! 数字类型 */ $n1: 1.2; $n2: 12; $n3: 14px; p{ font-size: $n3; } /*! 字符串类型*/ $s1: container; $s2: 'con ...