【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迷宫游戏
说起迷宫想必大家都很熟悉,个人感觉迷宫对人的方向感是很大的考验,至少我的方向感是不好的,尤其是在三维空间中.由于这段时间帮导师做项目用到了三维作图,便心血来潮想做个三维迷宫玩玩.要想画出三维的迷宫游戏 ...
随机推荐
- 如何使用Navicat恢复数据库脚本
Navicat 可以做数据库备份,当然也可以做数据库脚本恢复了.操作很简单. 1.连接需要恢复的数据库.鼠标右键点击,选择[运行SQL文件] 2.在弹出的窗口中选择sql文件,继续下一步即可. 余不赘 ...
- init_connect基本用法
服务器为每个连接的客户端执行的字符串.字符串由一个或多个SQL语句组成.要想指定多个语句,用分号间隔开.例如,每个客户端开始时默认启用autocommit模式.没有全局服务器变量可以规定autocom ...
- POJ2516:Minimum Cost(最小费用最大流)
Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19088 Accepted: 6740 题目链 ...
- 用实例工厂的方法实例化bean
在实例化bean时,除了setter,constructor方法外,还有实例工厂方法,和静态工厂方法. 看代码: People类的代码如下: package com.timo.domain; publ ...
- bzoj 4004 [JLOI2015]装备购买 拟阵+线性基
[JLOI2015]装备购买 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 547[Submit][Status][Dis ...
- Python之json编码
一.json JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法 1.json轻量级:语法规则 JSON 语法是 ...
- 自旋锁、排队自旋锁、MCS锁、CLH锁
转载自:http://coderbee.net/index.php/concurrent/20131115/577 自旋锁(Spin lock) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他 ...
- Ubuntu pppoe 拨号上网
-------------蓝色是终端里面的连接方式,可以不看--------------------- ADSL上网,Ubuntu下是可以的,虽然以前没用过拨号上网,不过查了查也不是很麻烦. 打开终端 ...
- Idea 部署非Maven项目
参考:http://m.blog.csdn.net/z69183787/article/details/78030857 以前一直很好奇,在idea中运行tomcat,把项目部署到其中,运行起来,然后 ...
- WebComponents四大天王教程
Shadow Dom: http://www.html5rocks.com/zh/tutorials/webcomponents/shadowdom/ http://www.html5rocks.co ...