【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迷宫游戏
说起迷宫想必大家都很熟悉,个人感觉迷宫对人的方向感是很大的考验,至少我的方向感是不好的,尤其是在三维空间中.由于这段时间帮导师做项目用到了三维作图,便心血来潮想做个三维迷宫玩玩.要想画出三维的迷宫游戏 ...
随机推荐
- 如何记录MySQL执行过的SQL语句
很多时候,我们需要知道 MySQL 执行过哪些 SQL 语句,比如 MySQL 被注入后,需要知道造成什么伤害等等.只要有 SQL 语句的记录,就能知道情况并作出对策.服务器是可以开启 MySQL 的 ...
- TCP ------ TCP创建服务器中出现的套接字
在服务器端,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求.这个套接字不能用于与客户端之间发送和接收数据. accept()接受一个客户端的连接请求,并返回 ...
- Web自适应
随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置.移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样.这给我们在编写前端界面时增加了困难,适配问 ...
- eclipse tomcat 插件
下载地址http://www.eclipsetotale.com/tomcatPlugin.html#A3
- Jquery 获取checkbox的checked问题以及解决方案
转载自:http://www.cnblogs.com/-run/archive/2011/11/16/2251250.html 这个郁闷了,今天写这个功能的时候发现了问题,上网找了好多资料对照,更加纠 ...
- Java多线程-一个简单的线程,实现挂起和恢复的功能
public class MySprite implements Runnable { /* * 线程用变量 */ private boolean running = false; private b ...
- codevs3160 最长公共子串
传送门:http://codevs.cn/problem/3160/ [题解] CTSC前复习模板 sa的模板..记住基数排序就够了(还有height) 还有就是sa[i]表示排名为i的后缀是啥..r ...
- codeforces 854 problem E
E. Boredom Ilya is sitting in a waiting area of Metropolis airport and is bored of looking at time t ...
- codeforce C. Okabe and Boxes
题目传送门 这道题 每次删除一个点 那么这个点必然在栈里面 那么如果堆顶不是他 我们就需要一次操作使得堆合理 这时我们可以把他删除然后把他下面的点打个标记表示这下面的点以后想怎么排就怎么排以后都不需要 ...
- [BZOJ1026][SCOI2009]windy数 解题报告|数位dp
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 一直 ...