c++编游戏-扫雷-c++游戏将彩色化-windows7自带扫雷游戏休闲娱乐

前言

windows一直有自带小游戏,其中一个便是扫雷。扫雷是一个十分经典的游戏,学会了这个代码怎么写,你也会做一些题了——比如连通块,片区面积,等等。

关于扫雷

作者的扫雷,共

1095行,

28619个字符,

3个函数,

内存2.9MB。

测试环境:

Windows7,

c++编译器5.11

创作此代码历经3个月,104次测试,少量bug,暂时没找到问题。#不影响使用#

代码分解

(完整代码放在篇尾,如果实在复制地恼火,点击下面链接免费下载cpp文件)

(文件正在审核中)

文件的开头

#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#include<bits/stdc++.h>
using namespace std;
int again=0,hang,lie,lei,jsq,sjhang,sjlie,cj[40][40],i,j,k,ms=0,sum=0,lose=0;
char tmp[40][40],play[40][40],input;

函数3个,分别指:

空格查找模块

修改模式模块

主函数。

void space(int i,int j);
void moshi();
int main()

前面是菜单和初始化:

int main()
{
	HANDLE consolehwnd;//创建句柄
	consolehwnd=GetStdHandle(STD_OUTPUT_HANDLE);//实例化句柄
	srand(time(NULL));
	while(again==0)
	{
		system("cls");//20
		SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_BLUE);
		cout<<"welcome to minesweeper!\n初级:10X10,10个雷:1\n中级:16X16,40个雷:2\n高级:16X30,99个雷:3\n自定义:其它数字\n";
		cin>>jsq;
		if(jsq==1)hang=10,lie=10,lei=10;
		else if(jsq==2)hang=16,lie=16,lei=40;
		else if(jsq==3)hang=16,lie=30,lei=99;
		else
		{
			system("cls");
			cout<<"行数:";
			cin>>hang;
			cout<<"列数:";
			cin>>lie;
			cout<<"雷数:";
			cin>>lei;
			if(hang<9)hang=9;
			if(hang>24)hang=24;
			if(lie<9)lie=9;
			if(lie>30)lie=30;
			if(lei>688)lei=688;
			if(lei<10)lei=10;
			if(lei<hang*lie/72)lei=hang*lie/72;
			if(lei>hang*lie*9/10)lei=hang*lie*9/10;//变量的准备
		}
		cout<<"开启开局作弊?开:1,关:0\n";
		cin>>jsq;
		cout<<"------------------------------\n";
		for(i=0; i<hang+1; ++i)//22
		{
			for(j=0; j<lie+1; ++j)
			{
				tmp[i][j]='0';
			}
		}//初始化地图为0
		for(i=0; i<lei; ++i)//39
		{
			sjhang=rand()%hang+1,sjlie=rand()%lie+1;
			while(tmp[sjhang][sjlie]=='*')
			{
				sjhang=rand()%hang+1,sjlie=rand()%lie+1;
			}
			tmp[sjhang][sjlie]='*';
		}//随机设置雷
		for(i=1; i<=hang; ++i) //54
		{
			for(j=1; j<=lie; ++j)
			{
				if(tmp[i  ][j  ]=='*')continue;
				if(tmp[i-1][j-1]=='*')tmp[i][j]++;
				if(tmp[i-1][j  ]=='*')tmp[i][j]++;
				if(tmp[i-1][j+1]=='*')tmp[i][j]++;
				if(tmp[i  ][j+1]=='*')tmp[i][j]++;
				if(tmp[i+1][j+1]=='*')tmp[i][j]++;
				if(tmp[i+1][j  ]=='*')tmp[i][j]++;
				if(tmp[i+1][j-1]=='*')tmp[i][j]++;
				if(tmp[i  ][j-1]=='*')tmp[i][j]++;
			}
		}//数字
		for(i=1; i<=hang; ++i) //69
		{
			for(j=1; j<=lie; ++j)
			{
				if(tmp[i][j]=='0')
				{
					tmp[i][j]=' ';
				}
			}
		}//空格
		for(i=1; i<=hang; ++i)
		{
			for(j=1; j<=lie; ++j)
			{
				play[i][j]=(char)30;
			}
		}
		//begin
		SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GREEN);
		cout<<"正在准备棋盘.";
		Sleep(1000/3);
		cout<<".";
		Sleep(1000/3);
		cout<<".";
		Sleep(1000/3);
		cout<<".";
		Sleep(1000/3);
		cout<<".";
		Sleep(1000/3);
		cout<<".";
		Sleep(1000/3);
		if(jsq==1)
		{
			cout<<"\n正在进行作弊.";
			Sleep(1000/3);
			cout<<".";
			Sleep(1000/3);
			cout<<".";
			Sleep(1000/3);
			cout<<".";
			Sleep(1000/3);
			cout<<".";
			Sleep(1000/3);
			cout<<".";
			Sleep(1000/3);
			sjhang=rand()%hang+1,sjlie=rand()%lie+1;
			jsq=0;
			while(tmp[sjhang][sjlie]!=' '&&jsq<hang*lie)
			{
				sjhang=rand()%hang+1,sjlie=rand()%lie+1;
				jsq++;
			}
			while(tmp[sjhang][sjlie]=='*')
			{
				sjhang=rand()%hang+1,sjlie=rand()%lie+1;
				jsq++;
			}
			play[sjhang][sjlie]=tmp[sjhang][sjlie];
			if(jsq<hang*lie||jsq==hang*lie)
			space(sjhang,sjlie);
		}

