C语言实现迷宫小游戏
代码如下,时间太晚,有空补注释:
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#define n 21
#define m 37
#define up 1
#define down 2
#define left 3
#define right 4
#define Key_Up 72
#define Key_Down 80
#define Key_Right 77
#define Key_Left 75
typedef struct Point
{
int x;
int y;
int pos;
}point;
HANDLE h_out_buf;//缓冲技术解决闪屏
COORD coord={,};
DWORD bytes=;
char data[n+][m*+];
int maze[n+][m+];
point p[];
int l=;
point start,end;
void add(point t)
{
p[l]=t;
l++;
}
void add_neibor(point t)//将当前点周围的邻墙加入数组中
{
point q;
if(t.x+<=n)
{
q=t;
q.x=t.x+;
q.pos=down;
add(q);
}
if(t.x->=)
{
q=t;
q.x=t.x-;
q.pos=up;
add(q);
}
if(t.y+<=m)
{
q=t;
q.y=t.y+;
q.pos=right;
add(q);
}
if(t.y->=)
{
q=t;
q.y=t.y-;
q.pos=left;
add(q);
}
}
void del(int index)
{
int i;
for(i=index;i<l-;i++)
p[i]=p[i+];
l--;
}
void show_maze()
{
int i,j;
for(i=;i<n+;i++)
{
for(j=;j<m+;j++)
{
if(!maze[i][j])
{
data[i][*j]='*';
data[i][*j+]=' ';
}
else if(maze[i][j]==)
{
data[i][*j]=' ';
data[i][*j+]=' ';
}
else if(maze[i][j]==)
{
data[i][*j]=;
data[i][*j+]=' ';
}
else
{
data[i][*j]=;
data[i][*j+]=' ';
}
}
}
for(i=;i<n+;i++)
{
coord.Y=i;
WriteConsoleOutputCharacterA(h_out_buf, data[i], *j, coord, &bytes);
}
SetConsoleActiveScreenBuffer(h_out_buf);
}
void creat_maze()
{
int i,j,x,y;
point q;
memset(maze,,sizeof(maze));
srand((unsigned)time(NULL));
start.x=;
start.y=;
end.x=n;
end.y=m;
maze[][]=;
add_neibor(start);
while(l)
{
int r=rand()%l;
if(p[r].pos==up)
{
x=p[r].x-;
y=p[r].y;
}
if(p[r].pos==down)
{
x=p[r].x+;
y=p[r].y;
}
if(p[r].pos==left)
{
x=p[r].x;
y=p[r].y-;
}
if(p[r].pos==right)
{
x=p[r].x;
y=p[r].y+;
}
if(maze[x][y]==)
{
maze[p[r].x][p[r].y]=;
maze[x][y]=;
q.x=x;
q.y=y;
add_neibor(q);
}
del(r);
}
maze[start.x][start.y]=;
maze[end.x][end.y]=;
}
void win()
{
int i,j;
char a[]="CONGRATULATIONS!";
char b[]="YOU WIN THIS GAME!";
char c[]="AUTHOR:天道铸魂";
char d[]="按任意键结束游戏";
memset(data,,sizeof(data));
for(i=;i<n+;i++)
{
for(j=;j<m+;j++)
{
data[i][*j]=' ';
data[i][*j+]=' ';
}
}
strcpy(data[]+,a);
strcpy(data[]+,b);
strcpy(data[]+,c);
strcpy(data[]+,d);
for(i=;i<n+;i++)
{
coord.Y=i;
WriteConsoleOutputCharacterA(h_out_buf, data[i], *j, coord, &bytes);
}
SetConsoleActiveScreenBuffer(h_out_buf);
}
void play_game()
{
int key1,key;
point now;
now.x=now.y=;
while()
{
show_maze();
if(now.x==n&&now.y==m)
{
system("cls");
win();
break;
}
key1=getch();
key=getch();
if(key==Key_Up)
{
if(now.x->)
{
if(maze[now.x-][now.y])
{
maze[now.x][now.y]=;
now.x--;
maze[now.x][now.y]=;
}
}
}
else if(key==Key_Down)
{
if(now.x+<=n)
{
if(maze[now.x+][now.y])
{
maze[now.x][now.y]=;
now.x++;
maze[now.x][now.y]=;
}
}
}
else if(key==Key_Left)
{
if(now.y->)
{
if(maze[now.x][now.y-])
{
maze[now.x][now.y]=;
now.y--;
maze[now.x][now.y]=;
}
} }
else if(key==Key_Right)
{
if(now.y+>)
{
if(maze[now.x][now.y+])
{
maze[now.x][now.y]=;
now.y++;
maze[now.x][now.y]=;
}
}
}
}
}
void start_game()
{
creat_maze();
play_game();
}
int main()
{
h_out_buf = CreateConsoleScreenBuffer(GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CONSOLE_TEXTMODE_BUFFER,NULL);
CONSOLE_CURSOR_INFO cci;
cci.bVisible = ;
cci.dwSize = ;
SetConsoleCursorInfo(h_out_buf, &cci);
start_game();
return ;
}
C语言实现迷宫小游戏的更多相关文章
- c++迷宫小游戏
c++迷宫小游戏 一.总结 一句话总结: 显示:根据map数组输出图像 走动:修改map数组的值,每走一步重新刷新一下图像就好 1.如果走函数用z(),出现输入s会向下走多步的情况,原因是什么? 向下 ...
- 我用数据结构花了一夜给女朋友写了个h5走迷宫小游戏
目录 起因 分析 画线(棋盘) 画迷宫 方块移动 结语 @(文章目录) 先看效果图(在线电脑尝试地址http://biggsai.com/maze.html): 起因 又到深夜了,我按照以往在公众号写 ...
- 用Java语言编写的迷宫小游戏软件
可查看本项目的github 源码链接,撒娇打滚求 star 哦~~ღ( ´・ᴗ・ ` )比心 本仓库代码是经过 eclipse 编译运行过的,一般情况下将本仓库代码下载下来之后,使用 eclipse ...
- 简单的C语言猜数字小游戏
猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include <st ...
- C语言实现2048小游戏
目录 2048 一.设计思路 1.游戏规则 2.思路 二.代码实现 1.存储结构 2.初始化游戏数据 3.向左合并 4.其他方向合并 5.产生新的方块 6.源代码 7.实例演示 三.问题 2048 一 ...
- 基于HTML5的WebGL实现的2D3D迷宫小游戏
为了实现一个基于HTML5的场景小游戏,我采用了HT for Web来实现,短短200行代码,我就能实现用"第一人称"来操作前进后退上下左右,并且实现了碰撞检测. 先来看下实现的效 ...
- c语言----<项目>_小游戏<2048>
2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...
- h5小球走迷宫小游戏源码
无意中找到的一个挺有意思的小游戏,关键是用h5写的,下面就分享给大家源码 还是先来看小游戏的截图 可以用键盘的三个键去控制它,然后通关 下面是源代码 <!doctype html> < ...
- 利用c语言做简单的迷宫小游戏
#include <stdio.h> #define ROW 6 #define COL 6 // 封装打印地图的函数 void printMap(c ...
随机推荐
- linux安装git方法
用git --version命令检查是否已经安装 在CentOS5的版本,由于yum源中没有git,所以需要预先安装一系列的依赖包.在CentOS6的yum源中已经有git的版本了,可以直接使用yum ...
- java集合性能
https://www.cnblogs.com/xyhuangjinfu/p/5429644.html
- C. Queen Codeforces Round #549 (Div. 2) (搜索)
---恢复内容开始--- You are given a rooted tree with vertices numerated from 11 to nn . A tree is a connect ...
- lstm bptt推导
深蓝 nlp 180429这个有详细的讲解
- Java_图片切片
package com.creditease.fetch.credit.util.similarity; import java.awt.image.BufferedImage; import jav ...
- (75)Wangdao.com第十三天_JavaScript 包装对象
包装对象 所谓“包装对象”,就是分别与数值.字符串.布尔值相对应的Number.String.Boolean三个原生对象 这三个原生对象可以把原始类型的值变成(包装成)对象 var v1 = new ...
- 03_ if 练习 _ little2big
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 20175320 2018-2019-2 《Java程序设计》第6周学习总结
20175320 2018-2019-2 <Java程序设计>第6周学习总结 教材学习内容总结 本周学习了教材的第七及第十章的内容.在这两章中介绍了接内部类与异常类以及输入.输出流,第七章 ...
- ETL数据采集方法
1.触发器方式 触发器方式是普遍采取的一种增量抽取机制.该方式是根据抽取要求,在要被抽取的源表上建立插入.修改.删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个增量日志表 ...
- LeetCode 122 Best Time to Buy and Sell Stock II 解题报告
题目要求 Say you have an array for which the ith element is the price of a given stock on day i. Design ...