最新文章:

首页 C/C++

扫雷

发布时间:2019年12月02日 评论数:抢沙发 阅读数:25

    大晚上不好好写论文写了个扫雷 。。。。代码如下,每次输入为三个数空格隔开。其中前两个数表示坐标。最后一个数如果是1表示挖这个地方。如果是2表示标记这个地方是雷。明天要加班写论文了。。。。

    //1.确定两个棋盘,1系统可见随机雷,2人可见当前已排勒
    //2.随机雷
    //3.输入分为 定雷 扫雷
    //4.扫雷时要判断是否为雷点,如果不是遍历领域是否存在雷,返回雷的个数。
    //5.扫雷如果雷不存在,需要进行大片领域开放
    //6.雷标记为* 定雷标记为$ 扫雷成功显示#
    //#include<windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define N 9
    char layout1[N][N];//棋盘1
    char layout2[N][N];//棋盘2
    
    void init(){
    	int sum = 0;
    	int i,j;
    	//初始化棋盘
    	for(i=0;i<N;i++){
    		for(j=0;j<N;j++){
    			layout1[i][j] = ' ';//先全部标记为空
    			layout2[i][j] = ' ';
    		}
    	}
    	//随机化10个雷
    	while(sum < N){
    		i = rand()%N;//生成0~9
    		j = rand()%N;
    		if(layout1[i][j]!='*'){ //防止随机生成的这个地方已经存在雷
    			layout1[i][j] = '*'; //标记为雷
    			sum += 1; //雷的数目+1
    		}	
    	}
    	
    }
    //显示
    void menu(){
    	//system('clr');
    	printf("-----------------欢迎来到扫雷-----------------\n");
    	int i,j;
    	for(i=0;i<N+1;i++){
    		for(j=0;j<N+1;j++){
    			if(i==0||j==0){
    				printf("%d ",i==0?j:i);
    			}else{
    				if(layout2[i-1][j-1]==' '){
    					printf("  ");
    				}else{
    					printf("%c ",layout2[i-1][j-1]);
    				}
    			}
    		}
    		printf("\n");
    	}
    	printf("请输入坐标如3,3扫雷请输入1,定雷请输入2\n");
    
    }
    //判断领域
    void del(int x,int y){
    	int i,j;
    	int sum = 0;
    	for(i=-1;i<=1;i++){
    		for(j=-1;j<=1;j++){
    			if(x+i>=0&&x+i<N&&y+j>=0&&y+j<N&&(i!=0||j!=0)){//防止数组越界 
    				if(layout1[x+i][y+j]=='*'){
    					sum += 1; //统计领域内雷的个数
    				}
    				/*else if(layout2[x+i][y+j]!='$'){
    					layout2[x+i][y+j] = '#';//不是雷标记为非雷
    				}*/
    			}
    		}
    	}
    	//判断领域有雷不,没有则迭代领域
    	if(sum==0){//领域无雷
    		layout1[x][y] = '#'; //在棋盘1上标记他为已遍历
    		layout2[x][y] = '#'; //棋盘2上标记为白班
    		for(i=-1;i<=1;i++){
    			for(j=-1;j<=1;j++){
    				if(x+i>=0&&x+i<N&&y+j>=0&&y+j<N&&layout1[x+i][y+j]!='#'&&layout2[x+i][y+j]!='$'&&(i!=0||j!=0)){//防止数组越界 最后防止反复回掉导致死循环
    					del(x+i,y+j);
    				}
    			}
    		}
    	}else{//领域有雷
    		layout2[x][y] = sum+48;
    	}
    
    }
    //输入
    bool input_kill(){
    	int i,j,n;
    	scanf("%d %d %d",&i,&j,&n);
    	i = i-1;
    	j = j-1;
    	if(i<0||j<0||i>=N||j>=N||(n!=2&&n!=1)){
    		printf("输入有误,请重新输入");
    		return true;
    	}
    	if(n==2){
    		layout2[i][j] = '$';
    		return true;
    	}else{//扫雷
    		if(layout1[i][j]=='*'){
    			layout2[i][j] = '*';
    			printf("游戏结束\n");
    			return false;
    		}else{
    			//领域遍历
    			del(i,j);
    			return true;
    		}
    	}
    
    }
    //判断游戏结束
    bool end(){
    	int i,j;
    	int sum = 0;
    	for(i=0;i<N;i++){
    		for(j=0;j<N;j++){
    			if(layout2[i][j]==' ')
    				return true;
    			else if(layout2[i][j]=='$')
    				sum += 1;
    		}
    	}
    	if(sum == N){
    		printf("游戏结束,恭喜胜利\n");
    		return false;
    	}else{
    		return true;
    	}
    }
    int main(){
    	init();
    	bool f = true;
    	while(f){
    		menu();
    		f = input_kill();
    		f =	end();
    		//因为mac电脑没有<windows.h>文件无法调用system('clr');刷新输出,所以这里就不刷新了. windows下需要刷新,把那两个注释消掉就行。
    	}
    	//结束界面
    	int i,j;
    	for(i=0;i<N+1;i++){
    		for(j=0;j<N+1;j++){
    			if(i==0||j==0){
    				printf("%d ",i==0?j:i);
    			}else{
    				if(layout1[i-1][j-1]!='*'){
    					printf("  ");
    				}else{
    					printf("%c ",layout1[i-1][j-1]);
    				}
    			}
    		}
    		printf("\n");
    	}
    	return 0;
    }

二维码加载中...
本文作者:HDC      文章标题: 扫雷
本文地址:http://hdcin.cn/?post=311
版权声明:若无注明,本文皆为“小胖Blog's”原创,转载请保留文章出处。
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
提交评论

清空信息
关闭评论