扫雷
  • 板块灌水区
  • 楼主Robert08
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/11/8 16:37
  • 上次更新2023/11/5 08:27:43
查看原帖
扫雷
286116
Robert08楼主2020/11/8 16:37
#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#define framex 10
#define framey 3 
#define R 10
#define C 20
#define W 20 
using namespace std;
int flag=40, bom=40; 
int pass=1; 
int Currx = framex;
int Curry = framey;

struct point
{
	string str = "□";			//对应显示在界面上的点,初始化为棋盘的默认格子"□"
	string num = "■";
	//"■"代表该点为中心的九宫格中没有地雷
	//"1 "——"8 "代表该点为中心的九宫格中有1——8个地雷,笔者成为数字点
	int judge = 0;				//确定区域时是否被遍历的标记
	int x = 0;					//是否含有地雷的标记,0对应false,1对应true
	int sta=0;
}Point[W][W];

void gotoxy(HANDLE fd, int x, int y){
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(fd, pos);//实现对光标的控制 ,windows.h
};
//隐藏光标
void HideTheCursor(HANDLE fd)
{
   CONSOLE_CURSOR_INFO cciCursor;

   if(GetConsoleCursorInfo(fd, &cciCursor))
   {
      cciCursor.bVisible = FALSE;
      SetConsoleCursorInfo(fd, &cciCursor);
   }
}

//展示光标 
void ShowTheCursor(HANDLE fd)
{
   CONSOLE_CURSOR_INFO cciCursor;

   if(GetConsoleCursorInfo(fd, &cciCursor))
   {
      cciCursor.bVisible = TRUE;
      SetConsoleCursorInfo(fd, &cciCursor);
   }
}
void Game_Menu(HANDLE fd){//游戏开始菜单 
  system("cls");  //实现清屏操作
  gotoxy(fd, framex, 5);
  cout << "*******************";
  gotoxy(fd, framex, 7);
  cout << "       扫雷        ";
  gotoxy(fd, framex, 9);
  cout << "     任意键开始    ";
  gotoxy(fd, framex, 11);
  cout << "     按q或Q退出    ";
  gotoxy(fd, framex, 13);
  cout << "     按w,a,s,d移动    ";
  gotoxy(fd, framex, 15);
  cout << "     按j插旗,k确认    ";
  gotoxy(fd, framex, 17);
  cout << "     按p翻开   ";
  gotoxy(fd, framex, 19);
  cout << "*******************";
  //_getch();
};

void color(int m){//改变输出符号的颜色 
  HANDLE consolehend;
  consolehend = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(consolehend, m); 
};

