难点:
点击一次清理出一大片区域的功能,我采用的是先把点击的那一块的坐标存到一个队列里,然后取出里面的一个元素,再把这个元素周围的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;
}