100行。

判断是否胜利和输入板块:

while(jsq!=lei)
		{
			system("cls");
			jsq=0,sum=0;
			for(i=0; i<=hang; ++i)//484
			{
				if(i==0)
				{
					SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_RED);
					cout<<' ';
					for(k=0; k<=lie; ++k)
					{
						if(k<10)cout<<k<<' ';
						else cout<<k;
					}
					cout<<'\n';
					continue;
				}
				for(j=0; j<=lie; ++j)
				{
					if(j==0)
					{
						SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_RED);
						cout<<setw(2)<<i<<' ';
						SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
						continue;
					}
					if(play[i][j]==(char)30||play[i][j]==(char)19)jsq++;
					if(play[i][j]==(char)30||play[i][j]==' ')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
					if(play[i][j]==(char)19)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
					if(play[i][j]=='1')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
					if(play[i][j]=='2')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
					if(play[i][j]=='3')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
					if(play[i][j]=='4')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
					if(play[i][j]=='5')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE);
					if(play[i][j]=='6')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
					if(play[i][j]=='7')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
					if(play[i][j]=='8')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
					cout<<play[i][j]<<' ';
					SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
				}
				cout<<'\n';
			}//输出
			if(jsq==lei)//501
			{
				Sleep(1000);
				system("cls");
				for(i=1; i<=hang; ++i)
				{
					for(j=1; j<=lie; ++j)
					{
						if(tmp[i][j]=='*')
						{
							SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_RED);
							play[i][j]='*';
						}
						else
						{
							if(play[i][j]==(char)30||play[i][j]==' ')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
							if(play[i][j]==(char)19)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
							if(play[i][j]=='1')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
							if(play[i][j]=='2')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
							if(play[i][j]=='3')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
							if(play[i][j]=='4')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
							if(play[i][j]=='5')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_BLUE);
							if(play[i][j]=='6')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
							if(play[i][j]=='7')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
							if(play[i][j]=='8')SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
						}
						cout<<play[i][j]<<' ';
						SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
					}
					cout<<'\n';
				}
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
				cout<<"You win.\nagain:0\n";
				cin>>again;
				continue;
			}//胜利条件
			sjhang=0,sjlie=0,ms=0,lose=0,sum=0;
			cout<<"当前模式:开方块模式\n";
			cout<<"行数:(切换模式请按A。)";
			while(sjhang%10==0)
			{
				input=getch();
				if(input=='A'||input=='a')
				{
					ms=1;
					moshi();
					break;
				}
				if(input=='/')
				{
					if(sjhang!=0)
					{
						cout<<'\n';
						break;
					}
					else continue;
				}
				if(input=='0')
				{
					sjhang+=10;
					cout<<"+10";
				}
				if(input=='1')
				{
					sjhang+=1;
					cout<<"+1\n";
				}
				if(input=='2')
				{
					sjhang+=2;
					cout<<"+2\n";
				}
				if(input=='3')
				{
					sjhang+=3;
					cout<<"+3\n";
				}
				if(input=='4')
				{
					sjhang+=4;
					cout<<"+4\n";
				}
				if(input=='5')
				{
					sjhang+=5;
					cout<<"+5\n";
				}
				if(input=='6')
				{
					sjhang+=6;
					cout<<"+6\n";
				}
				if(input=='7')
				{
					sjhang+=7;
					cout<<"+7\n";
				}
				if(input=='8')
				{
					sjhang+=8;
					cout<<"+8\n";
				}
				if(input=='9')
				{
					sjhang+=9;
					cout<<"+9\n";
				}
			}
			if(ms==1)
				continue;
			while(sjhang>hang)
			{
				cout<<"无效的输入!请重新输入!\n行数:";
				sjhang=0;
				while(sjhang%10==0)
				{
					input=getch();
					if(input=='/')
					{
						if(sjhang!=0)
						{
							cout<<'\n';
							break;
						}
						else continue;
					}
					if(input=='0')
					{
						sjhang+=10;
						cout<<"+10";
					}
					if(input=='1')
					{
						sjhang+=1;
						cout<<"+1\n";
					}
					if(input=='2')
					{
						sjhang+=2;
						cout<<"+2\n";
					}
					if(input=='3')
					{
						sjhang+=3;
						cout<<"+3\n";
					}
					if(input=='4')
					{
						sjhang+=4;
						cout<<"+4\n";
					}
					if(input=='5')
					{
						sjhang+=5;
						cout<<"+5\n";
					}
					if(input=='6')
					{
						sjhang+=6;
						cout<<"+6\n";
					}
					if(input=='7')
					{
						sjhang+=7;
						cout<<"+7\n";
					}
					if(input=='8')
					{
						sjhang+=8;
						cout<<"+8\n";
					}
					if(input=='9')
					{
						sjhang+=9;
						cout<<"+9\n";
					}
				}
			}
			cout<<"列数:";
			while(sjlie%10==0)
			{
				input=getch();
				if(input=='/')
				{
					if(sjlie!=0)
					{
						cout<<'\n';
						break;
					}
					else continue;
				}
				if(input=='0')
				{
					sjlie+=10;
					cout<<"+10";
				}
				if(input=='1')
				{
					sjlie+=1;
					cout<<"+1\n";
				}
				if(input=='2')
				{
					sjlie+=2;
					cout<<"+2\n";
				}
				if(input=='3')
				{
					sjlie+=3;
					cout<<"+3\n";
				}
				if(input=='4')
				{
					sjlie+=4;
					cout<<"+4\n";
				}
				if(input=='5')
				{
					sjlie+=5;
					cout<<"+5\n";
				}
				if(input=='6')
				{
					sjlie+=6;
					cout<<"+6\n";
				}
				if(input=='7')
				{
					sjlie+=7;
					cout<<"+7\n";
				}
				if(input=='8')
				{
					sjlie+=8;
					cout<<"+8\n";
				}
				if(input=='9')
				{
					sjlie+=9;
					cout<<"+9\n";
				}
			}
			while(sjlie>lie)
			{
				cout<<"无效的输入!请重新输入!\n列数:";
				sjlie=0;
				while(sjlie%10==0)
				{
					input=getch();
					if(input=='/')
					{
						if(sjlie!=0)
						{
							cout<<'\n';
							break;
						}
						else continue;
					}
					if(input=='0')
					{
						sjlie+=10;
						cout<<"+10";
					}
					if(input=='1')
					{
						sjlie+=1;
						cout<<"+1\n";
					}
					if(input=='2')
					{
						sjlie+=2;
						cout<<"+2\n";
					}
					if(input=='3')
					
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值