minesweeper
更新日志(仅-1.2.0之后)
-1.x
-1.0.0
/*
Compiler: C++17 +
*/
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<ctime>
#include<cstdlib>
#include<cstring>
using namespace std;
struct game_set{
int n,m,cnt;
};
int fl[60][60];
int status[60][60];
bool judgeAdj(int x1,int y1,int x2,int y2){
return max(abs(x1-x2),abs(y1-y2))<=1;
}
int limit(int mod){
return RAND_MAX-RAND_MAX%mod;
}
bool judgeKdLt(char ch,char tgt){
return ch==tgt||ch==tgt-32;
}
bool judgeKd(char ch,char tgt){
return ch==tgt;
}
game_set menu(){
cout<<"Minesweeper -1.0.\n";
cout<<"[0] Easy (9,9,10)\n";
cout<<"[1] Medium (16,16,40)\n";
cout<<"[2] Expert (16,30,99)\n";
cout<<"[3] Custom\n";
char ch=getch();
while(1){
if(judgeKd(ch,'0'))return {9,9,10};
else if(judgeKd(ch,'1'))return {16,16,40};
else if(judgeKd(ch,'2'))return {16,30,99};
else if(judgeKd(ch,'3')){
system("clear");
game_set gs;
cout<<"Row:";cin>>gs.n;
cout<<"Column:";cin>>gs.m;
cout<<"Mine count:";cin>>gs.cnt;
return gs;
}else{
system("clear");
cout<<"Minesweeper 0.0.\n";
cout<<"[0] Easy (9,9,10)\n";
cout<<"[1] Medium (16,16,40)\n";
cout<<"[2] Expert (16,30,99)\n";
cout<<"[3] Custom\n";
cout<<"(Invaild operation)\n";
ch=getch();
}
}
}
void game_init(game_set gs,int fx,int fy){
auto [n,m,cnt]=gs;
system("clear");
memset(fl,0,sizeof fl);
memset(status,0,sizeof status);
while(cnt--){
int cx,cy;
do{
cx=rand(),cy=rand();
}while(cx<limit(n)&&cy<limit(m)&&!judgeAdj(cx,cy,fx,fy));
fl[cx][cy]=-1;
cnt--;
}
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
if(fl[i][j]==-1)continue;
for(int ii=max(0,i-1);ii<=min(n-1,i+1);ii++)for(int jj=max(0,j-1);jj<=min(m-1,j+1);jj++){
if(fl[ii][jj]==-1)fl[i][j]++;
}
}
}
int main(){
game_set gs=menu();
game_init(gs,0,0);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(fl[i][j]==-1)cout<<"* ";
else if(fl[i][j]==0)cout<<". ";
else cout<<fl[i][j]<<" ";
}
cout<<"\n\n";
}
}
-1.0.1
/*
Compiler: C++17 +
*/
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<ctime>
#include<cstdlib>
#include<cstring>
using namespace std;
#define c++14
struct game_set{
int n,m,cnt;
};
int fl[60][60];
int status[60][60];
bool judgeAdj(int x1,int y1,int x2,int y2){
return max(abs(x1-x2),abs(y1-y2))<=1;
}
int limit(int mod){
return RAND_MAX-RAND_MAX%mod;
}
bool judgeKdLt(char ch,char tgt){
return ch==tgt||ch==tgt-32;
}
bool judgeKd(char ch,char tgt){
return ch==tgt;
}
game_set menu(){
cout<<"Minesweeper -1.0.\n";
cout<<"[0] Easy (9,9,10)\n";
cout<<"[1] Medium (16,16,40)\n";
cout<<"[2] Expert (16,30,99)\n";
cout<<"[3] Custom\n";
char ch=getch();
while(1){
if(judgeKd(ch,'0'))return {9,9,10};
else if(judgeKd(ch,'1'))return {16,16,40};
else if(judgeKd(ch,'2'))return {16,30,99};
else if(judgeKd(ch,'3')){
system("clear");
game_set gs;
cout<<"Row:";cin>>gs.n;
cout<<"Column:";cin>>gs.m;
cout<<"Mine count:";cin>>gs.cnt;
return gs;
}else{
system("clear");
cout<<"Minesweeper 0.0.\n";
cout<<"[0] Easy (9,9,10)\n";
cout<<"[1] Medium (16,16,40)\n";
cout<<"[2] Expert (16,30,99)\n";
cout<<"[3] Custom\n";
cout<<"(Invaild operation)\n";
ch=getch();
}
}
}
void game_init(game_set gs,int fx,int fy){
int n=gs.n,m=gs.m,cnt=gs.cnt;
system("cls");
memset(fl,0,sizeof fl);
memset(status,0,sizeof status);
while(cnt--){
int cx,cy;
do{
cx=rand(),cy=rand();
cout<<cx<<" "<<cy<<"\n";
}while(cx<limit(n)&&cy<limit(m)&&!judgeAdj(cx,cy,fx,fy));
fl[cx][cy]=-1;
cnt--;
}
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
if(fl[i][j]==-1)continue;
for(int ii=max(0,i-1);ii<=min(n-1,i+1);ii++)for(int jj=max(0,j-1);jj<=min(m-1,j+1);jj++){
if(fl[ii][jj]==-1)fl[i][j]++;
}
}
}
int main(){
srand(time(0));
game_set gs=menu();
game_init(gs,0,0);
int n=gs.n,m=gs.m,cnt=gs.cnt;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(fl[i][j]==-1)cout<<"* ";
else if(fl[i][j]==0)cout<<". ";
else cout<<fl[i][j]<<" ";
}
cout<<"\n\n";
}
}
-1.0.2
/*
Compiler: C++14 +
*/
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<ctime>
#include<cstdlib>
#include<cstring>
using namespace std;
#define c++14
struct game_set{
int n,m,cnt;
};
int fl[1010][1010];
int status[1010][1010];
bool judgeAdj(int x1,int y1,int x2,int y2){
return max(abs(x1-x2),abs(y1-y2))<=1;
}
int limit(int mod){
return RAND_MAX-RAND_MAX%mod;
}
bool judgeKdLt(char ch,char tgt){
return ch==tgt||ch==tgt-32;
}
bool judgeKd(char ch,char tgt){
return ch==tgt;
}
game_set menu(){
cout<<"Minesweeper -1.0.2.\n";
cout<<"[1] Easy (9,9,10)\n";
cout<<"[2] Medium (16,16,40)\n";
cout<<"[3] Expert (16,30,99)\n";
cout<<"[4] Custom\n";
char ch=getch();
while(1){
if(judgeKd(ch,'1'))return {9,9,10};
else if(judgeKd(ch,'2'))return {16,16,40};
else if(judgeKd(ch,'3'))return {16,30,99};
else if(judgeKd(ch,'4')){
system("cls");
game_set gs;
cout<<"Row:";cin>>gs.n;
cout<<"Column:";cin>>gs.m;
cout<<"Mine count:";cin>>gs.cnt;
while(gs.n>=100||gs.m>=100||gs.cnt>gs.n*gs.m-9){
system("cls");
cout<<"Too large!\n";
cout<<"Row:";cin>>gs.n;
cout<<"Column:";cin>>gs.m;
cout<<"Mine count:";cin>>gs.cnt;
}
return gs;
}else{
system("cls");
cout<<"Minesweeper -1.0.2.\n";
cout<<"[1] Easy (9,9,10)\n";
cout<<"[2] Medium (16,16,40)\n";
cout<<"[3] Expert (16,30,99)\n";
cout<<"[4] Custom\n\n";
cout<<"(Invaild operation)\n";
ch=getch();
}
}
}
void game_init(game_set gs,int fx,int fy){
int n=gs.n,m=gs.m,cnt=gs.cnt;
system("cls");
memset(fl,0,sizeof fl);
memset(status,0,sizeof status);
while(cnt--){
int cx,cy;
do{
cx=rand(),cy=rand();
// cout<<cx<<" "<<cy<<" "<<limit(n)<<" "<<limit(m)<<"\n";
}while(!(cx<limit(n)&&cy<limit(m)&&!judgeAdj(cx%n,cy%m,fx,fy)));
fl[cx%n][cy%m]=-1;
// cout<<"[ok] "<<cnt<<"\n";
}
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
if(fl[i][j]==-1)continue;
for(int ii=max(0,i-1);ii<=min(n-1,i+1);ii++)for(int jj=max(0,j-1);jj<=min(m-1,j+1);jj++){
if(fl[ii][jj]==-1)fl[i][j]++;
}
}
}
int main(){
srand(time(0));
game_set gs=menu();
game_init(gs,8,15);
int n=gs.n,m=gs.m,cnt=gs.cnt;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(fl[i][j]==-1)cout<<"* ";
else if(fl[i][j]==0)cout<<". ";
else cout<<fl[i][j]<<" ";
}
cout<<"\n\n";
}
}
-1.0.3
/*
Compiler: C++14 +
*/
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<ctime>
#include<cstdlib>
#include<cstring>
using namespace std;
#define c++14
struct game_set{
int n,m,cnt;
};
int fl[1010][1010];
int status[1010][1010];
bool judgeAdj(int x1,int y1,int x2,int y2){
return max(abs(x1-x2),abs(y1-y2))<=1;
}
int limit(int mod){
return RAND_MAX-RAND_MAX%mod;
}
bool judgeKdLt(char ch,char tgt){
return ch==tgt||ch==tgt-32;
}
bool judgeKd(char ch,char tgt){
return ch==tgt;
}
game_set menu(){
cout<<"Minesweeper -1.0.3.\n";
cout<<"[1] Easy (9,9,10)\n";
cout<<"[2] Medium (16,16,40)\n";
cout<<"[3] Expert (16,30,99)\n";
cout<<"[4] Custom\n";
char ch=getch();
while(1){
if(judgeKd(ch,'1'))return {9,9,10};
else if(judgeKd(ch,'2'))return {16,16,40};
else if(judgeKd(ch,'3'))return {16,30,99};
else if(judgeKd(ch,'4')){
system("cls");
game_set gs;
cout<<"Row:";cin>>gs.n;
cout<<"Column:";cin>>gs.m;
cout<<"Mine count:";cin>>gs.cnt;
while(gs.n>=100||gs.m>=100||gs.cnt>gs.n*gs.m-9){
system("cls");
cout<<"Too large!\n";
cout<<"Row:";cin>>gs.n;
cout<<"Column:";cin>>gs.m;
cout<<"Mine count:";cin>>gs.cnt;
}
return gs;
}else{
system("cls");
cout<<"Minesweeper -1.0.3.\n";
cout<<"[1] Easy (9,9,10)\n";
cout<<"[2] Medium (16,16,40)\n";
cout<<"[3] Expert (16,30,99)\n";
cout<<"[4] Custom\n\n";
cout<<"(Invaild operation)\n";
ch=getch();
}
}
}
void game_init(game_set gs,int fx,int fy){
int n=gs.n,m=gs.m,cnt=gs.cnt;
system("cls");
memset(fl,0,sizeof fl);
memset(status,0,sizeof status);
while(cnt--){
int cx,cy;
do{
cx=rand(),cy=rand();
// cout<<cx<<" "<<cy<<" "<<limit(n)<<" "<<limit(m)<<"\n";
}while(!(cx<limit(n)&&cy<limit(m)&&!judgeAdj(cx%n,cy%m,fx,fy)));
fl[cx%n][cy%m]=-1;
// cout<<"[ok] "<<cnt<<"\n";
}
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
if(fl[i][j]==-1)continue;
for(int ii=max(0,i-1);ii<=min(n-1,i+1);ii++)for(int jj=max(0,j-1);jj<=min(m-1,j+1);jj++){
if(fl[ii][jj]==-1)fl[i][j]++;
}
}
}
void display(game_set gs,int x,int y){
system("cls");
int n=gs.n,m=gs.m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
// cout<<i<<" "<<j<<" "<<fl[i][j]<<" "<<status[i][j]<<"\n";
if(i==x&&j==y){
if(status[i][j]==0)cout<<"#< ";
else if(status[i][j]==1){
if(fl[i][j]==-1)cout<<"*< ";
else if(fl[i][j]==0)cout<<".< ";
else cout<<fl[i][j]<<"< ";
}
else cout<<"X< ";
}else{
if(status[i][j]==0)cout<<"# ";
else if(status[i][j]==1){
if(fl[i][j]==-1)cout<<"* ";
else if(fl[i][j]==0)cout<<". ";
else cout<<fl[i][j]<<" ";
}
else cout<<"X ";
}
}
cout<<"\n\n";
}
}
int d[8][2]={1,0,0,1,0,-1,-1,0,1,1,1,-1,-1,1,-1,-1};
void open_(int x,int y,int n,int m){
if(fl[x][y]==-1){
cout<<"End!";
exit(0);
}
status[x][y]=1;
if(fl[x][y])return ;
for(int i=0;i<8;i++){
int rx=d[i][0]+x,ry=d[i][1]+y;
if(rx<0||rx>=n||ry<0||ry>=m)continue;
if(status[rx][ry]==1||status[rx][ry]==-1)continue;
// cout<<rx<<" "<<ry<<"\n";
open_(rx,ry,n,m);
}
}
void autoopen(int x,int y,int n,int m){
int cnt=0;
if(status[x][y]!=1)return ;
if(fl[x][y]==-1){
cout<<"End!";
exit(0);
}
for(int i=0;i<8;i++){
cnt+=fl[x+d[i][0]][y+d[i][1]]==-1;
}
if(fl[x][y]!=cnt)return ;
for(int i=0;i<8;i++){
int rx=d[i][0]+x,ry=d[i][1]+y;
if(rx<0||rx>=n||ry<0||ry>=m)continue;
if(status[rx][ry]==1||status[rx][ry]==-1)continue;
// cout<<rx<<" "<<ry<<"\n";
open_(rx,ry,n,m);
}
}
bool check(int n,int m){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(fl[i][j]==-1)continue;
if(status[i][j]!=1)return 0;
}
}
return 1;
}
void game(game_set gs){
memset(status,0,sizeof status);
int x=0,y=0;
int n=gs.n,m=gs.m;
while(1){
char ch=getch();
if(ch=='W'||ch=='w'){
if(x>0)x--;
}else if(ch=='A'||ch=='a'){
if(y>0)y--;
}else if(ch=='S'||ch=='s'){
if(x<n-1)x++;
}else if(ch=='D'||ch=='d'){
if(y<m-1)y++;
}else if(ch=='J'||ch=='j'){
break;
}
display(gs,x,y);
}
game_init(gs,x,y);
open_(x,y,n,m);
display(gs,x,y);
if(check(n,m))cout<<"Win!",exit(0);
while(1){
char ch=getch();
if(ch=='W'||ch=='w'){
if(x>0)x--;
}else if(ch=='A'||ch=='a'){
if(y>0)y--;
}else if(ch=='S'||ch=='s'){
if(x<n-1)x++;
}else if(ch=='D'||ch=='d'){
if(y<m-1)y++;
}else if(ch=='J'||ch=='j'){
open_(x,y,n,m);
}else if(ch=='K'||ch=='k'){
if(status[x][y]==-1)status[x][y]=0;
else if(status[x][y]==0)status[x][y]=-1;
}else if(ch=='L'||ch=='l'){
autoopen(x,y,n,m);
}
display(gs,x,y);
if(check(n,m))cout<<"Win!",exit(0);
}
}
int main(){
srand(time(0));
game_set gs=menu();
// game_init(gs,0,0);
game(gs);
int n=gs.n,m=gs.m,cnt=gs.cnt;
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// if(fl[i][j]==-1)cout<<"* ";
// else if(fl[i][j]==0)cout<<". ";
// else cout<<fl[i][j]<<" ";
// }
// cout<<"\n\n";
// }
}
-1.0.4
基本可以玩了。
/*
Compiler: C++14 +
*/
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<ctime>
#include<cstdlib>
#include<cstring>
using namespace std;
struct game_set{
int n,m,cnt;
};
bool judgeAdj(int x1,int y1,int x2,int y2);
int limit(int mod);
game_set menu();
void game_init(game_set gs,int fx,int fy);
void display(game_set gs,int x,int y);
void open_(int x,int y,int n,int m);
void autoopen(int x,int y,int n,int m);
bool check(int n,int m);
void game(game_set gs);
void game_end(int sta,int x,int y,int n,int m);
int fl[1010][1010];
int status[1010][1010];
int mark;
int main(){
srand(time(0));
while(1){
game_set gs=menu();
game(gs);
}
}
bool judgeAdj(int x1,int y1,int x2,int y2){
return max(abs(x1-x2),abs(y1-y2))<=1;
}
int limit(int mod){
return RAND_MAX-RAND_MAX%mod;
}
game_set menu(){
mark=0;
system("cls");
cout<<"Minesweeper -1.0.4.\n";
cout<<"[1] Easy (9,9,10)\n";
cout<<"[2] Medium (16,16,40)\n";
cout<<"[3] Expert (16,30,99)\n";
cout<<"[4] Custom\n";
char ch=getch();
while(1){
if(ch=='1')return {9,9,10};
else if(ch=='2')return {16,16,40};
else if(ch=='3')return {16,30,99};
else if(ch=='4'){
system("cls");
game_set gs;
cout<<"Row:";cin>>gs.n;
cout<<"Column:";cin>>gs.m;
cout<<"Mine count:";cin>>gs.cnt;
while(gs.n>=500||gs.m>=500||gs.cnt>gs.n*gs.m-9){
system("cls");
cout<<"Error!\n";
cout<<"Row:";cin>>gs.n;
cout<<"Column:";cin>>gs.m;
cout<<"Mine count:";cin>>gs.cnt;
}
return gs;
}
}
}
void game_init(game_set gs,int fx,int fy){
int n=gs.n,m=gs.m,cnt=gs.cnt;
system("cls");
memset(fl,0,sizeof fl);
memset(status,0,sizeof status);
while(cnt--){
int cx,cy;
do{
cx=rand(),cy=rand();
// cout<<cx<<" "<<cy<<" "<<limit(n)<<" "<<limit(m)<<"\n";
}while(!(cx<limit(n)&&cy<limit(m)&&!judgeAdj(cx%n,cy%m,fx,fy)));
fl[cx%n][cy%m]=-1;
// cout<<"[ok] "<<cnt<<"\n";
}
for(int i=0;i<n;i++)for(int j=0;j<m;j++){
if(fl[i][j]==-1)continue;
for(int ii=max(0,i-1);ii<=min(n-1,i+1);ii++)for(int jj=max(0,j-1);jj<=min(m-1,j+1);jj++){
if(fl[ii][jj]==-1)fl[i][j]++;
}
}
}
void display(game_set gs,int x,int y){
system("cls");
int n=gs.n,m=gs.m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
// cout<<i<<" "<<j<<" "<<fl[i][j]<<" "<<status[i][j]<<"\n";
if(i==x&&j==y){
if(status[i][j]==0)printf("#< ");
else if(status[i][j]==1){
if(fl[i][j]==-1)printf("*< ");
else if(fl[i][j]==0)printf(".< ");
else printf("%d< ",fl[i][j]);
}
else printf("X< ");
}else{
if(status[i][j]==0)printf("# ");
else if(status[i][j]==1){
if(fl[i][j]==-1)printf("* ");
else if(fl[i][j]==0)printf(". ");
else printf("%d ",fl[i][j]);
}
else printf("X ");
}
}
cout<<"\n\n";
}
}
int d[8][2]={1,0,0,1,0,-1,-1,0,1,1,1,-1,-1,1,-1,-1};
void open_(int x,int y,int n,int m){
status[x][y]=1;
if(fl[x][y]==-1){
mark=1;
return ;
}
if(fl[x][y])return ;
for(int i=0;i<8;i++){
int rx=d[i][0]+x,ry=d[i][1]+y;
if(rx<0||rx>=n||ry<0||ry>=m)continue;
if(status[rx][ry]==1||status[rx][ry]==-1)continue;
// cout<<rx<<" "<<ry<<"\n";
open_(rx,ry,n,m);
}
}
void autoopen(int x,int y,int n,int m){
int cnt=0;
if(status[x][y]!=1)return ;
if(fl[x][y]==-1){
mark=1;
return ;
}
for(int i=0;i<8;i++){
cnt+=status[x+d[i][0]][y+d[i][1]]==-1;
}
if(fl[x][y]!=cnt)return ;
for(int i=0;i<8;i++){
int rx=d[i][0]+x,ry=d[i][1]+y;
if(rx<0||rx>=n||ry<0||ry>=m)continue;
if(status[rx][ry]==1||status[rx][ry]==-1)continue;
// cout<<rx<<" "<<ry<<"\n";
open_(rx,ry,n,m);
}
}
bool check(int n,int m){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(fl[i][j]==-1)continue;
if(status[i][j]!=1)return 0;
}
}
return 1;
}
void game(game_set gs){
memset(status,0,sizeof status);
int x=0,y=0;
int n=gs.n,m=gs.m;
while(1){
char ch=getch();
if(ch=='W'||ch=='w'){
if(x>0)x--;
}else if(ch=='A'||ch=='a'){
if(y>0)y--;
}else if(ch=='S'||ch=='s'){
if(x<n-1)x++;
}else if(ch=='D'||ch=='d'){
if(y<m-1)y++;
}else if(ch=='J'||ch=='j'){
break;
}
display(gs,x,y);
}
game_init(gs,x,y);
open_(x,y,n,m);
display(gs,x,y);
if(check(n,m)){game_end(1,x,y,n,m);return ;}
while(1){
char ch=getch();
if(ch=='W'||ch=='w'){
if(x>0)x--;
}else if(ch=='A'||ch=='a'){
if(y>0)y--;
}else if(ch=='S'||ch=='s'){
if(x<n-1)x++;
}else if(ch=='D'||ch=='d'){
if(y<m-1)y++;
}else if(ch=='J'||ch=='j'){
open_(x,y,n,m);
}else if(ch=='K'||ch=='k'){
if(status[x][y]==-1)status[x][y]=0;
else if(status[x][y]==0)status[x][y]=-1;
}else if(ch=='L'||ch=='l'){
autoopen(x,y,n,m);
}
if(mark){game_end(0,x,y,n,m);return ;}
display(gs,x,y);
if(check(n,m)){game_end(1,x,y,n,m);return ;}
}
}
void game_end(int sta,int x,int y,int n,int m){
system("cls");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)status[i][j]=1;
}
display({n,m,-1},x,y);
if(sta==0)cout<<"Game Over!\n";
else cout<<"Win!\n";
cout<<"[M] Back to menu\n";
cout<<"[-] Exit\n";
while(1){
char ch=getch();
if(ch=='M'||ch=='m')return ;
else if(ch=='-')exit(0);
}
}