扫雷炒鸡优化版(原创)

又想练大模拟了,再写一个扫雷,鼠标点击版的……

//本程序属个人劳动成果,如有雷同,纯属巧合(全是手打的,思路也是自己的)
#include<bits/stdc++.h>
#include<windows.h>
#include <conio.h>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0X8000) ? 1:0)
using namespace std;
HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_FONT_INFO consoleCurrentFont;
const int isshow=-1;
int mp[100][100],num,canshow[100][100],now;
int mp_vis[100][100];
int isbj[100][100];
bool tsbj[100][100];
inline void gotoxy(int x,int y) {
	HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(handle,pos);
	return;
}
void color(int a) {//颜色函数
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void print_num(int n) {
	color(56);
	if(n==1)cout<<"①";
	if(n==2)cout<<"②";
	if(n==3)cout<<"③";
	if(n==4)cout<<"④";
	if(n==5)cout<<"⑤";
	if(n==6)cout<<"⑥";
	if(n==7)cout<<"⑦";
	if(n==8)cout<<"⑧";
	color(7);
}
void print_map() {
	cout<<"by lize yyd 2021.9.3 8:56~9:53\n";
	cout << "--------------------扫雷--------------------" << endl;
	cout << "鼠标点击          左键翻开          右键标记" << endl;
	cout << "--------------------------------------------" << endl;
	cout<<"            ";
	rep(i,1,9)cout<<i<<' ';
	cout<<endl;
	rep(i,1,9) {
		cout<<"          ";
		cout<<i<<' ';
		rep(j,1,9) {
//			cout<<mp[i][j]<<' ';
			if(tsbj[i][j]) {
				color(56);
				cout<<"■";
			} else if(isbj[i][j]) {
				color(25);
				if(isbj[i][j]==1) {
					cout<<"!";
				} else {
					cout<<"?";
				}
			} else {
				if(mp[i][j]==9) {
					color(25);
					cout<<"■";
				} else {
					if(mp[i][j]==isshow) {
						color(56);
						cout<<"■";
					} else {
						if(canshow[i][j]) {
							print_num(mp[i][j]);
						} else {
							color(25);
							cout<<"■";
						}
					}
				}
			}

			color(7);
		}
		cout<<endl;
	}
	cout<<"              剩余雷数:"<<num-now<<endl;
}
void print_gameover(int x,int y) {//游戏结束
	system ("cls");
	cout<<"by lize yyd 2021.9.3 8:56~9:53\n";
	cout << "--------------------扫雷--------------------" << endl;
	cout << "鼠标点击          左键翻开          右键标记" << endl;
	cout << "--------------------------------------------" << endl;
	cout<<"            ";
	rep(i,1,9)cout<<i<<' ';
	cout<<endl;
	rep(i,1,9) {
		cout<<"          ";
		cout<<i<<' ';
		rep(j,1,9) {
//			cout<<mp[i][j]<<' ';
			if(i==x&&j==y)color(64),cout<<"﹡";
			else if(mp[i][j]==9) {
				color(12);
				if(isbj[i][j]) {
					cout<<"×";
				} else cout<<"﹡";
			} else {
				if(isbj[i][j]) {
					color(25);
					if(isbj[i][j]==1) {
						cout<<"!";
					} else {
						cout<<"?";
					}
				} else {
					if(mp[i][j]==isshow) {
						color(56);
						cout<<"■";
					} else {
						if(canshow[i][j]) {
							print_num(mp[i][j]);
						} else {
							color(25);
							cout<<"■";
						}
					}
				}
			}

			color(7);
		}
		cout<<endl;
	}
	Sleep(1000);
	system("cls");
	color(4);
	printf(
	    "   _____          __  __ ______     ______      ________ _____  \n"
	    "  / ____|   /\\   |  \\/  |  ____|   / __ \\ \\    / /  ____|  __ \\\n"
	    " | |  __   /  \\  | \\  / | |__     | |  | \\ \\  / /| |__  | |__) |\n"
	    " | | |_ | / /\\ \\ | |\\/| |  __|    | |  | |\\ \\/ / |  __| |  _  / \n"
	    " | |__| |/ ____ \\| |  | | |____   | |__| | \\  /  | |____| | \\ \\ \n"
	    "  \\_____/_/    \\_\\_|  |_|______|   \\____/   \\/   |______|_|  \\_\\\n"
	);
	color(7);
	exit(0);
}
void print_win() {//你赢了
	system ("cls");
	color(10);
	printf(
	    " __     ______  _    _   __          _______ _   _\n"
	    " \\ \\   / / __ \\| |  | |  \\ \\        / /_   _| \\ | |\n"
	    "  \\ \\_/ / |  | | |  | |   \\ \\  /\\  / /  | | |  \\| |\n"
	    "   \\   /| |  | | |  | |    \\ \\/  \\/ /   | | | . ` |\n"
	    "    | | | |__| | |__| |     \\  /\\  /   _| |_| |\\  |\n"
	    "    |_|  \\____/ \\____/       \\/  \\/   |_____|_| \\_|\n"
	);
	color(7);
	exit(0);
}
const int fx[9]= {0,0,0,1,-1,-1,-1,1,1},fy[9]= {0,1,-1,0,0,1,-1,1,-1};
void dfs(int x0,int y0) {
	if(isbj[x0][y0])return;
	if(x0>9||y0>9||x0<1||y0<1)return;
	if(mp[x0][y0]==9)return;
	canshow[x0][y0]=1;
	if(mp[x0][y0]!=0)return;
	mp[x0][y0]=isshow;
	rep(i,1,8) {
		dfs(x0+fx[i],y0+fy[i]);
	}
}
bool check() {
	int sum=0;
	rep(i,1,9) {
		rep(j,1,9) {
			if(canshow[i][j]) {
				sum++;
			}
		}
	}
	return sum==9*9-num;
}
int mouseclick() {
	while(1) {

	}
}
int main() {
	HWND h=GetForegroundWindow();
	HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);
	DWORD mode;
	GetConsoleMode(hStdin,&mode);
	mode&=~ENABLE_QUICK_EDIT_MODE;
	SetConsoleMode(hStdin,mode);
	num=8;//默认8颗雷,可自己更改
	srand(time(NULL));
	rep(i,1,num) {
		int x,y;
		do {
			x=rand()%9+1,y=rand()%9+1;
		} while(mp_vis[x][y]==1);
		mp_vis[x][y]=1;
	}
	rep(i,1,9) {
		rep(j,1,9) {
			rep(k,-1,1) {
				rep(l,-1,1) {
					mp[i][j]+=mp_vis[i+k][j+l];
				}
			}
			if(mp_vis[i][j])mp[i][j]=9;
		}
	}
	while(1) {
		memset(tsbj,0,sizeof(tsbj));
		gotoxy(0,0);
		print_map();
		cout<<endl<<endl;

//		作弊选项

//		rep(i,1,9){
//			rep(j,1,9){
//				cout<<mp[i][j]<<' ';
//				if(mp[i][j]>=0)cout<<' ';
//			}
//			cout<<endl;
//		}
		cout<<endl;
		int y,x,opt=0;
		while(1) {
			if(KEY_DOWN(VK_LBUTTON)||KEY_DOWN(VK_RBUTTON))break;
		}
		if(KEY_DOWN(VK_LBUTTON)) {
			POINT p;
			GetCursorPos(&p);
			ScreenToClient(h,&p);
			GetCurrentConsoleFont(hOutput,FALSE,&consoleCurrentFont);
			x=p.x/=consoleCurrentFont.dwFontSize.X;
			y=p.y/=consoleCurrentFont.dwFontSize.Y;
			x/=2;
			y-=4;
			Sleep(100);
			int tmp=x;
			x=y;
			y=tmp-5;
			opt=1;
		} else if(KEY_DOWN(VK_RBUTTON)) {
			POINT p;
			GetCursorPos(&p);
			ScreenToClient(h,&p);
			GetCurrentConsoleFont(hOutput,FALSE,&consoleCurrentFont);
			x=p.x/=consoleCurrentFont.dwFontSize.X;
			y=p.y/=consoleCurrentFont.dwFontSize.Y;
			x/=2;
			y-=4;
			Sleep(100);
			int tmp=x;
			x=y;
			y=tmp-5;
			opt=2;
		}
		if(opt==1) {
			if(canshow[x][y]==1&&mp[x][y]!=9&&mp[x][y]!=0) {
				int cntt=0;
				rep(k,-1,1) {
					rep(l,-1,1) {
						if(x+k==0||x+k==10||y+l==0||y+l==10)continue;
						if(k==0&&l==0)continue;
						if(isbj[x+k][y+l]==1)cntt++;
						else if(!canshow[x+k][y+l])tsbj[x+k][y+l]=true;
					}
				}
				if(cntt==mp[x][y]) {
					rep(k,-1,1) {
						rep(l,-1,1) {
							if(k==0&&l==0)continue;
							if(x+k==0||x+k==10||y+l==0||y+l==10)continue;
							if(mp_vis[x+k][y+l]&&!isbj[x+k][y+l]) {
								print_gameover(x+k,y+l);
							}
						}
					}
					rep(k,-1,1) {
						rep(l,-1,1) {
							if(k==0&&l==0)continue;
							if(x+k==0||x+k==10||y+l==0||y+l==10)continue;
							dfs(x+k,y+l);
						}
					}
				} else {
					gotoxy(0,0);
					print_map();
				}
			} else {
				if(canshow[x][y])continue;
				if(mp_vis[x][y]&&isbj[x][y]==0)print_gameover(x,y);
				dfs(x,y);
			}

		} else if(opt==2&&canshow[x][y]==0) {
			if(x<10&&y<10&&x>0&&y>0) {
				if(!isbj[x][y]) {
					now++;
					isbj[x][y]=1;
				} else {
					if(isbj[x][y]==1) {
						now--;
						isbj[x][y]=2;
					} else {
						isbj[x][y]=0;
					}
					Sleep(100);
				}
			}

		}
		if(check())print_win();
		Sleep(35);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值