2024暑期真题小测1 赛后总结帖
2024-07-12 09:37:38 By snxx_lvboyuan
老博客
2024-04-09 16:59:05 By snxx_lvboyuan
#include<bits/stdc++.h>//扫雷
#include<windows.h>
#include<conio.h>
#define F(x,y,i) for(int i=x;i<=y;i++)
using namespace std;
const int N=105;
int R,C,L,op;
char mp[N][N],mpt[N][N];
int mpn[N][N],mpc[N][N];
int c[10]={240,249,242,252,241,244,243,240,248},d[10][4]={{0},{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int fnum,lnum,nx=1,ny=1;
bool ft[N][N],Lose,first;
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
void xy(int x,int y){//光标定位
coord.X=y,coord.Y=x;
SetConsoleCursorPosition(hout,coord);
}
void hide(){//隐藏光标
CONSOLE_CURSOR_INFO cursor_info={20,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void color(int c){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);}//设置颜色
void T(int x){//时间
int a=clock(),b=clock();
while(b-a<x)b=clock();
}
void game();//开始游戏
void make(){//生成随机地图
F(1,R,i)F(1,C,j)mp[i][j]='#';
F(1,L,i){
int x=rand()%R+1,y=rand()%C+1;
while(mp[x][y]=='O')x=rand()%R+1,y=rand()%C+1;
mp[x][y]='O';
}
F(1,R,i)F(1,C,j){
if(mp[i][j]=='O')mpn[i][j]=-1,mpc[i][j]=240;
else{
mpn[i][j]=0;F(1,8,k)if(mp[i+d[k][0]][j+d[k][1]]=='O')mpn[i][j]++;
mpc[i][j]=c[mpn[i][j]];
}
}
F(1,R,i)F(1,C,j)if(!mpc[i][j])mpc[i][j]=240;
}
void start(){//初始化
system("color F0"),srand(time(0)),color(242),hide();
printf(
"-----------------------\n"
"| 扫 雷 |\n"
"| wasd:选择位置 |\n"
"| 空格:打开 |\n"
"| 1键:试探周围8个方块 |\n"
"| f键:放置/取消小旗 |\n"
"-----------------------\n"
);
printf("1:初级 2:中级 3:高级 4:自定义\n");
op=getch();
if(op=='1')R=9,C=9,L=10;
else if(op=='2')R=16,C=16,L=40;
else if(op=='3')R=16,C=40,L=99;
else{
system("cls");
printf("请输入行数,列数和雷数 :\n");
scanf("%d%d%d",&R,&C,&L);
if(R>50)R=50;if(R<9)R=9;
if(C>50)C=50;if(C<9)C=9;
if(L>R*C/3)L=R*C/3;
}
lnum=fnum=L;
system("cls");
color(249);
xy(10,0),printf("|"),xy(10,22),printf("|");
F(1,rand()%5+1,i)F(1,21,j){
T(50);
if(j>1)xy(10,j-1),printf(" ");
else xy(10,21),printf(" ");
xy(10,j),printf(".");
}
}
void print(){//打印地图
system("cls"),color(240);
F(1,R,i){
xy(i,1);
F(1,C,j)printf("#"),mpt[i][j]='#';
}
xy(nx,ny),printf("@");
}
bool win(){//判断是否胜利
int cnt=0;
F(1,R,i)F(1,C,j)if(mp[i][j]=='#'&&mpn[i][j]==-1)cnt++;
if(cnt==lnum)return 1;
F(1,R,i)F(1,C,j)if((mpt[i][j]!='F'&&mpn[i][j]==-1)||(mpt[i][j]=='F'&&mpn[i][j]!=-1))return 0;
return 1;
}
bool check(int x,int y){return x>=1&&x<=R&&y>=1&&y<=C;}//判断坐标
void dfs(int x,int y){//深搜打开方块
if(mpn[x][y]>0){
xy(x,y),color(mpc[x][y]),printf("%d",mpn[x][y]);
mpt[x][y]=mpn[x][y]+'0';
return;
}
xy(x,y);color(255);
mpt[x][y]=' ';printf(" ");
F(1,8,i){
nx=x+d[i][0],ny=y+d[i][1];
if(check(nx,ny)&&mpt[nx][ny]=='#'&&mpn[nx][ny]!=-1)dfs(nx,ny);
}
}
void flag(int x,int y){//放置/取消小旗
if(mpt[x][y]=='F'){
mpt[x][y]='#';mpc[x][y]=240;
xy(x,y),color(240),printf("#");
fnum++;
}
else if(mpt[x][y]!=' '){
ft[x][y]=mpn[x][y]==-1;
mpt[x][y]='F';mpc[x][y]=253;
xy(x,y),color(253),printf("F");
fnum--;
}
}
void st(int x,int y){//试探周围8个方块
if(mpt[x][y]<'1'||mpt[x][y]>'8')return;
F(1,8,i){
int xx=x+d[i][0],yy=y+d[i][1];
if(check(xx,yy))
if(mpt[xx][yy]=='F'&&mpn[xx][yy]!=-1){
Lose=1;
return;
}
}
F(1,8,i){
int xx=x+d[i][0],yy=y+d[i][1];
if(check(xx,yy))
if(mpn[xx][yy]==-1&&mpt[xx][yy]!='F')return;
}
F(1,8,i){
int xx=x+d[i][0],yy=y+d[i][1];
if(check(xx,yy)&&mpt[xx][yy]=='#')dfs(xx,yy);
}
}
void begin(){//各种操作
xy(R+1,1),color(240),printf("剩余小旗数:%d ",fnum);
char ch=getch();
color(240);
if(ch=='w'&&check(nx-1,ny)){
xy(nx,ny);
if(mpt[nx][ny]!='#'||mpt[nx][ny]==' ')
color(mpc[nx][ny]);
printf("%c",mpt[nx][ny]);
xy(nx-=1,ny);color(15);printf("@");
}
else if(ch=='s'&&check(nx+1,ny)){
xy(nx,ny);
if(mpt[nx][ny]!='#'||mpt[nx][ny]==' ')
color(mpc[nx][ny]);
printf("%c",mpt[nx][ny]);
xy(nx+=1,ny);color(15);printf("@");
}
else if(ch=='a'&&check(nx,ny-1)){
xy(nx,ny);
if(mpt[nx][ny]!='#'||mpt[nx][ny]==' ')
color(mpc[nx][ny]);
printf("%c",mpt[nx][ny]);
xy(nx,ny-=1);color(15);printf("@");
}
else if(ch=='d'&&check(nx,ny+1)){
xy(nx,ny);
if(mpt[nx][ny]!='#'||mpt[nx][ny]==' ')
color(mpc[nx][ny]);
printf("%c",mpt[nx][ny]);
xy(nx,ny+=1);color(15);printf("@");
}
else{
if(ch==' '&&(!(mpt[nx][ny]<='9'&&mpt[nx][ny]>='0'))&&mpt[nx][ny]!='F'){
mpc[nx][ny]=c[mpn[nx][ny]];
if(mpn[nx][ny]==-1){
if(!first){
Lose=1;
return;
}
}
if(first&&mpn[nx][ny]!=0){//第一次没点到空白就重新制作地图
while(mpn[nx][ny]!=0)make();
print(),dfs(nx,ny);
}
dfs(nx,ny);
first=0;
}
else if(ch=='1'){
st(nx,ny);
F(1,8,i){
int xx=nx+d[i][0],yy=ny+d[i][1];
if(check(xx,yy)){
xy(xx,yy);
if(mpt[xx][yy]!='#')color(mpc[xx][yy]);
else color(240);
printf("%c",mpt[xx][yy]);
}
}
}
else if(ch=='f'&&(mpt[nx][ny]>'9'||mpt[nx][ny]<'1'))flag(nx,ny);
}
}
void end(){//游戏失败
color(240);
F(1,R,i){
xy(i,1);
F(1,C,j){
if(mpt[i][j]=='F'&&!ft[i][j])color(252),printf("X");
else if(mpn[i][j]==-1)color(240),printf("O");
else if(!mpn[i][j])color(240),printf(" ");
else color(mpc[i][j]),printf("%d",mpn[i][j]);
}
}
printf("\n\nGAME OVER\n");
}
int main(){
start(),make(),game();
}
void game(){
system("cls"),print(),first=1;
while(1){
begin();
if(Lose)end(),system("pause"),exit(0);
if(win())system("cls"),printf("YOU WIN\n"),system("pause"),exit(0);
}
}
共 2 篇博客