又想练大模拟了,再写一个扫雷,鼠标点击版的……
//本程序属个人劳动成果,如有雷同,纯属巧合(全是手打的,思路也是自己的)
#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;
}