扫雷F版 Beta 1.2.3
扫雷F版 Beta 1.2.3
无病毒 欢迎试玩 提出的建议大概率会采纳
/* Copyright Flintmall, 2px Studio, 2024. All rights reserved. */
/* Minesweeper Ver. F */
/* 作者:Flintmall */
/* 扫雷F版 Release 1.1 */
/* 致谢 Olive__ WeiBoYu */
#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
using namespace std;
void setColor(int color){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
return ;
}
void cls(){
system("cls");
return ;
}
void wait(double n){
_sleep(n * 1000);
return ;
}
void wncls(double n){
_sleep(n * 1000);
cls();
return ;
}
void waitEnter(){
while(true){
if(_kbhit()){
int ch = _getch();
if(ch == 13){
break;
}
}
}
}
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
int vis[7][9];
char white[6][8] = {
{' ','1','2','3','4','5','6','7'},
{'1','#','#','#','#','#','#','#'},
{'2','#','#','#','#','#','#','#'},
{'3','#','#','#','#','#','#','#'},
{'4','#','#','#','#','#','#','#'},
{'5','#','#','#','#','#','#','#'}
};
char black[7][9] = {};
void dfs(int x,int y){
vis[y][x] = 1;
if((black[y][x] >= '1' && black[y][x] <= '9') || black[y][x] == '.'){
white[y][x] = black[y][x];
}
if(black[y][x] == '.'){
for(int i = 0;i < 4;i++){
int nx = x + dx[i],ny = y + dy[i];
if(nx > 0 && ny > 0 && nx < 8 && ny < 6 && !vis[ny][nx]){
dfs(nx,ny);
}
}
}
}
int random(int x){
srand(time(0));
int m = rand() % x + 1;
return m;
}
int flag,bomb;
void generate(){
for(int i = 0;i < 7;i++){
for(int j = 0;j < 9;j++){
vis[i][j] = 0;
}
}
for(int i = 0;i < 7;i++){
for(int j = 0;j < 9;j++){
black[i][j] = ' ';
}
}
for(int i = 1;i < 6;i++){
for(int j = 1;j < 8;j++){
white[i][j] = '#';
}
}
flag = 0,bomb = 0;
int k1 = random(1),j1 = random(2);
black[k1][j1] = '*';
int k2 = random(2),j2 = random(3);
black[k2][j2] = '*';
int k3 = random(3),j3 = random(4);
black[k3][j3] = '*';
int k4 = random(4),j4 = random(5);
black[k4][j4] = '*';
int k5 = random(5),j5 = random(6);
black[k5][j5] = '*';
int k6 = random(6),j6 = random(7);
black[k6][j6] = '*';
int k7 = random(7),j7 = random(8);
black[k7][j7] = '*';
for(int i = 0;i < 7;i++){
for(int j = 0;j < 9;j++){
if(black[i][j] != '*' || i == 0 || j == 0 || i == 6 || j == 8){
black[i][j] = ' ';
}
}
}
for(int i = 0;i < 6;i++){
for(int j = 0;j < 8;j++){
int sum = 0;
if(black[i][j] != '*'){
if(black[i - 1][j - 1] == '*'){
sum++;
}
if(black[i - 1][j] == '*'){
sum++;
}
if(black[i - 1][j + 1] == '*'){
sum++;
}
if(black[i][j - 1] == '*'){
sum++;
}
if(black[i][j + 1] == '*'){
sum++;
}
if(black[i + 1][j - 1] == '*'){
sum++;
}
if(black[i + 1][j] == '*'){
sum++;
}
if(black[i + 1][j + 1] == '*'){
sum++;
}
if(sum == 0){
black[i][j] = '.';
}
else if(sum == 1){
black[i][j] = '1';
}
else if(sum == 2){
black[i][j] = '2';
}
else if(sum == 3){
black[i][j] = '3';
}
else if(sum == 4){
black[i][j] = '4';
}
else if(sum == 5){
black[i][j] = '5';
}
else if(sum == 6){
black[i][j] = '6';
}
else if(sum == 7){
black[i][j] = '7';
}
else if(sum == 8){
black[i][j] = '8';
}
}
else{
flag += 1;
}
}
}
for(int i = 0;i < 7;i++){
for(int j = 0;j < 9;j++){
if(i == 0 || j == 0 || i == 6 || j == 8){
black[i][j] = ' ';
}
}
}
bomb = flag;
return ;
}
void calculate(){
for(int i = 0;i < 6;i++){
for(int j = 0;j < 8;j++){
int sum = 0;
if(black[i][j] != '*'){
if(black[i - 1][j - 1] == '*'){
sum++;
}
if(black[i - 1][j] == '*'){
sum++;
}
if(black[i - 1][j + 1] == '*'){
sum++;
}
if(black[i][j - 1] == '*'){
sum++;
}
if(black[i][j + 1] == '*'){
sum++;
}
if(black[i + 1][j - 1] == '*'){
sum++;
}
if(black[i + 1][j] == '*'){
sum++;
}
if(black[i + 1][j + 1] == '*'){
sum++;
}
if(sum == 0){
black[i][j] = '.';
}
else if(sum == 1){
black[i][j] = '1';
}
else if(sum == 2){
black[i][j] = '2';
}
else if(sum == 3){
black[i][j] = '3';
}
else if(sum == 4){
black[i][j] = '4';
}
else if(sum == 5){
black[i][j] = '5';
}
else if(sum == 6){
black[i][j] = '6';
}
else if(sum == 7){
black[i][j] = '7';
}
else if(sum == 8){
black[i][j] = '8';
}
}
else{
flag += 1;
}
}
}
for(int i = 0;i < 7;i++){
for(int j = 0;j < 9;j++){
if(i == 0 || j == 0 || i == 6 || j == 8){
black[i][j] = ' ';
}
}
}
bomb = flag;
}
int click = 0;
int main(){
system("color F");
int wintimes = 0;
for(int i = 3;i > 0;i--){
cout<<"生成随机种子中……"<<endl;
cout<<"还有 "<<i<<" 秒开始游戏……"<<endl;
wncls(1);
}
generate();
while(true){
cout<<" -= 扫雷F版 Release v1.1 =-"<<endl;
cout<<" 请输入操作符来进行操作"<<endl;
cout<<" q x y:打开位置在(x,y)的格子"<<endl;
cout<<"w x y:将位置在(x,y)的格子插上旗帜"<<endl;
cout<<"e x y:将位置在(x,y)的格子插上问号"<<endl;
cout<<" g:打开游戏操作指南"<<endl;
cout<<" u:打开更新日志"<<endl;
cout<<" 连胜:"<<wintimes<<endl;
cout<<" :) "<<endl;
cout<<" -======================-"<<endl;
for(int i = 0;i < 6;i++){
cout<<" ";
for(int j = 0;j < 8;j++){
if(j != 0 && i != 0){
if(white[i][j] == '1'){
setColor(3);
}
else if(white[i][j] == '2'){
setColor(2);
}
else if(white[i][j] == '3'){
setColor(4);
}
else if(white[i][j] == '4'){
setColor(8);
}
else if(white[i][j] == '5'){
setColor(6);
}
else if(white[i][j] == '6'){
setColor(14);
}
else if(white[i][j] == '7'){
setColor(1);
}
else if(white[i][j] == '8'){
setColor(15);
}
else{
setColor(8);
}
}
else{
setColor(15);
}
cout<<white[i][j]<<" ";
setColor(15);
}
cout<<endl;
}
cout<<" -======================-"<<endl;
cout<<" 你剩下的旗帜:";
if(click == 0){
cout<<"?"<<endl;
}
else{
cout<<flag<<endl;
}
cout<<"输入操作|";
char chose;
int x,y;
cin>>chose;
if(chose == 'q' || chose == 'w' || chose == 'e'){
cin>>x>>y;
}
if(chose == 'q' && x > 0 && y > 0 && x < 8 && y < 6){
click++;
if(black[y][x] != '*' || (black[y][x] == '*' && click == 1)){
white[y][x] = black[y][x];
}
if(white[y][x] == '!'){
flag += 1;
}
if(black[y][x] == '*'){
if(click != 1){
cls();
cout<<" -======================-"<<endl;
cout<<" 你炸了!"<<endl;
cout<<" x("<<endl;
cout<<" -======================-"<<endl;
wintimes = 0;
for(int i = 0;i < 6;i++){
cout<<" ";
for(int j = 0;j < 8;j++){
if(j != 0 && i != 0){
if(black[i][j] == '1'){
setColor(3);
}
else if(black[i][j] == '2'){
setColor(2);
}
else if(black[i][j] == '3' || black[i][j] == '*'){
setColor(4);
}
else if(black[i][j] == '4'){
setColor(8);
}
else if(black[i][j] == '5'){
setColor(6);
}
else if(black[i][j] == '6'){
setColor(14);
}
else if(black[i][j] == '7'){
setColor(1);
}
else if(black[i][j] == '8'){
setColor(15);
}
else{
setColor(8);
}
cout<<black[i][j]<<" ";
}
else{
setColor(15);
cout<<white[i][j]<<" ";
}
setColor(15);
}
cout<<endl;
}
cout<<"输入c再来一次,输入t退出游戏。"<<endl;
char continueOrNot;
cin>>continueOrNot;
if(continueOrNot == 'c'){
click = 0;
generate();
}
else{
break;
return 0;
}
}
else{
black[y][x] = '.';
calculate();
}
}
else if(black[y][x] == '.'){
dfs(x,y);
}
}
else if(chose == 'w' && x > 0 && y > 0 && x < 8 && y < 6){
white[y][x] = '!';
flag -= 1;
if(black[y][x] == '*'){
bomb -= 1;
}
}
else if(chose == 'e' && x > 0 && y > 0 && x < 8 && y < 6){
white[y][x] = '?';
if(white[y][x] == '!'){
flag += 1;
}
}
else if(chose == 'u'){
cls();
char version = 'a';
while(true){
cout<<"更新日志"<<endl;
if(version == 'a'){
cout<<endl;
cout<<"2024/8/6 8:56 扫雷F版 Alpha v1.0.9:"<<endl;
cout<<" ·增加了输后在这一局游戏的基础上再来一局的功能。"<<endl;
cout<<" ·增加了赢后再来一局的功能。"<<endl;
cout<<endl;
cout<<"2024/8/5 11:20 扫雷F版 Alpha v1.0.8:"<<endl;
cout<<" ·修复了显示空格时旁侧的数字会消失的BUG。"<<endl;
cout<<endl;
cout<<"2024/8/3 11:48 扫雷F版 Alpha v1.0.7:"<<endl;
cout<<" ·更改了空格显示机制。"<<endl;
cout<<endl;
cout<<"2024/8/3 11:27 扫雷F版 Alpha v1.0.6:"<<endl;
cout<<" ·添加了1个彩蛋。:)"<<endl;
cout<<endl;
cout<<"2024/8/3 10:24 扫雷F版 Alpha v1.0.5:"<<endl;
cout<<" ·更改了操作符。"<<endl;
cout<<endl;
cout<<"2024/3/3 9:18 扫雷F版 Alpha v1.0.4:"<<endl;
cout<<" ·添加了数字颜色。"<<endl;
cout<<endl;
cout<<"2023/12/24 10:55 扫雷F版 Alpha v1.0.3:"<<endl;
cout<<" ·优化了打开更新日志的方式。"<<endl;
cout<<" ·缩短了开始时间。"<<endl;
cout<<endl;
cout<<"2023/12/10 10:49 扫雷F版 Alpha v1.0.2:"<<endl;
cout<<" ·更改了底层代码。"<<endl;
cout<<endl;
cout<<"2023/11/12 11:45 扫雷F版 Alpha v1.0.1:"<<endl;
cout<<" ·增加了“你赢了!”页面。"<<endl;
cout<<" ·对“你炸了!”页面进行修改。"<<endl;
cout<<" ·增加了游戏结束后的“游戏结束!”语句。"<<endl;
cout<<endl;
cout<<"2023/11/12 11:20 扫雷F版 Alpha v1.0:"<<endl;
cout<<" ·增加了随机雷区。"<<endl;
cout<<" ·增加了更新日志。"<<endl;
cout<<endl;
}
else if(version == 'b'){
cout<<endl;
cout<<"2024/11/3 11:58 扫雷F版 Beta v1.2.3:"<<endl;
cout<<" ·增加了第一步保护机制,现在第一次点击必定不会是雷了。
"<<endl;
cout<<endl;
cout<<"2024/10/18 15:03 扫雷F版 Beta v1.2.2:"<<endl;
cout<<" ·简化了游戏底层代码。"<<endl;
cout<<" ·修改了失败后再来一局的机制,现在失败后再来一局是随机的一局新游戏了。"<<endl;
cout<<endl;
cout<<"2024/10/18 14:44 扫雷F版 Beta v1.2.1:"<<endl;
cout<<" ·修复了再来一局后空格旁格显示有误的BUG。"<<endl;
cout<<endl;
cout<<"2024/10/13 10:45 扫雷F版 Beta v1.2:"<<endl;
cout<<" ·完善了空格旁格显示机制。"<<endl;
cout<<endl;
cout<<"2024/8/6 17:30 扫雷F版 Beta v1.0"<<endl;
cout<<" ·修复了打开更新日志后关不掉的BUG。"<<endl;
cout<<" ·修复了更新日志不会刷新页面的BUG。"<<endl;
}
else if(version == 'r'){
cout<<endl;
cout<<"2024/8/6 17:50 扫雷F版 Release v1.1:"<<endl;
cout<<" ·添加了2个彩蛋。;D"<<endl;
cout<<" ·对版本日志页面重新布局。"<<endl;
cout<<endl;
cout<<"2024/8/6 14:00 扫雷F版 Release v1.0:"<<endl;
cout<<" ·正式版发布。"<<endl;
cout<<" ·增加连胜显示。"<<endl;
}
else if(version == 't'){
break;
}
cout<<"输入a查看Alpha版本的版本日志,输入b查看先遣版(Beta)的版本日志,输入r查看正式版(Release)的版本日志,输入t关闭版本日志。"<<endl;
cin>>version;
system("cls");
}
}
else if(chose == 'k'){
cls();
while(true){
cout<<"嘟嘟嗒嘟嘟嗒·ω·"<<endl;
cout<<"你找到了柯哀小彩蛋!"<<endl;
cout<<"既然找到小彩蛋,不如休息一下吧qwq"<<endl;
waitEnter();
break;
}
}
else if(chose == 'i'){
cls();
int egg = 7;
while(true){
cout<<"享受柯哀小音效吧=)"<<endl;
cout<<"Enter关闭"<<endl;
cout<<char(egg);
cout<<char(egg);
cout<<char(egg);
waitEnter();
break;
}
}
else if(chose == 'f'){
cls();
while(true){
cout<<"扫雷F版的作者是Flintmall,"<<endl;
cout<<"这里有他想说的话。"<<endl;
cout<<endl;
cout<<"距离第一次开始开发扫雷类型的游戏,已经过去超过一年了。"<<endl;
cout<<"为什么我一直坚持做扫雷?"<<endl;
cout<<"扫雷是我童年在Windows自带游戏中唯一能玩懂的游戏,"<<endl;
cout<<"它策略,它有趣,它简单,它几近完美。"<<endl;
cout<<"而对扫雷的热爱,"<<endl;
cout<<"驱使着我做完了这个游戏。"<<endl;
cout<<"感谢你,也感谢所有游玩游戏的玩家。"<<endl;
cout<<"(按下Enter退出)"<<endl;
waitEnter();
break;
}
}
else{
cout<<"NULL 请重启游戏 NULL";
}
if(bomb == 0 && flag == 0){
cls();
cout<<" -======================-"<<endl;
cout<<" 你赢了!"<<endl;
cout<<" :D"<<endl;
cout<<" -======================-"<<endl;
for(int i = 0;i < 6;i++){
cout<<" ";
for(int j = 0;j < 8;j++){
if(j != 0 && i != 0){
if(black[i][j] == '1'){
setColor(3);
}
else if(black[i][j] == '2'){
setColor(2);
}
else if(black[i][j] == '3' || black[i][j] == '*'){
setColor(4);
}
else if(black[i][j] == '4'){
setColor(8);
}
else if(black[i][j] == '5'){
setColor(6);
}
else if(black[i][j] == '6'){
setColor(14);
}
else if(black[i][j] == '7'){
setColor(1);
}
else if(black[i][j] == '8'){
setColor(15);
}
else{
setColor(8);
}
cout<<black[i][j]<<" ";
}
else{
setColor(15);
cout<<white[i][j]<<" ";
}
setColor(15);
}
cout<<endl;
}
wintimes++;
cout<<"输入a再来一局新游戏,输入t退出游戏。"<<endl;
char againOrNot;
cin>>againOrNot;
if(againOrNot == 'a'){
click = 0;
generate();
}
else{
break;
return 0;
}
}
cls();
}
cout<<"游戏结束!";
system("pause");
return 0;
}