IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++实现地图控制扫雷(界面优化版 -> 正文阅读

[C++知识库]c++实现地图控制扫雷(界面优化版

首先这种游戏需要地图刷新

大家最先想到的一定是system("cls");了

但是这有一个很大的缺陷

只要走的太快就会闪屏

所以这时需要的就是重设控制台输出位置来保证不闪屏

函数如下:


void gotoxy(int y,int x){  
    COORD pos;  
    pos.X=x;  
    pos.Y=y;  
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); 
}//刷新屏幕 
 

但是,这么写光标依然会乱跳,怎么办呢,那就隐藏光标好了

	CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//光标隐藏 

库函数 Windows.h

接下来做按键判断

需要_getch();?以及 _kbhit();前者得到按下结果, 后者判断键盘是否按下

代码我就不放了

其他都很简单

但有一点,判断一样的数自动显示,这就需要我们万恶的电风扇DFS了

函数代码:


void dianpd(int i, int j) {//深搜点出相同的点	
	if(_isMap[i - 1][j - 1] == _isMap[youy][youx] && mapflag[i - 1][j - 1] == false) {
		mapflag[i - 1][j - 1] = true;
		dianpd(i - 1, j - 1);
	}
	if(_isMap[i - 1][j] ==  _isMap[youy][youx]&& mapflag[i - 1][j] == false){
		mapflag[i - 1][j] = true;
		dianpd(i - 1, j);
	}
	if(_isMap[i - 1][j + 1] == _isMap[youy][youx] && mapflag[i - 1][j + 1] == false) {
		mapflag[i - 1][j + 1] = true;
		dianpd(i - 1, j + 1);
	}
	if(_isMap[i][j - 1] == _isMap[youy][youx] && mapflag[i][j - 1] == false) {	
		mapflag[i][j - 1] = true;
		dianpd(i, j - 1);
	}
	if(_isMap[i][j + 1] == _isMap[youy][youx] && mapflag[i][j + 1] == false) {	
		mapflag[i ][j + 1] = true;
		dianpd(i , j + 1);
	}
	if(_isMap[i + 1][j - 1] == _isMap[youy][youx] && mapflag[i + 1][j - 1] == false) {
		mapflag[i + 1][j - 1] = true;
		dianpd(i + 1, j - 1);
	}	  
	if(_isMap[i + 1][j] == _isMap[youy][youx]  && mapflag[i + 1][j] == false) {
		mapflag[i + 1][j] = true;
		dianpd(i + 1, j);
	}
	if(_isMap[i + 1][j + 1] == _isMap[youy][youx] && mapflag[i + 1][j + 1] == false) {
		mapflag[i + 1][j + 1] = true;
		dianpd(i + 1, j + 1);
	}				
}		
	

嗯接下来基本没有什么了

全代码如下:

//_kbhit() 按下键 
//_getch() 读取键
#include<bits/stdc++.h>
#include <conio.h>
#include <windows.h>

using namespace std;

void gotoxy(int y,int x){  
    COORD pos;  
    pos.X=x;  
    pos.Y=y;  
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); 
}//刷新屏幕 
 
int A; 
int youx = 1;
int res;
int youy = 1;
int x;
int win = 0;
int y;
//你的x,y坐标
bool mapflag[102][102] = {false}; 
char themap[102][102] = {'.'};//地图 
char _isMap[102][102] = {0};
bool flag = 0;

void dianpd(int i, int j) {//深搜点出相同的点	
	if(_isMap[i - 1][j - 1] == _isMap[youy][youx] && mapflag[i - 1][j - 1] == false) {
		mapflag[i - 1][j - 1] = true;
		dianpd(i - 1, j - 1);
	}
	if(_isMap[i - 1][j] ==  _isMap[youy][youx]&& mapflag[i - 1][j] == false){
		mapflag[i - 1][j] = true;
		dianpd(i - 1, j);
	}
	if(_isMap[i - 1][j + 1] == _isMap[youy][youx] && mapflag[i - 1][j + 1] == false) {
		mapflag[i - 1][j + 1] = true;
		dianpd(i - 1, j + 1);
	}
	if(_isMap[i][j - 1] == _isMap[youy][youx] && mapflag[i][j - 1] == false) {	
		mapflag[i][j - 1] = true;
		dianpd(i, j - 1);
	}
	if(_isMap[i][j + 1] == _isMap[youy][youx] && mapflag[i][j + 1] == false) {	
		mapflag[i ][j + 1] = true;
		dianpd(i , j + 1);
	}
	if(_isMap[i + 1][j - 1] == _isMap[youy][youx] && mapflag[i + 1][j - 1] == false) {
		mapflag[i + 1][j - 1] = true;
		dianpd(i + 1, j - 1);
	}	  
	if(_isMap[i + 1][j] == _isMap[youy][youx]  && mapflag[i + 1][j] == false) {
		mapflag[i + 1][j] = true;
		dianpd(i + 1, j);
	}
	if(_isMap[i + 1][j + 1] == _isMap[youy][youx] && mapflag[i + 1][j + 1] == false) {
		mapflag[i + 1][j + 1] = true;
		dianpd(i + 1, j + 1);
	}				
}		
		