int DrawMap(HANDLE fd){//新的关卡开始时载入地图 
  //HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
  system("cls");  //实现清屏操作
  gotoxy(fd, framex + C, framey - 3);
  color(15);
  cout << "第" << pass << "关";
  //printf("第%d关", pass); 
  for(int i = 0; i < W; i++){
    gotoxy(fd, framex, framey + i);
    for(int j = 0; j < W; j++){       
      cout<<Point[i][j].str;
    }
  }
for(int i=1;i<=40;){
		 int n=rand()%19+0;
		 int m=rand()%19+0;
		 if (Point[n][m].x==0){
		 	Point[n][m].x=1;
		 	if(n!=0)  Point[n-1][m].sta++;
		 	if(n!=0&&m!=0)    Point[n-1][m-1].sta++;
		    if(n!=0&&m!=19)	Point[n-1][m+1].sta++;
		 	if(m!=0)	Point[n][m-1].sta++;
		 	if(m!=19)	Point[n][m+1].sta++;
		 	if(n!=19&&m!=0)	Point[n+1][m-1].sta++;
		 	if(n!=19)	Point[n+1][m].sta++;
		 	if(n!=19&&m!=19)	Point[n+1][m+1].sta++;
			i++;
		 }	
	}
	/*for(int i=0;i<=19;i++){
		cout<<endl;
		for(int j=0;j<=19;j++){
			if(Point[i][j].x==0)	cout<<Point[i][j].sta<<" ";
			else	cout<<"o ";
		}
	}*/             //测试 
  return 0;
};
int DrawPoint(HANDLE fd,int x,int y)
{
	gotoxy(fd, x, y);
	cout<<Point[x-framex][y-framey].str;
	gotoxy(fd, x, y);
}
void Move(HANDLE fd,int x,int y){
	gotoxy(fd, x, y);	
	ShowTheCursor(fd); 
}
int c=0;
int InputPro(HANDLE fd,char ch){

	switch(ch)
	{     
	    case 'w'://上 
	    case 'W':
	    	{
	    		if(Curry>framey)   Curry --;  	
				Move(fd, Currx, Curry);	
	    		break;
	    	}
	    case 'a'://左 
	    case 'A':
	    //case 75:
	    	{
	    		if(Currx>framex+1)   Currx -=2; 
				Move(fd, Currx, Curry);
	    		break;
	    	}
	    case 's'://下 
	    case 'S':
	    	{
	    		if(Curry<framey+W-1)   Curry ++;  	
				Move(fd, Currx, Curry);
	    		break;
	    	}
	    case 'd'://右 
	    case 'D':
	    	{
	    		if(Currx<framex+2*W-2)   Currx +=2;   	
				Move(fd, Currx, Curry);
	    		break;
	    	}
	    case 'j'://插旗子 
	    case 'J':
	    	{
	    		Point[(Currx-framex)/2][Curry-framey].str="★";
	    		DrawPoint(fd,Currx,Curry);
	    		break;
	    	}
	    case 'k'://确认 
	    case 'K':
	    	{
	    		Point[(Currx-framex)/2][Curry-framey].str="■";
	    		DrawPoint(fd,Currx,Curry);
	    		flag--;
	    		//处理游戏结果 
	    		break;
	    	}
	    case'p':
	    case'P':
	    	{
	    		if(Point[(Currx-framex)/2][Curry-framey].x==1)	{
	    			Point[(Currx-framex)/2][Curry-framey].str="●";
	    			cout<<"●";
	    			Move(fd, 10, 46);	    			
					cout<<"dead!";
					c=1;
	    		}
	    		else{
	    			cout<< Point[(Currx-framex)/2][Curry-framey].sta<<" ";
	    		}
					Move(fd, Currx, Curry);
	    	}
	    default:; 
	    return c;
	}	
}

int main()
{
	////这里,获取标准输出设备的句柄,并将其赋给句柄变量fd
	HANDLE fd = GetStdHandle(STD_OUTPUT_HANDLE);
	
	//游戏主界面 
	Game_Menu(fd); 
	char ch = getch();//从控制台读取一个字符,但不显示在屏幕上,读取输入的键位,conio.h 	
	if(ch == 'q' || ch == 'Q') return 0;
	//生成地图
	DrawMap(fd);
	gotoxy(fd, Currx, Curry);	
	//开始游戏
	while(1)
	{
		ch = getch();
	    if(ch == 'q' || ch == 'Q') 
		{
			gotoxy(fd, framex+W, framey+W);	
			return 0;
		}
		
		InputPro(fd,ch);		
		if(c==1)	{
			Move(fd, 10, 24);
			cout<<"正确答案:"<<endl; 
			for(int i=0;i<=19;i++){ Move(fd,10,25+i);
		for(int j=0;j<=19;j++){
			if(Point[j][i].x==0)	cout<<Point[j][i].sta<<" ";
			else	cout<<"●";
		}
	}
		Move(fd, 10, 47);
		return 0;
		}
		if (flag==0){
			int co=0;
			for(int i=0;i<=19;i++)
				for(int j=0;j<=19;j++){
					if(Point[i][j].x==1&&Point[i][j].str=="■")	
					co++;
			}
			cout<<"正确判断:"<<co;
			return 0;
		}
		//失败或者通关,继续选择关卡 
		
			   
	}
	
	

	 
} 

2020/11/8 16:37
加载中...