【CCpp程序设计2017】迷宫游戏
大一寒假作业!写了第一个小游戏!
//maze_test By lizitong
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h> int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
char a[111][111];
int coin;
int n=5,m;
int px[10011],py[10011],e;
int xs[11][11],ys[11][11],step,steplim;
char pr[111][111]; int Abs(int x);
void lose();//判断失败
void print(int x,int y);//更新地图 int main(){
//输出游戏说明
printf("\n\n\n\n\n");
printf("\t这是一个迷宫游戏!\n");
printf("\t“#”代表墙壁,“*”代表整个迷宫的边界,这两种地方都不能踩踏!\n");
printf("\t“o”代表你的位置,用方向键控制你的移动!\n");
printf("\t当你走到出口(即边界的缺口处)时,你就获胜了!整个迷宫只有一个出口!\n");
printf("\t你需要在规定的步数以内走出迷宫,你选择的难度等级越大,规定的步数越少!\n");
printf("\t你可以在迷宫里捡到金币!以“G”表示!\n");
printf("\t你最终的得分将根据迷宫结构、剩余步数、你选择的难度等级、\n\t捡到的金币数进行计算!\n");
printf("\n\n");
printf("\t\t作者:李子通,电子科技大学 计算机科学与工程学院\n\n\t\t2017年2月");
printf("\n\n\n\t按任意键继续\n");
printf("\n\n\n\n");
while(!kbhit());
getch();
system("cls");
printf("\n\n\n\n\n\n\n\n\n");
printf("\t请输入迷宫大小(下限为5,上限为30)\n\n\t小于5会默认迷宫大小为5×5,大于30会默认迷宫大小为30×30\n\n\t按下回车确认\n\n\t");
scanf("%d",&n);
if(n<5){
n=5;
}
if(n>30){
n=30;
}
system("cls");
printf("\n\n\n\n\n\n\n\n\n");
printf("\t请输入难度等级(下限为1,上限为3)\n\n\t小于1会默认为难度1,大于3会默认为难度3\n\n\t按下回车确认\n\n\t");
scanf("%d",&m);
if(m<1){
m=1;
}
if(m>3){
m=3;
}
int xishu[4]={0,1,3,9};
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf("\t按任意键开始游戏!迷宫大小:%d×%d 难度等级:%d\n\n\t",n,n,m);
while(!kbhit());
getch();
system("cls"); //随机生成迷宫地图
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
a[i][j]='#';
}
}
for(int i=0;i<=n+1;++i){
a[0][i]=a[n+1][i]='*';
}
for(int i=1;i<=n;++i){
a[i][0]=a[i][n+1]='*';
}
px[++e]=1;
py[e]=1;
px[++e]=n;
py[e]=n;
srand(time(0));
int x=1,y=1;
while(x<=n&&y<=n){//先构造一条从左上到右下的通路
a[x][y]=' ';
if(x==n){
++y;
}
else if(y==n){
++x;
}
else{
int dir=rand()%2;
if(dir){
++x;
}
else{
++y;
}
}
}
//随机生成空格总数
int space_sum=n*2-1;
int chushu=rand()%5+1;
while(chushu<2){
chushu=rand()%5+1;
}
chushu=2;
int lim=n*n/chushu;
if(lim<space_sum){
lim=space_sum;
}
//根据难度生成步数限制
int xishu2[4];
if(n<10){
xishu2[3]=3;
xishu2[2]=5;
xishu2[1]=8;
}
else if(n<20){
xishu2[3]=5;
xishu2[2]=7;
xishu2[1]=11;
}
else{
xishu2[3]=7;
xishu2[2]=9;
xishu2[1]=14;
}
if(m==1){
steplim=(n*2-1)*xishu2[m]/2-(lim-space_sum)/5;
}
else if(m==2){
steplim=(n*2-1)*xishu2[m]/2-(lim-space_sum)/4;
}
else{
steplim=(n*2-1)*xishu2[m]/2-(lim-space_sum)/3;
}
while(space_sum<lim){//随机进行挖掘
int x=rand()%n+1,y=rand()%n+1;
while(a[x][y]=='#'){
x=rand()%n+1;
y=rand()%n+1;
}
int op=rand()%4;
x=x+dx[op];
y=y+dy[op];
if(a[x][y]=='#'){
while(x>=1 && x<=n && y>=1 && y<=n){
if(a[x][y]==' '){
break;
}
int rnd=rand()%(n/2);
if(!rnd){
break;
}
a[x][y]=' ';
if(x==1 || x==n || y==1 || y==n){
px[++e]=x;
py[e]=y;
}
++space_sum;
if(space_sum==lim){
break;
}
x=x+dx[op];
y=y+dy[op];
}
}
} //随机生成硬币
int coins=rand()%(lim/5)+1,sidescnt=0;
for(int i=1;i<=coins;++i){
x=rand()%n+1;
y=rand()%n+1;
while(a[x][y]!=' ' || ((x==1 || x==n ||y==1 || y==n) && sidescnt==e-1)){
x=rand()%n+1;
y=rand()%n+1;
}
a[x][y]='G';
if(x==1 || x==n || y==1 || y==n){
++sidescnt;
}
} //随机构造起点终点
int id=rand()%e+1;
int id2=rand()%e+1;
while(id2==id || Abs(px[id]-px[id2])+Abs(py[id]-py[id2])<=n/2 || a[px[id]][py[id]]!=' '){
id=rand()%e+1;
id2=rand()%e+1;
} int nowx=px[id],nowy=py[id],aimx,aimy; if(px[id2]==1){
a[0][py[id2]]=' ';
aimx=0,aimy=py[id2];
}
else if(px[id2]==n){
a[n+1][py[id2]]=' ';
aimx=n+1,aimy=py[id2];
}
else if(py[id2]==1){
a[px[id2]][0]=' ';
aimx=px[id2],aimy=0;
}
else{
a[px[id2]][n+1]=' ';
aimx=px[id2];
aimy=n+1;
} for(int i=1;i<=20;++i){
for(int j=1;j<=20;++j){
pr[i][j]=' ';
}
} for(int i=1,I=1;i<=5;++i,I+=4){
for(int j=1,J=1;j<=5;++j,J+=4){
xs[i][j]=I;
ys[i][j]=J;
}
} a[nowx][nowy]='o';
print(nowx,nowy); while(1){
//方向键控制,从键盘进行读入
int ttx,tty;
while(!kbhit());
getch();
char ch=getch();
if(ch==72){
ttx=nowx-1;
tty=nowy;
}
else if(ch==80){
ttx=nowx+1;
tty=nowy;
}
else if(ch==75){
ttx=nowx;
tty=nowy-1;
}
else if(ch==77){
ttx=nowx;
tty=nowy+1;
}
else{
continue;
}
if((a[ttx][tty]!=' ' && a[ttx][tty]!='G') || ttx<0 || ttx>n+1 || tty<0 || tty>n+1){
continue;
}
system("cls");
a[nowx][nowy]=' ';
nowx=ttx;
nowy=tty;
if(a[nowx][nowy]=='G'){
++coin;
}
a[nowx][nowy]='o';
print(nowx,nowy);
if(nowx==aimx && nowy==aimy){//判断到达终点
if(step-1>steplim){
lose();
}
//输出最终得分情况
system("cls");
printf("\n\n\n\n\n\n\n\n");
printf("\t\tYou Win!\n\n");
printf("\t\t你用了%d步走出迷宫\n\n\t\t你得到了%d个金币\n\n\t\t你的得分是%d!恭喜你!\n",step-1,coin,(steplim-step+1+coin*5+Abs(px[id]-px[id2])+Abs(px[id]+px[id2]))*100*xishu[m]*n/5);
printf("\n\n\n\n\n\n");
while(!kbhit());
getch();
break;
}
}
return 0;
} int Abs(int x){
return x<0 ? (-x) : x;
} void lose(){
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n");
printf("\t\tYou Lose!\n");
printf("\n\n\n\n\n\n\n\n\n\n");
while(!kbhit());
getch();
exit(0);
} void print(int x,int y){
if(step>steplim){
lose();
}
for(int i=x-2,I=1;i<=x+2;++i,++I){
for(int j=y-2,J=1;j<=y+2;++j,++J){
if(a[i][j]=='#' || a[i][j]=='*' || a[i][j]==' '){
for(int k=xs[I][J];k<=xs[I][J]+2;++k){
for(int l=ys[I][J];l<=ys[I][J]+2;++l){
pr[k][l]=a[i][j];
}
}
}
else if(a[i][j]=='G'){
for(int k=xs[I][J];k<=xs[I][J]+2;++k){
for(int l=ys[I][J];l<=ys[I][J]+2;++l){
pr[k][l]=' ';
}
}
pr[xs[I][J]+1][ys[I][J]+1]='G';
}
else if(a[i][j]=='o'){
for(int k=xs[I][J];k<=xs[I][J]+2;++k){
for(int l=ys[I][J];l<=ys[I][J]+2;++l){
pr[k][l]=' ';
}
}
pr[xs[I][J]+1][ys[I][J]+1]='o';
}
else if(i<0 || i>n+1 || j<0 || j>n+1){
for(int k=xs[I][J];k<=xs[I][J]+2;++k){
for(int l=ys[I][J];l<=ys[I][J]+2;++l){
pr[k][l]=' ';
}
}
}
}
}
for(int i=1;i<=20;++i){
for(int j=1;j<=20;++j){
putchar(pr[i][j]);
putchar(' ');
}
puts("");
}
printf("\n\n");
printf("\t步数限制:%d\t你的金币数:%d\t你的步数:%d\n",steplim,coin,step++);
}
【CCpp程序设计2017】迷宫游戏的更多相关文章
- 【CCpp程序设计2017】推箱子游戏
我的还……支持撤销!用链表实现! 题目:推箱子小游戏(基于console) 功能要求: 将p09迷宫游戏改造为“推箱子”游戏: 在地图中增加箱子.箱子目标位置等图形: 当玩家将所有箱子归位,则显示玩家 ...
- 【CCpp程序设计2017】简单进销存
题目:简单进销存 功能要求: 实现如下的菜单(按数字选择菜单功能): 1. 显示存货列表 2. 入库 3. 出库 4. 退出程序 实现菜单对应功能(需记录货物的型号.数量等信息): 程序启动时从文件中 ...
- c语言迷宫游戏的实现
// // main.c // 迷宫游戏代码实现 // #include <stdio.h> #define ROW 6 //宏定义行 #define COL 6 //宏定义列 /** * ...
- 51nod 1459 迷宫游戏(dij)
题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...
- 用webgl打造自己的3D迷宫游戏
用webgl打造自己的3D迷宫游戏 2016/09/19 · JavaScript · WebGL 原文出处: AlloyTeam 背景:前段时间自己居然迷路了,有感而发就想到写一个可以让人迷路 ...
- 腾讯WeTest《2017中国移动游戏质量白皮书》开放预约,再为国内手游把把脉
产品为王,质量先行.如果说2016年是爆款手游相继崛起的一年,那么2017年则更像是打磨精品.建立生态的高手切磋之年.守住一个游戏的质量生命线,方能建立健康生态,方能在如火如荼的行业竞争中角逐到最后. ...
- 腾讯WeTest发布《2017中国移动游戏质量白皮书》,专注手游品质提升
1月8日,腾讯质量开放平台WeTest正式发布<2017中国移动游戏质量白皮书>. 刚刚过去的这一年,市场逐渐成熟,中国移动互联网由增量市场转向存量市场.中国移动游戏市场急剧变化,真正的精 ...
- 护航者,腾讯云: 2017年度游戏行业DDoS态势报告—回溯与前瞻
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 前言 自14年开始,全球DDoS攻击持续爆发,攻击峰值不断创记录.2017年,这种依靠超大流量不断冲击服务器和带宽造成业务 ...
- 【Qt编程】3D迷宫游戏
说起迷宫想必大家都很熟悉,个人感觉迷宫对人的方向感是很大的考验,至少我的方向感是不好的,尤其是在三维空间中.由于这段时间帮导师做项目用到了三维作图,便心血来潮想做个三维迷宫玩玩.要想画出三维的迷宫游戏 ...
随机推荐
- 洛谷P1346 电车
P1346 电车 236通过 757提交 题目提供者yeszy 标签图论福建省历届夏令营 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 解不好啊,快疯了!!哪位大… 求解:为何除了-1的点之 ...
- npm install 权限的问题
用ctrl+r切换到对象的目录,以管理圆的身份执行 npm cache clean first. If that doesn’t fix things, take a look in %APPDATA ...
- eclipse tomcat 插件
下载地址http://www.eclipsetotale.com/tomcatPlugin.html#A3
- python module: csv
转自:sislcb 读 syntax : reader(csvfile[, dialect='excel'][, fmtparam]) csvfile:需要是支持迭代(Iterator)的对象,并且每 ...
- python+msf 制作 windows远控
最近分析的一个远控,后发现是meterpreter rever http shell,文件是个打包的python(打包成exe),感谢wstone的指导~ 创建dll ./msfpayload win ...
- python3 迭代器,生成器
一 .什么是迭代 1. 重复 2.下次重复一定是基于上一次的结果而来 while True: cmd=input(':') print(cmd) l=[1,2,3,4] count=0 while c ...
- wxpython学习资源
http://www.cnblogs.com/dyx1024/archive/2012/07/15/2592202.html wxPython:布局管理器sizer介绍 ogs.com/dyx1024 ...
- 字符设备驱动ioctl实现用户层内核层通信
测试代码实现 memdev.h #ifndef _MEMDEV_H_ #define _MEMDEV_H_ #include<linux/ioctl.h> #ifndef MEMDEV_M ...
- OSI和TCP/IP的对比+IP地址分类
一.OSI和TCP/IP对比 二.IP地址分类 A类私有IP地址:10.0.0.0-10.255.255.255B类私有IP地址:172.16.0.0-172.31.255.255C类私有IP地址:1 ...
- 【 总结 】linux中test命令详解
test命令在bash shell脚本中经常以中括号([])的形式出现,而且在脚本中使用字母来表示比符号表示更专业,出错率更低. 测试标志 代表意义 文件名.文件类型 -e 该文件名是否存在 -f 该 ...