void keypd(char key) {//判断按下的键
 
   	if((key == 'W' || key == 'w') && youy != 1) {
   	 	youy --;
	}
	else if((key == 'S' || key == 's') && youy != x ) {
		youy ++;
	}
	else if((key == 'A' || key == 'a') && youx != 1 ) {
	  	youx --;
	}
	else if((key == 'D' || key == 'd') && youx != y ) {
	 	youx ++;
	} 
	else if((key == 'Z' || key == 'z') && _isMap[youy][youx] == '*') {
		cout << "你死了";
		win = 1;
		return;
	} 
	else if((key == 'Z' || key == 'z') && _isMap[youy][youx] != '*') {
		dianpd(youy, youx);//深搜寻找相同 
		mapflag[youy][youx] = true;
	}//判断雷的数量 
	else if(key == 'Q' ) {
		if(!flag) flag  = 1;
		else flag = 0;
	}
}
int main() {//运行
	CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//光标隐藏 
	K:
	win = 0;
	youy = 1;
	youx = 1;
	system("cls");
	cout << "请输入长, 宽, 地雷数量:";
	cin >> x >> y >> A;
	system("cls");
	for(int i = 1; i <= x; i ++) {
		for(int j = 1; j <= y; j ++) {
			mapflag[i][j] = 0;
			_isMap[i][j] = 0;
			themap[i][j] = '.';
		}
	}
    srand(time(0));
	for(int i = 1; i <= A; i++){
		int q, w;
		a:q = rand() % x + 1;
		w = rand() % y + 1;
		if((q <= 1 && w <= 1) || q > x || w > y || _isMap[q][w] == '*') {
			goto a;
		}//随机生成雷 
		else {
			_isMap[q][w] = '*';
		}
	}
	for(int i = 1; i <= x; i ++) {
    	for(int j = 1; j <= y; j ++) {
    		if(_isMap[i][j] != '*') {
    			_isMap[i][j] = '0';
				if(_isMap[i - 1][j - 1] == '*')
					_isMap[i][j]++;
				if(_isMap[i - 1][j] == '*')
					_isMap[i][j]++;
				if(_isMap[i - 1][j + 1] == '*')
					_isMap[i][j]++;
				if(_isMap[i][j - 1] == '*')
					_isMap[i][j]++;
				if(_isMap[i][j + 1] == '*')
					_isMap[i][j]++;
				if(_isMap[i + 1][j - 1] == '*')
					_isMap[i][j]++;
				if(_isMap[i + 1][j] == '*')
					_isMap[i][j]++;
				if(_isMap[i + 1][j + 1] == '*')
					_isMap[i][j]++; 
			}
			if(i == youy && j == youx) themap[i][j] = '&';
    		else themap[i][j] = '.';
    		cout << themap[i][j] << " ";
		}
		cout << endl;
	}
	cout << "boom:" << A << endl << endl << endl;
    while(1) {
    	if(_kbhit()) {
    		while(_kbhit()) {
    			keypd(_getch());
	     	}
	     	if(win) {
	     		Sleep(3000);
	     		goto K;
			}
			gotoxy(0,0);
	     		//system("cls");
	     	res = 0;
        	for(int i = 1; i <= x; i ++) {
    		for(int j = 1; j <= y; j ++) {
    			if(i == youy && j == youx) themap[i][j] = '&';
    			else if(mapflag[i][j] || flag == 1) themap[i][j] = _isMap[i][j];
				else themap[i][j] = '.';
    			cout << themap[i][j] << " ";
    			if(themap[i][j] == '.') res ++;
			}
			cout << endl;
			}
			cout << "boom:" << A << endl;
			if(((res == A && mapflag[youy][youx] != 0))) {
				cout << "你赢了";
				Sleep(3000);
				goto K;
			}
	//	Sleep(500); 
	    } 
	}
	return 0;
} 

本人qq1353652522欢迎交友!

代码是几年前刚学的时候写的所以写的很丑请见谅)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:01:58  更:2021-08-25 12:03:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 6:25:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计