扫雷(可复制,免费)

难点:

        点击一次清理出一大片区域的功能,我采用的是先把点击的那一块的坐标存到一个队列里,然后取出里面的一个元素,再把这个元素周围的8块放进队列里,重复的不放,就可以对规定的区域做大面积清理了,另外为了右滑界面也加了不少代码比如一些颜色属性时钟移动效果还有光标之类的,实际上要想做一个简单的出来200行绰绰有余了,只要将程序模块化,一个函数解决一个问题,思路还是很清晰的。

此外,在写这个东西的几天里也学到了很多经验,终于明白了命名的重要性,不然在几天之后再重新看自己的代码恐怕自己都不知道原来写的ABC是啥意思了,只要逻辑结构层次清晰了之后找bug也容易了很多,省了不少时间,再在原来的基础上添加别的功能和优化的时候也会少走很多弯路,简而言之就是一句话:良好的代码习惯非常重要!

话不多说,上源码!!!!!!

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
int x,y,l,l2;
bool s,c[11][11];
char a[11][11],b[11][11],f;
int dx[]={0,-1,1,-1,1,0,-1,1};
int dy[]={-1,-1,-1,0,0,1,1,1};
int q[150][2],hh,tt,kx,ky;
bool Map[11][11];
int statistics_1(int j,int i);
int statistics_2(int j,int i);
void around(int j,int i);
void csh();
void color(int r);
void gotoxy(int xx,int yy);
void _cout();
void _cin();
void _move();
void _cout2();
int main(){
	system("title 扫雷");
	while(true){
	    csh();
	    while(true){
	        _cout();
	        if(s){
	        	color(4);
	            printf("\nGame over!\n\n");
	            break;
	        }
	        if(l==0&&l==l2){
	        	color(14);
	            printf("\nWin!\n\n");
	            break;
	        }
	        _cin();
	        if(f=='1'||f==' '){
	        	for(int i=0;i<11;i++)
					for(int j=0;j<11;j++)
						Map[i][j]=true;
				q[0][0]=y;
	    		q[0][1]=x;
	    		hh=0;
	    		tt=1;
	    		_move();
			}
	    }
	    color(7);
	    system("pause");
	    _cout2();
		getch();
		system("cls"); 
	}
    return 0;
}
int statistics_1(int j,int i){
    return ((b[i+1][j]=='*')+(b[i-1][j]=='*')+(b[i][j+1]=='*')+(b[i][j-1]=='*')+(b[i+1][j+1]=='*')+(b[i+1][j-1]=='*')+(b[i-1][j+1]=='*')+(b[i-1][j-1]=='*'));
}
int statistics_2(int j,int i){
    return ((a[i+1][j]=='+')+(a[i-1][j]=='+')+(a[i][j+1]=='+')+(a[i][j-1]=='+')+(a[i+1][j+1]=='+')+(a[i+1][j-1]=='+')+(a[i-1][j+1]=='+')+(a[i-1][j-1]=='+'));
}
void around(int j,int i){
	for(int yy=-1;yy<=1;yy++){
		for(int xx=-1;xx<=1;xx++){
			if(b[i+yy][j+xx]!='*'&&c[i+yy][j+xx]&&statistics_1(j+xx,i+yy)<=statistics_2(j+xx,i+yy)&&i+yy<10&&i+yy>0&&j+xx<10&&j+xx>0){
				c[i+yy][j+xx]=false;
				around(j+xx,i+yy);
			}
			if(a[i+yy][j+xx]!='+'){
				a[i+yy][j+xx]=b[i+yy][j+xx];
				c[i+yy][j+xx]=false;
			}
		}
	}
    return;
}
void csh(){
    l=15;
	l2=15;
	s=false;
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
    for(int i=0;i<11;i++){
    	for(int j=0;j<11;j++){
        	a[i][j]='#';
			b[i][j]='0';
			c[i][j]=true;
		}
	} 
    srand(time(NULL));
    for(int i=0;i<l;){
        x=rand()%9+1;
		y=rand()%9+1;
        if(b[y][x]!='*'){
        	i++;
			b[y][x]='*';
		}
    }
    for(int i=1;i<=9;i++){
    	for(int j=1;j<=9;j++){
    		if(b[i][j]!='*'){
    			b[i][j]+=statistics_1(j,i);
			}
		}
	}
    x=5;
	y=5;
    color(7);
    gotoxy(3,42);
    printf("w , a , s , d 控 制 坐 标 移 动");
	gotoxy(7,42);
	printf("    1 键 插 旗 , 2 键 拔 旗 ."); 
	gotoxy(11,42);
	printf("      按 空 格 键 有 惊 喜");
    return;
}
void gotoxy(int i,int j){
    COORD position={j,i};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
    return;
}
void color(int r){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),r);
	return;
}
void _cout(){
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
        	gotoxy(i*2-1,j*4-2);
            switch(a[i][j]){
                case '0':{
                	color(7);
					printf("□");
					break;
				}
                case '#':{
                	color(1);
					printf("■");
					break;
				}
                case '+':{
                	color(4);
					printf("◆");
					break;
				}
                case '*':{
                	color(4);
					printf("*");
					s=true;
					break;
				}
                case '1':{
                	color(1);
					printf("1");
					break;
				}
                case '2':{
                	color(2);
					printf("2");
					break;
				}
                case '3':{
                	color(4);
					printf("3");
					break;
				}
                case '4':{
                	color(1);
					printf("4");
					break;
				}
                case '5':{
                	color(4);
					printf("5");
					break;
				}
                case '6':{
                	color(1);
					printf("6");
					break;
				}
                case '7':{
                	color(7);
					printf("7");
					break;
				}
                case '8':{
                	color(7);
					printf("8");
					break;
				}
            }
        }
    }
    color(14);
    gotoxy(y*2-2,x*4-2);
    printf("┅");
    gotoxy(y*2-1,x*4-4);
    printf("┇");
    gotoxy(y*2-1,x*4);
    printf("┇");
    gotoxy(y*2,x*4-2);
    printf("┅");
    gotoxy(y*2-2,x*4-4);
    printf("◢");
    gotoxy(y*2-2,x*4);
    printf("◣");
    gotoxy(y*2,x*4-4);
    printf("◥");
    gotoxy(y*2,x*4);
    printf("◤");
    gotoxy(19,25);
    color(4);
    printf("剩余雷数:%d \n",l2);
    return;
}
void _cin(){
    f=getch();
    color(14);
    gotoxy(y*2-2,x*4-2);
    printf("  ");
    gotoxy(y*2-1,x*4-4);
    printf("  ");
    gotoxy(y*2-1,x*4);
    printf("  ");
    gotoxy(y*2,x*4-2);
    printf("  ");
    gotoxy(y*2-2,x*4-4);
    printf("  ");
    gotoxy(y*2-2,x*4);
    printf("  ");
    gotoxy(y*2,x*4-4);
    printf("  ");
    gotoxy(y*2,x*4);
    printf("  ");
    switch(f){
        case 'W':case 'w':{
        	if(y>1)
				y--;
			break;
		}
        case 'S':case 's':{
        	if(y<9)
				y++;
			break;
		}
        case 'A':case 'a':{
        	if(x>1)
				x--;
			break;
		}
        case 'D':case 'd':{
        	if(x<9)
				x++;
			break;
		}
        case '1':{
        	if(c[y][x]){
        		if(b[y][x]=='*')
					l--;
	        	l2--;
				a[y][x]='+';
				c[y][x]=false;
			}
			break;
		}
        case '2':{
        	if(a[y][x]=='+'){
        		c[y][x]=true;
        		a[y][x]='#';
        		l2++;
        		if(b[y][x]=='*')
        			l++;
        		c[y][x]=true;
        	}
			break;
		}
        case ' ':{
        	if(a[y][x]!='+'){
        		a[y][x]=b[y][x];
				c[y][x]=false;
	            if(b[y][x]=='*')
					s=true;
	            if(statistics_1(x,y)<=statistics_2(x,y)&&b[y][x]!='*')
					around(x,y);
			}
			break;
		}
        default:break;
    }
    return;
}
void _move(){
	if(hh==tt)
        return;
    kx=q[hh][1];
    ky=q[hh][0];
    hh++;
    for(int i=0;i<8;i++){
        int xx=kx+dx[i];
        int yy=ky+dy[i];
        if(xx>0&&xx<10&&yy>0&&yy<10&&Map[yy][xx]){
            tt++;
            q[tt-1][0]=yy;
            q[tt-1][1]=xx;
            Map[yy][xx]=false;
            if(c[yy][xx]){
            	y=yy;
            	x=xx;
            	return;
			}
        }
    }
    _move();
    return;
}
void _cout2(){
	color(14);
    gotoxy(y*2-2,x*4-2);
    printf("  ");
    gotoxy(y*2-1,x*4-4);
    printf("  ");
    gotoxy(y*2-1,x*4);
    printf("  ");
    gotoxy(y*2,x*4-2);
    printf("  ");
    gotoxy(y*2-2,x*4-4);
    printf("  ");
    gotoxy(y*2-2,x*4);
    printf("  ");
    gotoxy(y*2,x*4-4);
    printf("  ");
    gotoxy(y*2,x*4);
    printf("  ");
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
        	gotoxy(i*2-1,j*4-2);
            switch(b[i][j]){
                case '0':{
                	color(7);
					printf("□");
					break;
				}
                case '#':{
                	color(1);
					printf("■");
					break;
				}
                case '*':{
                	color(4);
					printf("*");
					break;
				}
                case '1':{
                	color(1);
					printf("1");
					break;
				}
                case '2':{
                	color(2);
					printf("2");
					break;
				}
                case '3':{
                	color(4);
					printf("3");
					break;
				}
                case '4':{
                	color(1);
					printf("4");
					break;
				}
                case '5':{
                	color(4);
					printf("5");
					break;
				}
                case '6':{
                	color(1);
					printf("6");
					break;
				}
                case '7':{
                	color(7);
					printf("7");
					break;
				}
                case '8':{
                	color(7);
					printf("8");
					break;
				}
            }
        }
    }
    return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值