zoukankan      html  css  js  c++  java
  • 【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("
    
    
    
    
    ");
    	printf("	这是一个迷宫游戏!
    ");
    	printf("	“#”代表墙壁,“*”代表整个迷宫的边界,这两种地方都不能踩踏!
    ");
    	printf("	“o”代表你的位置,用方向键控制你的移动!
    ");
    	printf("	当你走到出口(即边界的缺口处)时,你就获胜了!整个迷宫只有一个出口!
    ");
    	printf("	你需要在规定的步数以内走出迷宫,你选择的难度等级越大,规定的步数越少!
    ");
    	printf("	你可以在迷宫里捡到金币!以“G”表示!
    ");
    	printf("	你最终的得分将根据迷宫结构、剩余步数、你选择的难度等级、
    	捡到的金币数进行计算!
    ");
    	printf("
    
    ");
    	printf("		作者:李子通,电子科技大学 计算机科学与工程学院
    
    		2017年2月");
    	printf("
    
    
    	按任意键继续
    ");
    	printf("
    
    
    
    ");
    	while(!kbhit());
    	getch();
    	system("cls");
    	printf("
    
    
    
    
    
    
    
    
    ");
    	printf("	请输入迷宫大小(下限为5,上限为30)
    
    	小于5会默认迷宫大小为5×5,大于30会默认迷宫大小为30×30
    
    	按下回车确认
    
    	");
    	scanf("%d",&n);
    	if(n<5){
    		n=5;
    	}
    	if(n>30){
    		n=30;
    	}
    	system("cls");
    	printf("
    
    
    
    
    
    
    
    
    ");
    	printf("	请输入难度等级(下限为1,上限为3)
    
    	小于1会默认为难度1,大于3会默认为难度3
    
    	按下回车确认
    
    	");
    	scanf("%d",&m);
    	if(m<1){
    		m=1;
    	}
    	if(m>3){
    		m=3;
    	}
    	int xishu[4]={0,1,3,9};
    	system("cls");
    	printf("
    
    
    
    
    
    
    
    
    
    
    ");
    	printf("	按任意键开始游戏!迷宫大小:%d×%d 难度等级:%d
    
    	",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("
    
    
    
    
    
    
    
    ");
    			printf("		You Win!
    
    ");
    			printf("		你用了%d步走出迷宫
    
    		你得到了%d个金币
    
    		你的得分是%d!恭喜你!
    ",step-1,coin,(steplim-step+1+coin*5+Abs(px[id]-px[id2])+Abs(px[id]+px[id2]))*100*xishu[m]*n/5);
    			printf("
    
    
    
    
    
    ");
    			while(!kbhit());
    			getch();
    			break;
    		}
    	}
    	return 0;
    }
    
    int Abs(int x){
    	return x<0 ? (-x) : x;
    }
    
    void lose(){
    	system("cls");
    	printf("
    
    
    
    
    
    
    
    
    
    ");
    	printf("		You Lose!
    ");
    	printf("
    
    
    
    
    
    
    
    
    
    ");
    	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("
    
    ");
    	printf("	步数限制:%d	你的金币数:%d	你的步数:%d
    ",steplim,coin,step++);
    }
  • 相关阅读:
    FireFox浏览器的下载和安装、借助RamDisk让你的FireFox飞起来
    XXX is not in the sudoers file. This incident will be reported 的问题解决方案
    UVA How Big Is It?
    CentOS配置smaba与Windows共享文件
    博客说明
    linux 下安装jdk及配置jdk环境图解
    swift 笔记 (十二) —— 下标
    依据先中序序列或后中序序列确定二叉树
    opencv2使用形态学滤波对图像进行边缘及角点检測
    $POST 、$HTTP_RAW_POST_DATA、php://input三者之间的差别
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6412078.html
Copyright © 2011-2022 走看看